[ZLG-ARM] 请问关于UCOS的问题,谢谢!

[复制链接]
2255|2
 楼主| pbb1982 发表于 2007-6-28 18:58 | 显示全部楼层 |阅读模式
ST, os, PDA, Box, pd
我创建了4个任务:优先级依次递减<br />任务1输出4个任务所用堆栈大小,只能被任务4唤起;<br />任务2用一个信号量控制任务3使之延时1秒;&nbsp;<br />任务3利用邮箱给任务4传送消息并等待任务4回信;<br />任务4收到任务3的消息输出到串口并给任务3回信,唤起任务1。<br /><br />不加任务2和信号量时,程序是好用的,加上之后串口没有输出了。<br />请问操作系统是怎么调度的?非常感谢!!!<br />程序如下:<br /><br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TaskStkLengh&nbsp;&nbsp;&nbsp;&nbsp;500&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />OS_STK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Task1Stk&nbsp;[TaskStkLengh];&nbsp;&nbsp;&nbsp;&nbsp;<br />OS_STK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Task2Stk&nbsp;[TaskStkLengh];&nbsp;&nbsp;&nbsp;&nbsp;<br />OS_STK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Task3Stk&nbsp;[TaskStkLengh];<br />OS_STK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Task4Stk&nbsp;[TaskStkLengh];<br />void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Task1(void&nbsp;*pdata);<br />void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Task2(void&nbsp;*pdata);<br />void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Task3(void&nbsp;*pdata);<br />void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Task4(void&nbsp;*pdata);<br />OS_EVENT&nbsp;*ackmbox;<br />OS_EVENT&nbsp;*txmbox;&nbsp;&nbsp;&nbsp;&nbsp;<br />OS_EVENT&nbsp;*key;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />void&nbsp;&nbsp;UART0_Init(void)<br />{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint16&nbsp;Fdiv;<br />&nbsp;&nbsp;&nbsp;&nbsp;U0LCR&nbsp;=&nbsp;0x83;&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 />&nbsp;&nbsp;&nbsp;&nbsp;Fdiv&nbsp;=&nbsp;(Fpclk&nbsp;/&nbsp;16)&nbsp;/115200;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;U0DLM&nbsp;=&nbsp;Fdiv&nbsp;/&nbsp;256;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;U0DLL&nbsp;=&nbsp;Fdiv&nbsp;%&nbsp;256;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;U0LCR&nbsp;=&nbsp;0x03;<br />}<br />void&nbsp;&nbsp;UART0_SendByte(uint8&nbsp;data)<br />{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;U0THR&nbsp;=&nbsp;data;&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 />&nbsp;&nbsp;&nbsp;&nbsp;while(&nbsp;(U0LSR&0x40)==0&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br />void&nbsp;&nbsp;UART0_SendStr(uint8&nbsp;*str)<br />{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;*str&nbsp;==&nbsp;'\0'&nbsp;)&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART0_SendByte(*str++);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />int&nbsp;main&nbsp;(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;OSInit&nbsp;();<br />&nbsp;&nbsp;&nbsp;&nbsp;OSTaskCreateExt&nbsp;(Task1,(void&nbsp;*)0,&Task1Stk[TaskStkLengh-1],3,1,&Task1Stk[0],TaskStkLengh,(void&nbsp;*)0,OS_TASK_OPT_STK_CHK);&nbsp;&nbsp;&nbsp;&nbsp;<br />&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 />void&nbsp;Task1(void&nbsp;*pdata)&nbsp;&nbsp;&nbsp;//&nbsp;优先级3<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;OS_STK_DATA&nbsp;data;<br />&nbsp;&nbsp;&nbsp;&nbsp;INT8U&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;s[10];<br />&nbsp;&nbsp;&nbsp;&nbsp;pdata&nbsp;=&nbsp;pdata;<br />&nbsp;&nbsp;&nbsp;&nbsp;TargetInit&nbsp;();<br />&nbsp;&nbsp;&nbsp;&nbsp;PINSEL0&nbsp;=&nbsp;0x00000005;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;UART0_Init&nbsp;();<br />&nbsp;&nbsp;&nbsp;&nbsp;OSTaskCreateExt&nbsp;(Task2,(void&nbsp;*)0,&Task2Stk[TaskStkLengh-1],4,2,&Task2Stk[0],TaskStkLengh,(void&nbsp;*)0,OS_TASK_OPT_STK_CHK);<br />&nbsp;&nbsp;&nbsp;&nbsp;OSTaskCreateExt&nbsp;(Task3,(void&nbsp;*)0,&Task3Stk[TaskStkLengh-1],5,3,&Task3Stk[0],TaskStkLengh,(void&nbsp;*)0,OS_TASK_OPT_STK_CHK);&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;OSTaskCreateExt&nbsp;(Task4,(void&nbsp;*)0,&Task4Stk[TaskStkLengh-1],6,4,&Task4Stk[0],TaskStkLengh,(void&nbsp;*)0,OS_TASK_OPT_STK_CHK);<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSTaskSuspend(OS_PRIO_SELF);&nbsp;&nbsp;//&nbsp;无条件挂起任务本身<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=3;i&lt7;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSTaskStkChk(i,&data);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(s,&quot;%6d,&quot;,data.OSUsed);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART0_SendStr((uint8&nbsp;*)s);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />void&nbsp;Task2&nbsp;(void&nbsp;*pdata)&nbsp;&nbsp;//&nbsp;优先级4<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;key&nbsp;=&nbsp;OSSemCreate(1);&nbsp;&nbsp;//创建一个信号量<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSTimeDlyHMSM(0,0,1,0);&nbsp;//延时1秒<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSSemPost(key);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//释放信号量<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />}<br />void&nbsp;Task3&nbsp;(void&nbsp;*pdata)&nbsp;&nbsp;&nbsp;//&nbsp;优先级5<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;txmsg&nbsp;=&nbsp;'A';<br />&nbsp;&nbsp;&nbsp;&nbsp;INT8U&nbsp;err;<br />&nbsp;&nbsp;&nbsp;&nbsp;pdata&nbsp;=&nbsp;pdata;<br />&nbsp;&nbsp;&nbsp;&nbsp;ackmbox&nbsp;=&nbsp;OSMboxCreate((void*)0);<br />&nbsp;&nbsp;&nbsp;&nbsp;txmbox&nbsp;&nbsp;=&nbsp;OSMboxCreate((void*)0);<br />&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSSemPend(key,0,&err);&nbsp;&nbsp;&nbsp;&nbsp;//等待信号量&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSMboxPost(txmbox,(void&nbsp;*)&txmsg);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSMboxPend(ackmbox,0,&err);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(err==OS_NO_ERR)<br />&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;txmsg++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(txmsg&nbsp;==&nbsp;'Z')<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txmsg&nbsp;=&nbsp;'A';<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />void&nbsp;Task4(void&nbsp;*pdata)&nbsp;&nbsp;&nbsp;//&nbsp;优先级6<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;*rcmsg;<br />&nbsp;&nbsp;&nbsp;&nbsp;INT8U&nbsp;err;<br />&nbsp;&nbsp;&nbsp;&nbsp;pdata&nbsp;=&nbsp;pdata;<br />&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rcmsg&nbsp;=&nbsp;(uint8*)OSMboxPend(txmbox,0,&err);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(err==OS_NO_ERR)<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;&nbsp;&nbsp;&nbsp;UART0_SendStr(rcmsg);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSTaskResume(3);&nbsp;&nbsp;&nbsp;//&nbsp;唤起任务Task1()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSMboxPost(ackmbox,(void*)1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />
liujigan 发表于 2007-6-29 09:49 | 显示全部楼层

I think

用OSSemCreat(1)创建的信号量为二值信号量,在一个任务中请求、释放应该成对出现。
jiangxitao 发表于 2007-7-5 11:37 | 显示全部楼层

学习

期待中
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

5

帖子

0

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