zoukankan      html  css  js  c++  java
  • μ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

  • 相关阅读:
    C++调用Java的Jar包(带参数)
    SOA创建Form表单
    vs2013 IntelliSense: "const char *" 类型的实参与 "LPCWSTR" 类型的形参不兼容
    idea无法正常使用SVN的解决方法
    关于C语言中print输出问题
    TC怎么在代码中实现选中一个TCCcomponent对象?
    Unity 1.0 中文文档:1 Unity 简介
    Unity(四):使用场景Ⅰ:建立类型映射
    这个世界上没有白干的活
    Unity(三):快速入门
  • 原文地址:https://www.cnblogs.com/wenhao-Web/p/13797624.html
Copyright © 2011-2022 走看看