楼主移植的uCOSII-STC8-V1.05版本范例中ISR程序存在着不规范性(也可以说是BUG),这是由于移植者没有按照uC/OS-II的规范编程产生的。 (1)作为uC/OS-II安全性的基础,uC/OS-II采用了“中断嵌套保护策略”,根据这个策略,在uC/OS-II程序中的每一个中断ISR中,都要在中断进入时调用“OSIntEnter()”函数,通知内核进入中断,然后在退出中断前调用“OSIntExit()”函数,通知内核退出中断。 在每次进入中断时执行“OSIntNesting++;”语句,每次退出中断时执行“OSIntNesting--;”,然后在“OSIntExit()”函数了进行判断,没有中断嵌套时才进行任务调度。 因此uC/OS-II的ISR编程规范为: VoidXXXX_ISR(void) { OSIntEnter(); … … OSIntExit(); } (2)下图是一个实际的按照uC/OS-II的ISR编程规范编写的汇编语言ISR程序: 这是一个定时器0系统中断和UART1串口中断的ISR,从中可以看到它们都严格地按照了规范进行编写。
(3)楼主在uCOSII-STC8-V1.05版本范例中ISR程序如下所示: 对比之下定时器3中断ISR缺少了第90行和第95行中断嵌套保护程序,使得范例程序不具有中断嵌套保护功能,失去了范例应该有的“模范”作用,反而变成了“误导”作用。
(4)因此楼主应该把缺少的两个语句补全如下:
|