UCOSii-信号量

来源:互联网 发布:淘宝卖家快递推荐 编辑:程序博客网 时间:2024/05/22 18:22

信号量:二值信号量,计数信号量,互斥信号量

与信号量相关的几个函数:

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);
}
}

原创粉丝点击