我是靠谱客的博主 羞涩柠檬,最近开发中收集的这篇文章主要介绍stm32cubemx hal学习记录:FreeRTOS信号量一、信号量功能二、基本配置三、API四、代码总结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、信号量功能

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

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

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

二值信号量:同步。如果存在两个线程,为线程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

osSemaphoreDef(BinarySem01);
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 binaryn");

生成计数信号量:

osSemaphoreId myCountingSem01Handle;

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

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

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

 

计数信号量接收:

if(osSemaphoreWait(myCountingSem01Handle,osWaitForever)==osOK)
        printf("get countn");

最后

以上就是羞涩柠檬为你收集整理的stm32cubemx hal学习记录:FreeRTOS信号量一、信号量功能二、基本配置三、API四、代码总结的全部内容,希望文章能够帮你解决stm32cubemx hal学习记录:FreeRTOS信号量一、信号量功能二、基本配置三、API四、代码总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部