Привет!
при отладке проекта (еэлвис nvcom02t он же мипс32) пытался понять почему я попадаю в обработчик прерываний во время инициализации, при наличии глобального запрета прерываний.
както внезапно для себя обнаружил, хотя все было как по половице - видно издалека, что прерывания разрешаются при переключении на новую нитку - все нитки создаются с разрешением прерываний, и в момент активации новой нитки срабатывает прерывание. (избавиться от переключения пока не представляется возможным - ибо оно может произвольно происходить при mutex_unlock)
об этом специально заботится вот этот вот код из runtime\mips\startup-mcstudio.S
mfc0 $k0, $C0_STATUS # Get STATUS
li $k1, -1 - ST_IE # Prepare bitmask
and $k0, $k1 # Clear IE bit
ori $k0, ST_EXL # Prevent interrupts until eret
lw $k1, (CONTEXT_STATUS * 4) ($sp) # K0 = saved status, only IE bit
andi $k1, ST_IE # Restore only IE bit
or $k0, $k1 # Add saved IE bit
mtc0 $k0, $C0_STATUS # put SR back
само обстоятельство что каждая нитка имеет свое состояние глобального разрешения прерываний меня смущает - на то оно глобальное, чтобы быть одним на всех. изменения глобального статуса при переключении нитки неявно влияет на все остальные нитки, таким образом получаем побочный эффект от переключения (прерывания могут засыпать и включаться совершенно неожиданно для окружающих ниток), который совершенно неочевиден и может ломать всю задуманную логику системы.
по сему спрашиваю всех заинтересованных, использует ли кто нибудь такой побочный эффект переключателя задач? нужен ли он кому? можно ли эту фичу можно смело переквалифицировать в баг?