FreeRtos-07信号量

本文详细介绍了FreeRTOS信号量的理论知识,包括使用、原理及内部实现机制,强调了信号量作为计数值不能用于数据传递。通过实例展示了如何使用信号量实现任务同步和互斥,特别提到了volatile关键字在并发编程中的作用。最后,给出了具体的代码示例。

一、信号量的理论讲解

1.1 FreeRTOS信号量的使用、原理及内部实现机制

 1.1 细节知识点

  • 使用.uxMessagesWaiting来保存我们的计数值

  •  Give时不用阻塞,Take时需要考虑阻塞与唤醒
  •  信号量发送的是计数值,不能用来发送
### STM32F103C8T6 标准库 FreeRTOS 信号量 使用教程 FreeRTOS 提供了多种机制来实现任务间的同步和资源保护,其中信号量是一种常用的方式。信号量分为计数型信号量(Counting Semaphore)、二值信号量(Binary Semaphore)以及互斥信号量(Mutex)。以下是关于如何在 STM32F103C8T6 的标准库中使用 FreeRTOS 信号量的详细介绍。 #### 创建信号量 通过 `xSemaphoreCreateBinary()` 或者 `xSemaphoreCreateCounting()` 函数可以创建不同类型的信号量。对于互斥信号量,则可以通过 `xSemaphoreCreateMutex()` 来创建[^1]。 ```c // 创建一个二值信号量 SemaphoreHandle_t xBinarySemaphore; xBinarySemaphore = xSemaphoreCreateBinary(); if (xBinarySemaphore != NULL) { // 初始化成功 } else { // 初始化失败处理逻辑 } // 创建一个计数型信号量,最大计数值为5,初始值为0 SemaphoreHandle_t xCountingSemaphore; xCountingSemaphore = xSemaphoreCreateCounting(5, 0); if (xCountingSemaphore != NULL) { // 初始化成功 } else { // 初始化失败处理逻辑 } ``` #### 获取信号量 当某个任务需要访问受信号量保护的共享资源时,它会尝试获取该信号量。如果信号量不可用,则任务会被阻塞直到超时或信号量可用为止。 ```c void vTaskA(void *pvParameters) { while (1) { if (xSemaphoreTake(xBinarySemaphore, pdMS_TO_TICKS(100)) == pdTRUE) { // 成功获取信号量,执行临界区代码 printf("Task A acquired the semaphore.\n"); // 执行一些操作... // 释放信号量 xSemaphoreGive(xBinarySemaphore); } else { // 超时未获得信号量 printf("Task A failed to acquire the semaphore.\n"); } vTaskDelay(pdMS_TO_TICKS(500)); // 延迟一段时间再试 } } ``` #### 发布信号量 另一个任务完成某些工作后可能会发布信号量以通知其他等待的任务继续执行。 ```c void vTaskB(void *pvParameters) { while (1) { // 模拟某种条件满足后再发布信号量 vTaskDelay(pdMS_TO_TICKS(200)); if (xSemaphoreGive(xBinarySemaphore) == pdPASS) { printf("Task B released the semaphore.\n"); } else { printf("Failed to release the semaphore from Task B.\n"); } } } ``` #### 错误处理与注意事项 - 如果多个任务竞争同一个信号量,在设计时需考虑优先级反转问题,可通过配置优先级继承功能解决。 - 需要合理设置任务堆栈大小以免因溢出而导致系统崩溃。 - 对于硬件外设的操作建议采用互斥信号量而非简单的二值信号量,这样能更好地防止竞态条件发生[^3]。 ### 示例总结 上述例子展示了两个独立运行的任务间利用 FreeRTOS 中的信号量来进行基本通信的过程。实际应用可能更加复杂,涉及更多种类的数据交换形式及错误恢复策略等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程者也

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值