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