Столкнулся со следующей неувязкой. На время записи во флеш мне очень желательно запретить выполнение прерываний. Я даже догадался что для запрета прерываний нужно "всего лишь" установить биты I и F в регистре CPSR. Написал следующий код.
Код
INT_DISABLE_MASK EQU 0x000000C0
EXPORT disable_interrupts
EXPORT enable_interrupts
ARM
AREA FASTCODE, CODE
enable_interrupts
;Çàïèñàòü 0 â áèòû I è F ðåãèñòðà CPSR, ÷òîáû çàïðåòèòü ïðåðûâàíèÿ
mrs r0, cpsr
mvn r1, #INT_DISABLE_MASK
and r0, r0, r1
msr cpsr_c, r0
bx lr
disable_interrupts
;Çàïèñàòü 1 â áèòû I è F ðåãèñòðà CPSR, ÷òîáû çàïðåòèòü ïðåðûâàíèÿ
mrs r0, cpsr
orr r0, r0, #INT_DISABLE_MASK
msr cpsr_c, r0
bx lr
END
Но с помощью отладчика обнаружил, что он не работает, то есть значение регистра cpsr не меняется. Вызаваются эти функции в свою очередь из функции находящейся в рам и помеченной с помощью #pragma arm, то есть некорректный переход из АРМ в thumb не является причиной. Начал копать в чем же дело и наткнулся на вот такое
Цитата
In user mode, only the condition flags of the CPSR (CPSR_f) can be changed. In other modes, the entire CPSR can be changed.
То есть собственно правильно что код не работает.
Отсюда вопрос как же корректно запретить - установить разрешение прерываний IRQ и FIQ? Только как-то через AIC?
Сообщение отредактировал SpiritDance - Aug 21 2006, 09:18
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.