afterqcd 发表于 2008-9-22 12:21

求助:uC/OSII 代码中 进入临界段时机的疑问(跟循环相关)

下面是时钟节拍函数的源码<br /><br />void&nbsp;&nbsp;OSTimeTick&nbsp;(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;OS_TCB&nbsp;&nbsp;&nbsp;&nbsp;*ptcb;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;OSTimeTickHook();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Call&nbsp;user&nbsp;definable&nbsp;hook&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;...<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(OSRunning&nbsp;==&nbsp;TRUE)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptcb&nbsp;=&nbsp;OSTCBList;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Point&nbsp;at&nbsp;first&nbsp;TCB&nbsp;in&nbsp;TCB&nbsp;list&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(ptcb-&gtOSTCBPrio&nbsp;!=&nbsp;OS_IDLE_PRIO)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Go&nbsp;through&nbsp;all&nbsp;TCBs&nbsp;in&nbsp;TCB&nbsp;list&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OS_ENTER_CRITICAL();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(2)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ptcb-&gtOSTCBDly&nbsp;!=&nbsp;0)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Delayed&nbsp;or&nbsp;waiting&nbsp;for&nbsp;event&nbsp;with&nbsp;TO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(--ptcb-&gtOSTCBDly&nbsp;==&nbsp;0)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Decrement&nbsp;nbr&nbsp;of&nbsp;ticks&nbsp;to&nbsp;end&nbsp;of&nbsp;delay&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((ptcb-&gtOSTCBStat&nbsp;&&nbsp;OS_STAT_SUSPEND)&nbsp;==&nbsp;OS_STAT_RDY)&nbsp;{&nbsp;/*&nbsp;Is&nbsp;task&nbsp;suspended?&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSRdyGrp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|=&nbsp;ptcb-&gtOSTCBBitY;&nbsp;/*&nbsp;No,&nbsp;&nbsp;Make&nbsp;task&nbsp;R-to-R&nbsp;(timed&nbsp;out)*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSRdyTbl&nbsp;|=&nbsp;ptcb-&gtOSTCBBitX;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Yes,&nbsp;Leave&nbsp;1&nbsp;tick&nbsp;to&nbsp;prevent&nbsp;...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptcb-&gtOSTCBDly&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;...&nbsp;loosing&nbsp;the&nbsp;task&nbsp;when&nbsp;the&nbsp;...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;...&nbsp;suspension&nbsp;is&nbsp;removed.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptcb&nbsp;=&nbsp;ptcb-&gtOSTCBNext;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Point&nbsp;at&nbsp;next&nbsp;TCB&nbsp;in&nbsp;TCB&nbsp;list&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OS_EXIT_CRITICAL();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(3)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(4)<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />这里(1)(4)是循环体,循环处理每个TCB(除了OSTaskIdle),(2)(3)是进出临界段<br /><br />我的疑问就是&nbsp;这里设置临界段是因为要访问全局资源TCB,而while循环的测试条件(1)里面也包含了对TCB优先级的读取,那为什么临界段没有包括while循环判断?既为什么没有包括整个while循环呢?如果是出于对关中断时间的长短的考虑,是不是在功能上出错了呢?<br /><br />不知道,请大虾指点

古代C人 发表于 2008-9-22 18:15

如下:

出于对关中断时间的长短的考虑

afterqcd 发表于 2008-9-23 17:01

功能上要出问题的嘛

如果循环条件(1)刚测试完,被高优先级的任务抢占了,并且删除了测试过的TCB对应的任务,那再次进入到(2)(3)执行程序访问TCB的时候不是越权访问了

John_Lee 发表于 2008-9-23 20:38

没有问题

抢占是不会改变OSTCBList链表的。

Swd21ic 发表于 2008-9-23 22:15

RE

我觉得放到while()外面貌似很好啊..<br /><br />只需要关一次..不用每一个去开和关..反倒节约了时间

xcsjava 发表于 2008-10-5 12:47

参考一下。

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