请看原文 http://fanwenjie.ok.blog.163.com/blog/static/1246632052011230817542/
文章把任务级任务调度、中断级任务调度说得很明白:一个是延时调度、一个是中断到来调度。
但是文章的结论有问题,就”ucos进入中断时真的需要通知系统吗?“方面。
通知系统:
void BSP_USART_422_IRQHandler (void) { #if (OS_CRITICAL_METHOD == 3) OS_CPU_SR cpu_sr; #endif OS_ENTER_CRITICAL(); /// Tell uC/OS-II that we are starting an ISR OSIntNesting++; OS_EXIT_CRITICAL(); ...... OSIntExit(); /// Tell uC/OS-II that we are leaving the ISR }
那么什么时候中断处理需要通知系统呢?
http://bbs.21ic.com/forum.php?mod=viewthread&tid=558744&pid=4894874&page=1&extra=#pid4894874
OSIntExit()会引发一次任务调度,但是中断里面如果没有PostEvent函数,也就是说中断退出不需要进行任务调度,可以省略掉这个操作。
举例来说吧,有一个task里面有pendevent函数,如pendsem,中断postsem,这时候osintexit进行任务调度,中断退出后这个task会立刻执行。但是你的中断没有任何postevent,搞osintexit任务调度是毫无意义的。
中断退出进行任务调度正是抢占式RTOS的精华所在,如果只在Systick里面进行任务调度那不就成了时间片OS?实时性没有了。 |