| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> STM32MP157资源扩展板驱动移植篇7:FreeRTOS 二值信号量 -> 正文阅读 |
|
[嵌入式]STM32MP157资源扩展板驱动移植篇7:FreeRTOS 二值信号量 |
写在前面: 本文章为《STM32MP157资源扩展板驱动移植篇》系列中的一篇,笔者使用的开发平台为华清远见FS-MP1A开发板(STM32MP157开发板)。资源扩展板是FS-MP1A开发板的扩展模块,主要包含了10余种助主流传感器、执行器件、总线控制器件,非常方便项目扩展用。可拓展开发智慧家庭、智能医疗、智能安防、工业控制、图像识别、环境检测等方向的10个左右综合项目,华清远见开发板也将配套提供所有项目的说明文档、实验源码、应用程序等资料。 针对FS-MP1A开发板,除了资源扩展板驱动移植篇外,还包括其他多系列教程,包括Cortex-A7开发篇、Cortex-M4开发篇、FreeRTOS篇、Linux应用开发篇、Linux系统移植篇、Linux驱动开发篇、硬件设计篇、人工智能机器视觉篇、Qt应用编程篇、Qt综合项目实战篇等。欢迎关注,更多stm32mp157开发教程及视频,可加技术交流Q群459754978,感谢关注。 FS-MP1A开发板详情介绍:https://item.taobao.com/item.htm?id=622457259672 1.资源扩展板介绍1.1硬件介绍1.2资源扩展板可开发项目2.FreeRTOS 二值信号量2.1二值信号量简介信号量实际上就是一个值,这个值被用来解决临界区问题以及实现进程在多处理器环境下的进程同步。 二值信号量通常用于互斥访问或同步,二值信号量和互斥信号量非常类似,但是还是有一些细微的差别,互斥信号量拥有优先级继承机制,二值信号量没有优先级继承。因此二值信号量更适合用于同步(任务与任务或任务与中断的同步), 2.2二值信号量函数2.2.1 创建信号量对于二值信号量,若想使用,必须先创建二值信号量,在新版FreeRTOS中,一般使用xSemaphoreCreateBinary()函数动态创建二值信号量。此函数是个宏,具体创建工程是由函数xQueueGenericCreate()完成。其函数原型如下: SemaphoreHandle_t xSemaphoreCreateBinary(void) 参数: 无 返回值: NULL:二值信号量创建失败 其他值:创建成功的二值信号量的句柄 2.2.2 释放信号量释放信号量的函数有两个,分别如下: 任务级信号量释放函数 xSemaphoreGive(),此函数是个宏,可以用于释放二值信号量、计数型信号量或互斥信号量,其函数原型如下: BaseType_t xSemaphoreGive(xSemaphore) 参数: xSemaphore:要释放的信号量句柄 返回值: PdPASS:释放信号量成功 PdQUEUE_FULL:释放信号量失败 中断级信号量释放函数 xSemaphoreGiveFromISR(),此函数也是个宏,只能用来释放二值信号量和计数型信号量,其函数原型如下: BaseType_t xSemaphoreGiveFromISR(SemaphoreHandle_t xSemaphore, BaseType_t* pxHigherPriorityTaskWoken) 参数: xSemaphore:要释放的信号量句柄 pxHigherPriorityTaskWoken:标记退出此函数以后是否进行任务切换 返回值: PdPASS:释放信号量成功 PdQUEUE_FULL:释放信号量失败 2.2.3 获取信号量获取信号量的函数也有两个,分别如下: 任务级信号量获取函数xSemaphoreTake(),此函数也是个宏,可以获取二值信号量、计数型信号量和互斥信号量,其函数原型如下: BaseType_t xSemaphoreTake(SemaphoreHandle_t xSemaphore, TickType_t xBlockTime) 参数: xSemaphore:要获取的信号量句柄 xBlockTime:阻塞时间 返回值: pdTRUE:获取信号量成功 pdFALSE:超时,获取信号量失败 中断级信号量获取函数 xSemaphoreTakeFromISR(),此函数也是个宏,只能获取二值信号量和计数型信号量,其函数原型如下: BaseType_t xSemaphoreTakeFromISR(SemaphoreHandle_t xSemaphore, BaseType_t* pxHigherPriorityTaskWoken) 参数: xSemaphore:要获取的信号量句柄 pxHigherPriorityTaskWoken:标记退出此函数以后是否进行任务切换 返回值: PdPASS:获取信号量成功 pdFALSE:获取信号量失败 2.3操作实验2.3.1实验设计二值信号量可以实现任务与任务之间或者任务与中断之间的同步,在本节实验中,通过按键中断来控制LED灯的亮灭来实现任务与中断之间的同步。 在本实验中,共创建了两个任务,其中一个任务每隔一秒让LED3电平翻转,来表示程序可以正常运行,另外一个任务根据中断中传来的指令来控制不同LED灯的亮灭。 当按键按下时,进入中断,在中断中同时同时释放二值信号量,任务StartTask02()会一直尝试获取二值信号量,当获取到信号量后就会根据中断中的指令进而控制不同的LED灯发生亮灭。 任务及其功能如下: StartDefaultTask():控制LED3闪烁,提示系统正在运行。 StartTask02():进行指令处理,根据接收的指令控制不同的LED灯。 2.3.2实验过程与分析首先,根据之前几章内容配置好KEY、UART4、LED灯,切换到中间件“Middleware”的“FREERTOS”,默认自动勾选给M4了,然后接口“Interface”选择“CMSIS_V2”。初次接触,下面的参数大部分默认即可,为了运行其它任务,这里需要切换到“Tasks and Queues”标签,可以看到默认有个“defaultTask”任务,我们再点击“Add”再新增一个任务,如所示。 随后生成初始化代码,会弹出Systick被FreeRTOS占用,建议HAL库时钟基准源换成其它。之后FreeRTOS实验默认为此配置。 上述为新建工程配置过程,可参考12.3.2章节进行导入已有工程,工程存放路径【华清远见-FS-MP1A开发资料\02-程序源码\ARM体系结构与接口技术\FreeRTOS\1_FS-MP1A-FreeRTOS】 生成代码后,找到“main.c”,结尾部分会有两个任务函数,分别是“StartDefaultTask()”和“StartTask02()”。两个任务宏观看同时、独立运行,互不干扰。在“StartDefaultTask()”实现LED3每隔一秒闪烁,在“StartTask02()”中实现根据不同的指令控制不同LED灯亮灭。 在本次实验中,释放信号量在中断中进行,每进行一次按键按下,就释放一次信号量。在StartTask02任务中循环检测信号量,当在中断中释放信号量以后,便可以获取到信号量,然后根据指令进行控制,按键1或按键2按下时,分别控制LED1或LED2点亮,按键3按下时,控制LED1和LED2熄灭。 |
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 23:46:42- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |