信号量:二值信号量,计数信号量,互斥信号量
与信号量相关的几个函数:
1)创建信号量
OS_EVENT *OSCreateSem(INT16U cnt);
返回值为已创建好的信号量指针,参数cnt是信号量计数器的初始值,该初始值一般情况下为0
2)请求信号量
void OSSemPend(OS_EVENT *pevent,INT16U timeout,INT8U *err);
pevent是被请求信号量的指针,timeout为等待时限,为0的话就是无限等待,err为错误信息
3)发送信号量函数
INT8U OSSemPost(OS_EVENT *pevent);
pevent为信号量指针,该函数成功调用后,返回值为OS_ON_ERR
4)删除信号量函数
OS_EVENT *OSSemDel(OS_EVENT *pevent,INT16U timeout,INT8U *err);
pevent是被请求信号量的指针,timeout为等待时限,为0的话就是无限等待,err为错误信息
//´´½¨¿ªÊ¼ÈÎÎñ,ÔÚ¿ªÊ¼ÈÎÎñÀïÃæ´´½¨ÁËÁ½¸öÈÎÎñ
void startTask(void *p_arg)
{
OS_CPU_SR cpu_sr=0;
p_arg = p_arg;
Sem = OSSemCreate((INT16U)0);
OS_ENTER_CRITICAL();
OSTaskCreate(key_task, (void*)0, (OS_STK*)KEY_TASK_STK[KEY_STK_SIZE - 1], KEY_TASK_PRIO);
OSTaskCreate(key_task, (void*)0, (OS_STK*)KEY_TASK_STK[KEY_STK_SIZE - 1], KEY_TASK_PRIO);
OSTaskSuspend(START_TASK_PRIO);
OS_EXIT_CRITICAL();
}
//
void key_task(void *p_arg)
{
u8 key;
p_arg = p_arg;
while(1)
{
key = KEY_Scan(0);
if(key == WKUP_PRES)
{
OSSemPost(Sem); //·¢ËÍÐźÅÁ¿
}
OSTimeDlyHMSM(0, 0, 0, 10);
}
}
//
void led_task(void *p_arg)
{
INT8U err;
p_arg = p_arg;
while(1)
{
OSSemPend(Sem, 0 , &err);//ÇëÇóÐźÅÁ¿
LED1 = ~LED1;
OSTimeDlyHMSM(0, 0, 1, 0);
}
}