流程应该如下:
1.TaskStart这个任务创建
2.OSStartHighRdy();
在这个程序中,
LDR R4, =NVIC_INT_CTRL ;rigger the PendSV exception (causes context switch)
LDR R5, =NVIC_PENDSVSET
STR R5, [R4] 表示在中断开启的情况下,进入PendSV_Handler中断
CPSIE I 然后第一次打开中断,然后就进入了 PendSV_Handler 这个中断程序,而这个中断程序就是任务的切换程序。
这个时候, TaskStart 优先级最高(其它四个任务此时还没建立),开始运行 TaskStart 这个任务。
3. 在TaskStart中创建任务的时候, OS_ENTER_CRITICAL(); 将中断关闭,直到将4个任务创建完毕,OS_EXIT_CRITICAL();将中断打开
(注意,因为在进入OS_ENTER_CRITICAL()时,OSInterrputSum加1,当 OSInterrputSum为0时,才能彻底中断打开)
4.由于任务创建时,已经触发了PendSV_Handler发生中断的条件,只是因为中断未开而已。此时中断开,则进入 PendSV_Handler 中断 。然后
进入优先级最高的4个任务中的一个。比如执行TaskKey 这个任务。
5.当这个任务执行完,通过 OSTimeDlyHMSM() 进入等待状态,在OSTimeDlyHMSM()结尾处有 OS_Sched(); ,这个时候
再次进入PendSV_Handler中断,进入优先级第二高的任务....
6.在每次任务结束后,会进入最高优先级的任务,所以4个任务都会执行。而你的 TaskKey 只有到延时时间到了才会再次执行(当然它
优先级最高,当时间到了,则马上可以打断其它正在执行的任务
)。
楼主的问题我也遇到过。后来我就自己新建项目,慢慢 移植到我的板子上成功的。上面是我分析的流程,希望对你有帮助。
如果你还是解决不了,可以讲代码发上来,大家看看。
|