信号量的使用非常简单,他好像就是一把钥匙,那个任务得到他哪个任务才能执行,使用步骤也很简单,
首先要定义信号量指针:
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
文章评论(0条评论)
登录后参与讨论