|
一个很简单的程序,两个任务,Task0实现流水灯左向右摆动,Task1实现流水灯右向左摆动。任务Task0实现完后向Task1发送消息1,通知其可以运行;任务Task1运行完后向Task0发送消息2,通知其可以运行;如此反复,实现流水灯左右摆动。程序运行后,没啥反映,请各位帮忙分析。
int Main(int argc, char **argv)
{
//初始化目标板
TargetInit();
//初始化uCOS-II
OSInit ();
//初始化系统时基
OSTimeSet(0);
SemBox=OSMboxCreate(2);
//创建系统初始任务
OSTaskCreate (MainTask,(void *)0, &MainTaskStk[MainTaskStkLengh - 1], MainTaskPrio);
//开始任务
OSStart ();
return 0;
}
//-----------------------------------------------------------------------------------------------------------------------------------
void MainTask(void *pdata) //Main Task create taks0 and task1
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
OS_ENTER_CRITICAL();
Timer0Init(); //initial timer0 for ucos time tick
ISRInit(); //initial interrupt prio or enable or disable
OS_EXIT_CRITICAL();
OSPrintfInit(); //use task to print massage to Uart
OSStatInit();
OSTaskCreate (Task0,(void *)0, &Task0Stk[Task0StkLengh - 1], Task0Prio);
OSTaskCreate (Task1,(void *)0, &Task1Stk[Task1StkLengh - 1], Task1Prio);
while(1)
{
OSMboxPost(SemBox,(void *)2); //发送消息2开始运行Task0
OSTaskSuspend(MainTaskPrio); //当前任务挂起
OSTimeDly(1000);
}
}
//----------------------------------------------------------------------------------------------------------------------------------
void Task0(void *pdata) //任务0
{
for(;;)
{
pmsg=OSMboxPend(SemBox,1,&err);
if(*pmsg==2) //如果接收到邮箱消息2可以运行
LED_Horse(0,10);
OSMboxPost(SemBox,(void *)1);
}
}
//----------------------------------------------------------------------------------------------------------------------------------
void Task1(void *pdata) //任务1
{
for(;;)
{
pmsg=OSMboxPend(SemBox,1,&err);
if(*pmsg==1) //如果接收到邮箱消息1可以运行
LED_Horse(1,10);
OSMboxPost(SemBox,(void *)2);
}
}
这个程序也可以用信号量实现,但为了学习邮箱的用法,所以就用邮箱实现。另外,后面还可加更多的任务从而实现更多的流水灯效果。
是不是我对邮箱的理解有误呢? |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|