• μC/OS-II系统中互斥信号量的使用


    以下内容主要注重应用,对源码不做分析,对源码有兴趣的可参考官方具体文档,相关链接:https://doc.micrium.com/display/ucos/

    开发环境:TrueSTUDIO

    单片机:STM32F103VET6(HAL库)

    一、创建一个互斥信号量,OSMutexCreate()

      一个互斥信号量使用前需要被创建,通过调用OSMutexCreate()来创建互斥信号量。互斥信号量的初始值总是设置为1,表示资源可用。函数原型为:

      1、OS_EVENT *OSMutexCreate (INT8U prio, INT8U *err)

    • prio是指互斥信号量的优先级(即当一个任务获取该互斥信号量后,任务的优先级会临时变成该互斥信号量的优先级,因为互斥信号量的优先级和任务的优先级属于同一类,通常建议该互斥信号量的优先级高于所有任务优先级);
    • err是存放错误类型;
    • 返回与互斥信号量相关联的指向事件控制块的指针。

    二、获取互斥信号量,OSMutexPend()

      获取互斥信号量,函数原型为:

      1、void OSMutexPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)。

    • pevent是互斥信号量相关联的指向事件控制块的指针;
    • timeout等待时长(如果是0将一直等下去,直到有可用的互斥信号量);
    • err保存错误类型。

    三、释放互斥信号量,OSMutexPost()

      释放获取的互斥信号量,函数原型为:

      1、INT8U OSMutexPost (OS_EVENT *pevent)。

    • pevent是互斥信号量相关联的指向事件控制块的指针;
    • 返回值是错误类型。

    四、使用注意事项

      1、互斥信号量只能在任务中使用;

      2、互斥信号量创建完成就有资源可用,与信号量创建需指定可用的资源数目不同;

      3、互斥信号量的优先级和任务优先级属于同一类,在不支持同级任务优先级的操作系统中尤其要注意;

      4、当一个任务获取到一个互斥信号量后会把优先级暂时变成互斥信号量的优先级,释放互斥信号量的时候恢复。

    五、示例代码

      1、定义一个互斥信号量事件指针:

    /* 定义一个互斥信号量事件指针 */
    OS_EVENT *MutexSemp;

       2、创建互斥信号量,并设置互斥信号量的优先级

    /* 创建互斥信号量,指定优先级为2 */
    MutexSemp = OSMutexCreate(2, &err);

      3、在两个任务中分别使用同一个互斥信号量:

    static void AppTaskLed1(void *p_arg)
    {
        INT8U err;
    
        (void)p_arg;
    
        while(1)
        {
            /* 获取互斥信号量 */
            OSMutexPend(MutexSemp, 0, &err);
    
            HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);
            /* 释放互斥信号量 */
            OSMutexPost(MutexSemp);
    
            OSTimeDlyHMSM(0, 0, 1, 0);
        }
    }
    
    static void AppTaskLed2(void *p_arg)
    {
        INT8U err;
    
        (void)p_arg;
    
        while(1)
        {
            /* 获取互斥信号量 */
            OSMutexPend(MutexSemp, 0, &err);
    
            HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5);
            /* 释放互斥信号量 */
            OSMutexPost(MutexSemp);
    
            OSTimeDlyHMSM(0, 0, 2, 0);
        }
    }

    #endif

  • 相关阅读:
    selenium 常见操作,使用 pywin32库 进行上传操作
    selenium 常见操作,使用 js 操作-日期框及文本框
    selenium 常见操作,js操作-将元素滚动到页面可见区域
    selenium 常见操作,使用 Keys 类来进行键盘的按键操作
    oracle性能诊断sql
    浏览器是如何处理页面元素的Download?
    websphere启动报:Could not resolve placeholder 'hibernate.hbm2ddl.auto' in string value "${hibernate.hbm2ddl.auto}"
    websphere部署不能发布war文件,提示“配置库中已存在应用程序
    websphere gc策略调整
    oracle表结构表数据导入导出
  • 原文地址:https://www.cnblogs.com/wenhao-Web/p/13797624.html
Copyright © 2020-2023  润新知