|
发表于 2011-11-11 10:17:03
|
显示全部楼层
对于Cortex-M3,uCOS的任务切换是由pendsv中断实现的,而pendsv中断的优先级最低,
所以即使”中断2执行末尾发生了任务切换“,真正的任务切换也不会发生,只是触发了pendsv中断了而已,
只有中断1执行完后,pendsv中断才会执行,因为pendsv的中断优先级最低。
下面是uCOS,Cortex-M3任务切换的代码:
OSCtxSw
LDR R0, =NVIC_INT_CTRL ; Trigger the PendSV exception (causes context switch)
LDR R1, =NVIC_PENDSVSET
STR R1, [R0]
BX LR
OSCtxSw只是触发pendsv中断而已,真正的任务切换在pendsv中断服务程序中,而且pendsv中断的优先级在OSStartHighRdy中被设置为
最低,如OSStartHighRdy:
OSStartHighRdy
LDR R0, =NVIC_SYSPRI14 ; Set the PendSV exception priority
LDR R1, =NVIC_PENDSV_PRI
STRB R1, [R0]
feng200808 分析得比较透彻,即使嵌套由于有PENDSV这种保护机制,也不会出问题,其实发生任务切换是在最后一个中断执行完后,并且中断打开的情况下才发生的 |
|