1 OSTimeIick()是在OSTIickISR()中被调用的。 ps: 关于“自身中断的问题”本论坛中有详细的介绍。自身中断是不能嵌套的.可以认为同一中断源是同一优先级,则不能打断前一中断响应,等前一中断响应完成后再响应后一次中断请求.我以前认为OSTickISR()会自己发生嵌套。 ps:当然也可实现自身的嵌套服务。如下所示: ISR:PUSH Next的地址 acall int_ret ;PUSH Next的地址,这个地方做了手脚。才保证了自嵌套。 Next:
;做你要作的事
int_ret: RETI;实际就是跳转到Next去运行,并且把中断标志清了RET
搞定。
2 这里设置临界段是因为要访问全局资源TCB,而while循环的测试条件(1)里面也包含了对TCB优先级的读取,那为什么临界段没有包括while循环判断? 临界资源,不可被修改。看循环里面的内容,ostcbdly ostcbstat ostcbnext 都是不能被其他任务(Isr)修改的。 3 既为什么没有包括整个while循环呢? ostimetick的任务 让延时的程序计时。时间到然后就绪。判断时间到的条件 if (--ptcb->OSTCBDly == 0) 。可是如果在这个期间,有某个任务 要求自身删除。如问题:如果循环条件(1)刚测试完,被高优先级的任务抢占了,并且删除了测试过的TCB对应的任务,那再次进入到(2)(3)执行程序访问TCB的时候不是越权访问了?? 4 因为”如果循环条件(1)刚测试完,被高优先级的任务抢占了“这就是为什么临界段没有包括while循环判断,如果包含了while循环判断,那么哪有时间让高高优先级的任务抢占cpu? 5 “并且删除了测试过的TCB对应的任务,那再次进入到(2)(3)执行程序访问TCB的时候不是越权访问了??” 为了防止这种越权访问,作者在条件上做了工作。如果删除任务,会做一下工作: 其他的工作略了,有些条件就是防止在ostimetick中越权的。 设置任务状态 OS_STAT_RDY OSTCBDLY = 0 这样再次进入到(2)时就退出了。 注意tcb还存在,存储空间没有删除,只是里面的内容改变了,使他永远不满足再次就绪的条件,那这个任务就”删除了“
|