Цитата(yuri_t @ Mar 27 2007, 16:55)

В статье на сайте ARM описывается ситуация, когда флаг запрета прерывания
находится в процессе выставления, а прерывание произошло.
Тот факт, что процессор обрабатывает IRQ после завершения инструкции MSR,
которая запрещает IRQ, в TNKernel не вызывает проблем, т.к. любое прерывание,
Тут нашелся такой проблемс - tn_switch_context() всегда разрешает прерывания в задаче на которую происходит переключение
Код
tn_switch_context:
...
tn_sw_restore:
...
mrs r4, CPSR
bic r4, r4, #NOINT <- здеся собака и порылася :)
msr CPSR_c, r4
ldmfd sp!, {r0-r12,lr,pc}
Если бы не было "атмеловского" патча, то был бы возможен такой сценарий:
- некоторая задача хочет запретить прерывания
- вызывает tn_save_cpu_sr()
- выполняется инструкция msr CPSR_c,R0
- сразу после нее происходит прерывание
- при выходе из прерывания происходит переключение на другую задачу (типовой случай - на высокоприоритетную таймерную задачу)
- более приоритетная задача делает свои дела и "отходит от дел" по tn_switch_context() - типично для таймерной задачи
- итого - исходная задача, которая запрещала прерывания выполняется теперь с разрешенными, поскольку tn_switch_context() вбросил ее после вытеснения по прерыванию
"Атмеловский" патч сам по себе надежен, но увеличивает время с запрещенными прерываниями

, было бы неплохо от него избавиться