Разработка, производство и продажа радиоэлектронной аппаратуры
|
Требуется программист в Зеленограде - обработка данных с датчиков; ColdFire; 40 тыс.
e-mail: jobsmp@pochta.ru
|
Народ, подскажите, можно ли реализовать вложенные прерывания (nested interr...{+}(+)
Отправлено
mayn 06 февраля 2008 г. 02:45
Текст заголовка сообщения полностью: Народ, подскажите, можно ли реализовать вложенные прерывания (nested interrupts) без написания процедур на ассмблере и макросов IENABLE/IDISABLE? (+)
Проблема следующая.
У меня ARM микроконтроллер (LPC2148), среда uVision3, компилятор RealView.
Нужно реализовать 2 прерывания, одно из которых (хотя бы) может прерывать процедуру прерывания другого (nested interrupts). Предлагается писать процедуры ISR на ассемблере (очень не хочется) или использовать макросы
/* routines from KEIL */
#define IENABLE \
__asm { MRS LR, SPSR } \
__asm { STMFD SP!, {LR} } \
__asm { MSR CPSR_c, #0x1F } \
__asm { STMFD R15!, {LR} } \
#define IDISABLE \
__asm { LDMFD SP!, {LR} } \
__asm { MSR CPSR_c, #0x92 } \
__asm { LDMFD SP!, {LR} } \
__asm { MSR SPSR_cxsf, LR } \
Но в компиляторе RealView (который только и прилагается в evaluation version с сайта Keil) такие ассемблерные вставки не работают (identifier "LR" is undefined и т.п.)
На форуме с сайта Keil пишут вскользь, что этими макросами пользоваться нельзя и, типа, надо писать процедуру на ассемблере. Хочется быть уверенным в этом, при том, что кто-то видел и другие, извращенные макросы, но они тоже не работали (здесь вообще не понимаю, что за хрень):
/* routines from NXP */
static uint32 sysreg; /* used as LR register */
#define IENABLE __asm \
{ MRS sysreg, SPSR; MSR CPSR_c, #SYS32Mode; STMFD SP!, {sysreg} }
#define IDISABLE __asm \
{ MSR CPSR_c, #(IRQ32Mode|I_Bit); MSR SPSR_cxsf, sysreg }
Составить ответ | Вернуться на конференцию
Ответы