• stm32cubemx hal学习记录:FreeRTOS信号量


    一、信号量功能

    信号量&互斥量:创建、获取、释放、删除

    信号量用于同步,任务间或者任务和中断间同步

    互斥量用户互锁,用于保护同时只能有一个任务访问的资源,为资源上一把锁。

    二值信号量:同步。如果存在两个线程,为线程1和线程2,如果线程1发送了信号量,线程2接收到了信号量,这两个线程同步工作,如果线程1没有发送信号量,那么线程2也就不工作(前提线程2中有信号量接收等待函数)。相当于一个标志位。

    计数信号量:资源使用统计

    互斥量:互斥信号是一个拥有优先级继承的二值信号量

    递归互斥:互斥中嵌套互斥

    优先级反转,由于高优先级任务在等低优先级任务释放信号量的过程中,低优先级被中优先级任务抢夺CPU,最终导致中优先级的任务比高优先级的任务先运行,也就是优先级翻转,而互斥信号量就可以将这个影响降到最低,当高优先级任务发现需要信号量被低级信号量占用需要等待时,就将低优先级任务变成和自己同级优先级,就不至于在等待的过程中被中优先级抢占CPU。

    二、基本配置

    1、配置RCC、USART1、时钟84M

    2、配置SYS,将Timebase Source修改为除滴答定时器外的其他定时器。

    3、初始化LED的两个引脚、两个按键引脚

    4、开启FreeRTOS,v1与v2版本不同,一般选用v1即可

    5、创建二值信号量Binary Semaphore

    Semaphore Name: 信号量名称

    Allocation: 分配方式  Dynamic 动态内存创建

    Conrol Block Name: 控制块名称

    如果想要创建计数信号量Counting Semaphore,必须在 Config parameters 中进行使能。

     Semaphore Name: 信号量名称

    Count: 计数信号量的最大值

    Allocation: 分配方式:Dynamic 动态内存创建

    Conrol Block Name: 控制块名称

    6、创建两个任务,一个接收任务,一个发送任务

    7、生成代码

    三、API

    1、创建一个二值量、并返回一个ID:osSemaphoreCreate

    1. osSemaphoreDef(BinarySem01);
    2. BinarySem01Handle = osSemaphoreCreate(osSemaphore(BinarySem01), 1);

    2、删除一个信号量:osSemaphoreDelete

    包括二值信号量,计数信号量,互斥量和递归互斥量。如果有任务阻塞在该信号量上,那么不要删除信号量

    osSemaphoreDelete(BinarySem01Handle);

    3、释放信号量的宏:osSemaphoreRelease

    释放的对象必须是已经创建的,可以用于二值信号量、计数信号量、互斥量的释放,但不能释放由函数xSemaphoreCreateRecursiveMutex() 创建的互斥量。

    osSemaphoreRelease(BinarySem01Handle);

    4、获取信号量:osSemaphoreWait

    用于获取信号量,不带中断保护。获取的信号量对象可以是二值信号量、计数信号量和互斥量,但是递归互斥量并不能使用这个API函数获取。

    int32_t osSemaphoreWait (osSemaphoreId semaphore_id, uint32_t millisec)

    四、代码总结

    生成二值信号量:

    osSemaphoreId myBinarySem01Handle;

    osSemaphoreDef(myBinarySem01);
    myBinarySem01Handle = osSemaphoreCreate(osSemaphore(myBinarySem01), 1);

    二值信号量产生:

    osSemaphoreRelease(myBinarySem01Handle);

    二值信号量接收:

    if(osSemaphoreWait(myBinarySem01Handle,osWaitForever)==osOK)
          printf("get binary\n");

    生成计数信号量:

    osSemaphoreId myCountingSem01Handle;

    osSemaphoreDef(myCountingSem01);
    myCountingSem01Handle = osSemaphoreCreate(osSemaphore(myCountingSem01), 10);

    释放计数信号量并统计当前的数值:

    if(osSemaphoreRelease(myCountingSem01Handle)==osOK){
        int count=osSemaphoreGetCount(myCountingSem01Handle);
        printf("%d\n",count);}

     

    计数信号量接收:

    if(osSemaphoreWait(myCountingSem01Handle,osWaitForever)==osOK)
            printf("get count\n");

  • 相关阅读:
    Doris从理论详解到千万级数据量场景使用
    如何去云服务器申请环境跑深度学习模型
    qtdesigner添加菜单栏工具栏及监听事件
    VCAST创建单元测试工程
    Django笔记九之model查询filter、exclude、annotate、order_by
    JAVA基础(十四)
    用Unity重现《空洞骑士》的苦痛之路(1)——人物控制篇
    批量替换WordPress文章内图片链接
    迅为IMX8M开发板2gst-inspect-1.0测试
    工程材料知识点总结(全)
  • 原文地址:https://blog.csdn.net/ohhjack/article/details/127966302