Цитата(klesin @ Mar 12 2006, 17:19)

Сравнивал свой текст с тем что был предложен. Все сходится. Единственное отличие в отключении прерываний (ну не знаю я как написать процедуру на asm в MULTI, а IARом не хочу пользоваться). Вместо AT91F_disable_interrupt() я просто сбрасывал биты разрешения IRQ и FIQ на С. Скорее всего в этом и есть проблема.
AT91F_enable_interrupt и AT91F_disable_interrupt написаны на ассемблере в файле *.s
В С они подключаются через extern
extern void AT91F_enable_interrupt(void);
extern void AT91F_disable_interrupt(void);
#define IRQ_MASK 0x00000080
#define FIQ_MASK 0x00000040
#define INTs_MASK (IRQ_MASK | FIQ_MASK)
;---------------------------------------------------
; \fn extern void AT91F_enable_interrupt(void)
; \brief Enable Core interrupt
;---------------------------------------------------
PUBLIC AT91F_enable_interrupt
CODE32 ; Always ARM mode after exeption
AT91F_enable_interrupt
mrs r0, CPSR
bic r0, r0, #INTs_MASK
msr CPSR_c, r0
bx lr
;---------------------------------------------------
; \fn extern void AT91F_disable_interrupt(void)
; \brief Disable Core interrupt
;---------------------------------------------------
PUBLIC AT91F_disable_interrupt
CODE32 ; Always ARM mode after exeption
AT91F_disable_interrupt
mrs r0, CPSR
orr r0, r0, #INTs_MASK
msr CPSR_c, r0
mrs r0, CPSR
ands r0, r0, #INTs_MASK
beq AT91F_disable_interrupt
bx lr