月度归档:2018年04月

UCOS中PENDSV和SYSTICK中断优先级

PENDSV和SYSTICK属于系统异常,定时器中断,串口中断这些属于外部中断。PENDSV和SYSTICK的中断优先级可以编程,一般要把PENDSV的优先级设置成最低。在很多CM3内核芯片的UCOS-II移植例子中,PENDSV和SYSTICK的优先级都设置成OxFF.都是最低优先级,因为PENDSV在中断向量表中排在SYSTICK前面,所以如果PENDSV,SYSTICK同时产生中断,PENDSV优先中断。

在UCOS中,如果产生中断嵌套,在退出最后一个中断时,OSIntExit()函数调用OSIntCtxSw()函数执行任务切换。在OSIntCtxSw()函数中,悬起PENDSV,然后在PENDSV中断函数中进行任务切换。

在PENDSV中断中,首先会关闭总中断,执行完任务切换后才开启总中断,避免PENDSV中断被其它中断打断,产生不可预料的结果。

SYSTICK的中断处理函数主要是调用函数OSTimeTick ()来完成系统在每个时钟节拍需要完成的工作,调用OSTimeTick()做了两件事情:一是把用来记录时间进程的计数器OSTime加1;二是遍历任务控制块链表中的所有任务控制块,把各个任务控制块中用来存放任务延时时限的OSTCBDly变量减1,并使该项为0,同时又不是被挂起的任务(即延时时间已到的任务)进入就绪状态。SYSTICK的中断优先级比PENDSV高还是低并没有什么影响。