UCOSIII信号量

信号量通常分为两种

二进制信号量
计数型信号量

二进制信号量
二进制信号量只能取0和1两个值

计数型信号量
计数型信号量的范围由OS_SEM_CTR决定。OS_SEM_CTR可以为8位,16位和32位

API函数

//创建
void OSSemCreate (OS_SEM *p_sem,
                  CPU_CHAR *p_name,
                  OS_SEM_CTR cnt,
                  OS_ERR *p_err);

//删除
OS_OBJ_QTY OSSemDel (OS_SEM *p_sem,
                     OS_OPT opt,
                     OS_ERR *p_err);

//等待-1
OS_SEM_CTR OSSemPend (OS_SEM *p_sem,
                      OS_TICK timeout,
                      OS_OPT opt,
                      CPU_TS *p_ts,
                      OS_ERR *p_err);

//取消等待
OS_OBJ_QTY OSSemPendAbort (OS_SEM *p_sem,
                           OS_OPT opt,
                           OS_ERR *p_err);

//释放+1
OS_SEM_CTR OSSemPost (OS_SEM *p_sem,
                      OS_OPT opt,
                      OS_ERR *p_err);


//设置值
void OSSemSet (OS_SEM *p_sem,
               OS_SEM_CTR cnt,
               OS_ERR *p_err);

应用举例

void start_task(void *p_arg)
{
    OS_CRITICAL_ENTER();    //进入临界区

    //创建一个信号量
    OSSemCreate ((OS_SEM*   )&MY_SEM,
                 (CPU_CHAR* )"MY_SEM",
                 (OS_SEM_CTR)1,     
                 (OS_ERR*   )&err);

    //创建TASK1任务
    OSTaskCreate((OS_TCB    * )&Task1_TaskTCB,      
                 (CPU_CHAR  * )"Task1 task",        
                 (OS_TASK_PTR )task1_task,          
                 (void      * )0,                   
                 (OS_PRIO     )TASK1_TASK_PRIO,     
                 (CPU_STK   * )&TASK1_TASK_STK[0],  
                 (CPU_STK_SIZE)TASK1_STK_SIZE/10,   
                 (CPU_STK_SIZE)TASK1_STK_SIZE,      
                 (OS_MSG_QTY  )0,                   
                 (OS_TICK     )0,                   
                 (void      * )0,                   
                 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
                 (OS_ERR    * )&err);           

    //创建TASK2任务
    OSTaskCreate((OS_TCB    * )&Task2_TaskTCB,      
                 (CPU_CHAR  * )"Task2 task",        
                 (OS_TASK_PTR )task2_task,          
                 (void      * )0,                   
                 (OS_PRIO     )TASK2_TASK_PRIO,     
                 (CPU_STK   * )&TASK2_TASK_STK[0],  
                 (CPU_STK_SIZE)TASK2_STK_SIZE/10,   
                 (CPU_STK_SIZE)TASK2_STK_SIZE,      
                 (OS_MSG_QTY  )0,                   
                 (OS_TICK     )0,                   
                 (void      * )0,                   
                 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
                 (OS_ERR    * )&err);                

    OS_CRITICAL_EXIT(); //退出临界区
}

//任务1的任务函数
void task1_task(void *p_arg)
{
    OS_ERR err;
    u8 task1_str[]="First task Running!";
    while(1)
    {
        printf("\r\n任务1:\r\n");
        OSSemPend(&MY_SEM,0,OS_OPT_PEND_BLOCKING,0,&err);   //请求信号量
        memcpy(share_resource,task1_str,sizeof(task1_str)); //向共享资源区拷贝数据
        printf("%s\r\n",share_resource);    //串口输出共享资源区数据   
        OSSemPost (&MY_SEM,OS_OPT_POST_1,&err);             //发送信号量
        OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err);   //延时1s
    }
}

//任务2的任务函数
void task2_task(void *p_arg)
{   
    OS_ERR err;
    u8 task2_str[]="Second task Running!";
    while(1)
    {
        printf("\r\n任务2:\r\n");
        OSSemPend(&MY_SEM,0,OS_OPT_PEND_BLOCKING,0,&err);   //请求信号量
        memcpy(share_resource,task2_str,sizeof(task2_str)); //向共享资源区拷贝数据
        printf("%s\r\n",share_resource);    //串口输出共享资源区数据       
        OSSemPost (&MY_SEM,OS_OPT_POST_1,&err);             //发送信号量
        OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err);   //延时1s
    }
}

实验现象
1

UCOSIII优先级反转:http://blog.csdn.net/zhangxuechao_/article/details/78912393

posted @   thomas_blog  阅读(411)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示