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