我用的是LPC2294,移植程序在ZLG网站上下的uC/OS-II移植程序,下的程序里包含IRQ.inc,OS_CPU.H,OS_CPU_A.S,OS_CPU_C.C四个移植文件。我根据自己的板子写了启动程序和挂接到IRQ和SWI的一点接口,汇编接口还是用的ZLG的。时钟中断和IRQ中断如下:
void Timer0_Exception(void) { T0IR = 0x01; VICVectAddr = 0; OSTimeTick(); }
void CAN2_Rx_ISR(void) { REG_CANCMR(CAN2).REG= 0x04; // 释放接收寄存器,同时RBS位清零 VICVectAddr = 0x00U; // acknowledgeInterrupt __asm { MRS R0, CPSR BIC R0,R0,#NoInt MSR CPSR_c, R0 } LedFlash(Led2); CAN_WriteRxQ(CAN2); } IRQ中断是一个CAN的接收中断。
本来好像没问题,CAN帧都接收了,但是现在发现好像在任务中一直处于IRQ模式而不是USER模式,并且中断都是关闭的,用AXD调试器或者汇编打不开,好像是打开后单步运行马上又变成IRQ模式并且中断关闭。可能是由于时钟中断,单步执行后总是被时钟中断,但是我觉得退出时钟中断应该是USER模式吧?我现在比较迷茫,不太确定,可是我无论放断点在任务中哪个位置,全速执行到断点总是处于IRQ模式,中断是关闭的。
我感觉调试的情况好像是虽然中断最终进入了,CAN帧也接收了,但是进入的时候总是在某个OS_EXIT_CRITICAL();之后,必需要在某个OS_EXIT_CRITICAL();之后才会进入IRQ中断。而时钟中断是一直都在进行的,OS_TIMETICK里有OS_EXIT_CRITICAL();所以中断也基本都能得到进入。 不知道全速运行到任务中停下总是IRQ模式并且关着中断的是不是因为时钟中断的原因?还是这个移植的版本默认在IRQ模式运行?还是我自己写的接口或者时钟中断服务程序有问题,麻烦大家帮我看看,或者谁能给我发个在2200系列上调试通过中断嵌套的完整uC/OS-II移植程序,包括接口跟时钟中断服务程序,谢谢大家!我的邮箱是_pc_tk@163.com
|