UCOS V2.86 对信号量的疑惑!
源程序#include <includes.h>
#defineTaskaStkLengh 256
#defineTaskbStkLengh 256
#defineTaskcStkLengh 256
OS_STKTaskaStk;
OS_STKTaskbStk;
OS_STKTaskcStk;
OS_EVENT * DispSem;
void Taska (void * pdata);
void Taskb (void * pdata);
void Taskc (void * pdata);
staticvoidApp_DispScr_SignOn (void);
int main (void)
{
BSP_IntDisAll(); /* Disable all ints until we are ready to accept them.*/
OSInit(); /* Initialize "uC/OS-II, The Real-Time Kernel". */
BSP_Init(); /* Initialize BSP functions.*/
App_DispScr_SignOn ();
printf("OS Init OK!\r\n");
OSTaskCreate (Taska,(void*)0,&TaskaStk,7) ;
OSTaskCreate (Taskb,(void*)0,&TaskbStk,8) ;
OSTaskCreate (Taskc,(void*)0,&TaskcStk,9) ;
OSTimeSet(0);
OS_CPU_SysTickInit(); /* Initialize the SysTick. */
OSStart(); /* Start multitasking (i.e. give control to uC/OS-II).*/
return 0;
}
void Taska (void * pdata)
{
INT8U err;
INT8Ui=0;
DispSem=OSSemCreate(1); //建立信号量
while(1)
{
OSSemPend(DispSem,0,&err);
i++;
if(i==100)i=0;
printf("\r\nTaska \r\n");
//OSTimeDly(500);
err=OSSemPost(DispSem);
}
}
void Taskb (void * pdata)
{
INT8U err;
INT8Ui=0;
while(1)
{
OSSemPend(DispSem,0,&err);
i++;
if(i==100)i=0;
printf("\r\n Taskb \r\n");
err=OSSemPost(DispSem);
//OSTimeDly(600);
}
}
void Taskc (void * pdata)
{
INT8U err;
INT8Ui=0;
while(1)
{
OSSemPend(DispSem,0,&err);
i++;
if(i==100)i=0;
printf("\r\n Taskc \r\n");
err=OSSemPost(DispSem);
//OSTimeDly(700);
}
}
程序的本意是让这个三任务交替执行.如果不注释掉延时可以达到交替执行的目的.但是注释掉打//地方的延时后程序只运行Taska .其它的任务都不会被执行.
难道 err=OSSemPost(DispSem); 后面或前面必需加 OSTimeDly(500);延时. 不是必须加
你先去内核看看OSSemPost(); 这个函数,然后理清你的程序中任务的运作和调度,你的问题就不是问题了 任务优先级不同,如果高优先级不调用类似Pend或者OSTimeDly之类的函数,低优先级是永远不能执行的。 二楼正解 信号量的初始化强烈建议在OSStart()函数调用前完成 楼主这个测试代码真够烂的
taska里先设置信号量为1
然后请求释放,就这么一直循环着玩
只要信号量有效
高优先级任务是永不阻塞的 任务优先级不同,如果高优先级不调用类似Pend或者OSTimeDly之类的函数,低优先级是永远不能执行的。
页:
[1]