liuzhijun 发表于 2009-7-13 15:45:33

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);延时.

2nd090215 发表于 2009-7-13 18:27:11

不是必须加
你先去内核看看OSSemPost(); 这个函数,然后理清你的程序中任务的运作和调度,你的问题就不是问题了

aaa1982 发表于 2009-7-16 08:57:48

任务优先级不同,如果高优先级不调用类似Pend或者OSTimeDly之类的函数,低优先级是永远不能执行的。

0620223 发表于 2009-12-13 20:43:47

二楼正解

cyrobot 发表于 2009-12-14 22:45:41

信号量的初始化强烈建议在OSStart()函数调用前完成

ralfak 发表于 2009-12-14 23:15:28

楼主这个测试代码真够烂的
taska里先设置信号量为1
然后请求释放,就这么一直循环着玩
只要信号量有效
高优先级任务是永不阻塞的

Hz01800475 发表于 2012-12-31 11:01:16

任务优先级不同,如果高优先级不调用类似Pend或者OSTimeDly之类的函数,低优先级是永远不能执行的。
页: [1]
查看完整版本: UCOS V2.86 对信号量的疑惑!