[ZLG-ARM] 请大家帮我看看这ucosii+lpc213x 第二个任务怎么不执行阿

[复制链接]
3164|7
 楼主| wlrt 发表于 2007-12-4 13:46 | 显示全部楼层 |阅读模式
&nbsp;&nbsp;我是&nbsp;用周工lpc213x模板,<br /><br />#include&nbsp;&quot;config.h&quot;<br />#include&nbsp;&quot;stdlib.h&quot;<br /><br />#define&nbsp;&nbsp;&nbsp;&nbsp;TaskStkLengh&nbsp;&nbsp;&nbsp;&nbsp;128&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Define&nbsp;the&nbsp;Task0&nbsp;stack&nbsp;length&nbsp;定义用户任务0的堆栈长度<br />&nbsp;<br />OS_STK&nbsp;&nbsp;&nbsp;&nbsp;TaskStk&nbsp;[TaskStkLengh];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Define&nbsp;the&nbsp;Task0&nbsp;stack&nbsp;定义用户任务0的堆栈<br />OS_STK&nbsp;&nbsp;Taskdisp_1&nbsp;[TaskStkLengh];<br />OS_STK&nbsp;&nbsp;Taskdisp_2&nbsp;[TaskStkLengh];<br /><br />void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Task0(void&nbsp;*pdata);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//声明Task0&nbsp;任务0<br />void&nbsp;&nbsp;&nbsp;&nbsp;Task1(void&nbsp;*pdata);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//声明Task0&nbsp;任务1<br />void&nbsp;&nbsp;&nbsp;&nbsp;Task2(void&nbsp;*pdata);<br />OS_EVENT&nbsp;*DispSem;<br />OS_EVENT&nbsp;*MsgBox;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;main&nbsp;(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;OSInit&nbsp;();&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;DispSem=OSSemCreate(2);&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;OSTaskCreate(Task0,(void&nbsp;*)0,&TaskStk[TaskStkLengh&nbsp;-&nbsp;1],&nbsp;2);&nbsp;&nbsp;&nbsp;&nbsp;OSStart&nbsp;();<br />&nbsp;&nbsp;&nbsp;&nbsp;return&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;Task0&nbsp;&nbsp;&nbsp;&nbsp;(void&nbsp;*pdata)<br />{&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;pdata&nbsp;=&nbsp;pdata;<br />&nbsp;&nbsp;&nbsp;&nbsp;TargetInit&nbsp;();<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;OSTaskCreate(Task1,(void&nbsp;*)0,&Taskdisp_1[TaskStkLengh-1],3);<br />&nbsp;OSTaskCreate(Task2,(void&nbsp;*)0,&Taskdisp_2[TaskStkLengh-1],4);<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSTimeDly(10);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />&nbsp;&nbsp;&nbsp;<br /><br />void&nbsp;Task1&nbsp;(void&nbsp;*pdata)<br />{&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;uint8&nbsp;err;<br />&nbsp;&nbsp;//volatile&nbsp;uint32&nbsp;data=1000000;<br />&nbsp;&nbsp;pdata&nbsp;=&nbsp;pdata;<br />&nbsp;&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;//OSSemPend(DispSem,0,&err);-------为什么&nbsp;这句如果注释掉任务2无法执行?????<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;disp_1();<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;OSTimeDly(10);<br />&nbsp;&nbsp;&nbsp;}<br />}<br /><br />&nbsp;<br />void&nbsp;Task2&nbsp;(void&nbsp;*pdata)<br />{&nbsp;uint8&nbsp;err;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;pdata=pdata;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;OSSemPend(DispSem,0,&err);<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;disp_2();<br />&nbsp;&nbsp;&nbsp;OSTimeDly(1);<br />&nbsp;&nbsp;&nbsp;}<br /><br />}<br /><br />好奇怪啊,本来的建立2个信号量,2个任务各获得一个(即文中注释的语句保留),两个任务正常切换,而若是把那句注释掉(即只让任务2等待信号量,任务1无条件执行)怎么任务2总是得不到信号量无法执行呢??<br />&nbsp;&nbsp;请大家帮忙指点一二。。。。<br /><br />&nbsp;&nbsp;&nbsp;<br />
zlgarm 发表于 2007-12-4 17:53 | 显示全部楼层

re

您的任务1申请了信号量如下<br />OSSemPend(DispSem,0,&err)<br />比知道您在这个任务里是否在别的地方释放了信号量!<br /><br />信号量需要成对使用,请求完了之后,当资源使用结束后,需要释放信号量!
 楼主| wlrt 发表于 2007-12-5 15:57 | 显示全部楼层

这和任务的优先级有没有关系呢?

这和任务的优先级有没有关系呢?<br /><br />程序并没有在其他地方释放信号量,仅仅在DispSem=OSSemCreate(2),中初始化信号计数器;&nbsp;另外&nbsp;我试过,若是在优先级低的任务调用err=OSSemPost(DispSem),&nbsp;在优先级高的任务里调用<br />OSSemPend(DispSem,0,&err)是可以运行的&nbsp;。但是反过来就不行了,消息邮箱也出现同种情况,我想请问一下,到底是不是这样呢?
lyl831015 发表于 2007-12-5 18:51 | 显示全部楼层

信号量的问题

和优先级没有关系。<br />当有一个任务申请到信号量后,信号量计数器值减1。你别的地方没有发送信号量,当任务使用2次信号量后(即信号量计数器值为0)任务便一直等待信号量了。
liujigan 发表于 2007-12-5 19:53 | 显示全部楼层

看了看

&nbsp;如果创建时把&nbsp;DispSem=OSSemCreate(1);<br />任务1中去掉那句......<br />任务2可以运运行吗?<br /><br /><br />如果可以,以后要吃多少,做多少,可别剩下了。
 楼主| wlrt 发表于 2007-12-6 09:17 | 显示全部楼层

还是不行啊

我试过了,改成DispSem=OSSemCreate(1);&nbsp;任务2还是无法执行,<br />我的理解也认为和优先级没有关系,可是程序并没有在任何地方请求信号量,只有在任务2&nbsp;中请求,为什么老是进不去呢?我碰到的问题总是那么怪呢?<br />另外还有个怪现象:把任务2中的OSSemPend(DispSem,0,&err);去掉,让任务2无条件执行,把任务1的OSSemPend(DispSem,0,&err);&nbsp;加上,创建函数还是没变DispSem=OSSemCreate(2);&nbsp;我认为执行的顺序是:TASK1---TASK2---TASK1--TASK2--(此时信号量用完TASK1无法再执行了)--TASK2--TASK2--TASK2--<br />可是结果却是:连续执行2次TASK1,然后再一直执行TASK2&nbsp;。<br />我又试了在TASK1中最后释放信号量err=OSSemPost(DispSem);结果是一直执行TASK1,TASK2又无法执行了&nbsp;。。。。<br />真搞不到懂是怎么回事。。。。。<br /><br />
 楼主| wlrt 发表于 2007-12-6 17:06 | 显示全部楼层

郁闷啊。。。。

郁闷啊。。。。<br />请大家帮忙啊。。。
jd9945 发表于 2007-12-13 14:28 | 显示全部楼层

会不会是任务一直在task0 与task1运行,如果任务1

disp_1();时间长于OSTimeDly(10);<br /><br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

20

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部