原创 ucos下信号量的建立使用注意事项

2010-6-27 10:37 2290 2 2 分类: MCU/ 嵌入式

ucos下信号量的建立使用注意事项



信号量的使用非常简单,他好像就是一把钥匙,那个任务得到他哪个任务才能执行,使用步骤也很简单,


首先要定义信号量指针:


OS_EVENT *DispSem;     //定义信号量


第二步:建立信号量:


DispSem = OSSemCreate(1);


第三步:然后就是在各个相关任务里接收与释放。


以下是一个小例子:


********************************************************************************************************/


#include "config.h"


#include "stdlib.h"


#include "12864.h"


#include "18b20.h"


#define TaskStkLengh 64 // 定义用户任务0的堆栈长度


 


#define LED1 0X01


#define LED2 0x01  <<2


 


 


OS_STK TaskStk [TaskStkLengh];     // 定义用户任务0的堆栈


OS_STK TaskStk1 [TaskStkLengh]; // 定义用户任务1的堆栈


OS_STK TaskStk2 [TaskStkLengh]; // 定义用户任务2的堆栈



void  Task0(void *pdata); // Task0 任务0


void  Task1(void *pdata); // Task1 任务1


void  Task2(void *pdata); // Task2 任务2



OS_EVENT *DispSem;     //定义信号量



int main (void) 


{


OSInit ();


DispSem = OSSemCreate(1);


OSTaskCreate (Task0,(void *)0, &TaskStk[TaskStkLengh - 1], 2);


OSStart ();


return 0;


}


/*********************************************************************************************************


*                            Task0 任务0                     


********************************************************************************************************/


void Task0 (void *pdata)


{


pdata = pdata;


TargetInit ();


PINSEL0=PINSEL0&(~0x03); /* 设置为p0.1 p0.1GPIO */


IO0DIR=IO0DIR|LED1|LED2;


OSTaskCreate (Task2,(void *)0, &TaskStk2[TaskStkLengh - 1], 4);


OSTaskCreate (Task1,(void *)0, &TaskStk1[TaskStkLengh - 1], 5);


while (1)


{


OSTimeDly(10);


}


}


   


   


   


   


   /*********************************************************************************************************


*                            Task1 任务1              


********************************************************************************************************/


void Task1 (void *pdata)


{


uint8 err;


pdata = pdata;



lcd_init();


   


while (1)


{ clear();


OSSemPend(DispSem, 0, &err); //  等待信号量


IO0CLR =LED1;


OSTimeDly(OS_TICKS_PER_SEC/15); //延时200ms


IO0SET =LED1;


OSTimeDly(OS_TICKS_PER_SEC/15); //延时200ms


IO0CLR =LED1;


OSTimeDly(OS_TICKS_PER_SEC/15); //延时200ms


IO0SET =LED1;


OSTimeDly(OS_TICKS_PER_SEC/15); //延时200ms



err = OSSemPost(DispSem); // 发送信号量


OSTimeDly(10);



}


}


   


   


   


   


   


   /*********************************************************************************************************


*                            Task2 任务2                         


********************************************************************************************************/


void Task2 (void *pdata)


{


uint8 err;


pdata = pdata;



while (1)


{


OSSemPend(DispSem, 0, &err); //  等待信号量


IO0CLR =LED2;


OSTimeDly(OS_TICKS_PER_SEC/3); //延时200ms


IO0SET =LED2;


OSTimeDly(OS_TICKS_PER_SEC/3); //延时200ms


lcd_xianshi();


IO0CLR =LED2;


OSTimeDly(OS_TICKS_PER_SEC/3); //延时200ms


IO0SET =LED2;


OSTimeDly(OS_TICKS_PER_SEC/3); //延时200ms


err = OSSemPost(DispSem); // 发送信号量


OSTimeDly(OS_TICKS_PER_SEC/100); //延时200ms

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
2
关闭 站长推荐上一条 /4 下一条