ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
21 июля
42280 Топик полностью
Jean Labrosse (24.10.2005 17:15, просмотров: 1) ответил JeDay на Проблема с обработчиком прерывания в uCOS-II. При посылке *Post() из ISR ОС виснет.
Во первых, желательно обработку между OSIntEnter и OSIntExit оформить ОТДЕЛЬНОЙ функцией, которая вызывается из обработчика прерывания. Во вторых, регистры следует все же сохранять ;) и желательно писать обработчик на ASMе, который будет вызывать функцию на C. RSEG CSTACK:DATA:NOROOT(0) RSEG RSTACK:DATA:NOROOT(0) #include <os_cpu_i.s90> EXTERN OSIntExit EXTERN OSIntNesting EXTERN OSTCBCur EXTERN My_ISR_Handler PUBLIC My_ISR RSEG CODE:CODE:NOROOT(1) My_ISR: PUSH_ALL ; Save all registers and status register IN R16,SREG ; Save the SREG but with interrupts enabled SBR R16,BIT07 ST -Y,R16 PUSH_SP ; Save the task's hardware stack pointer onto task's stack LDS R16,OSIntNesting ; Notify uC/OS-II of ISR INC R16 ; STS OSIntNesting,R16 ; CPI R16,1 ; if (OSIntNesting == 1) { BRNE My_ISR_1 LDS R30,OSTCBCur ; OSTCBCur->OSTCBStkPtr = Y LDS R31,OSTCBCur+1 ST Z+,R28 ST Z+,R29 ; } My_ISR_1: CALL My_ISR_Handler ; Call tick ISR Handler written in C CALL OSIntExit ; Notify uC/OS-II about end of ISR POP_SP ; Restore the hardware stack pointer from task's stack POP_SREG_INT POP_ALL ; Restore all registers RETI END В вопросе не указан компилятор -- подразумеваем IAR.