UCOSii-信号量

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值