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.