нити против прерываний

27 views
Skip to first unread message

Александр Литягин

unread,
Apr 25, 2016, 6:15:18 AM4/25/16
to uOS embedded
Привет!
при отладке проекта (еэлвис 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

само обстоятельство что каждая нитка имеет свое состояние глобального разрешения прерываний меня смущает - на то оно глобальное, чтобы быть одним на всех. изменения глобального статуса при переключении нитки неявно влияет на все остальные нитки, таким образом получаем побочный эффект от переключения (прерывания могут засыпать и включаться совершенно неожиданно для окружающих ниток), который совершенно неочевиден и может ломать всю задуманную логику системы.
по сему спрашиваю всех заинтересованных, использует ли кто нибудь такой побочный эффект переключателя задач? нужен ли он  кому? можно ли эту фичу можно смело переквалифицировать в баг?

Александр Литягин

unread,
Apr 25, 2016, 8:31:36 AM4/25/16
to uOS embedded
вопрос снялся. оказалось проще заморозить переключение, а контроль глобальных прерываний - неисправим.

понедельник, 25 апреля 2016 г., 13:15:18 UTC+3 пользователь Александр Литягин написал:
Reply all
Reply to author
Forward
0 new messages