当前位置: 首页 > news >正文

14,FreeRTOS二值信号量操作

   一、实验目标


创建三个动态任务,栈空间大小均为128字。startTask、Task1、Task2。startTask仅运行一次,负责二值信号量的创建,task1、task2任务的创建,startTask任务的删除。Task1负责二值信号量的释放操作。Task2负责二值信号量的获取操作,并用串口发送是否获取成功。

注:本实验基于正点原子FreeRTOS教程的学习总结。

 二、实验准备

1.FreeRTOS的Keil动态任务创建与删除程序

2.STM3F407开发板

3.所需API函数介绍

        使用的API函数主要有二值信号量动态创建函数、信号量释放函数、信号量获取函数。

        二值信号量动态创建函数xSemaphoreCreateBinary(),创建成果返回值为二值信号量句柄。

    #define xSemaphoreCreateBinary()    xQueueGenericCreate( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE )

        信号量释放函数xSemaphoreGive(),输入值为信号量句柄,释放成功返回pdTRUE。

#define xSemaphoreGive( xSemaphore )    xQueueGenericSend( ( QueueHandle_t ) ( xSemaphore ), NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK )

        信号量获取函数xSemaphoreTake(),输入值为信号量句柄,阻塞时间。获取成功返回pdPASS。

#define xSemaphoreTake( xSemaphore, xBlockTime )    xQueueSemaphoreTake( ( xSemaphore ), ( xBlockTime ) )

4.信号量相关定义

        首先在freertos_demo.c中添加头文件:

#include "semphr.h"

        其次定义二值信号量的句柄:

//二值信号量定义
SemaphoreHandle_t xBinarySemaphore;//定义二值信号量句柄

 三、代码编写

3.1修改Task1的任务函数内容

        Task1实现按键key0按下,释放二值信号量。

/* task1 按键key0按下释放二值信号量 */
void task1(void *pvParameters)
{uint8_t key = 0;BaseType_t err = 0;while(1){key = key_scan(0);if(key == KEY0_PRES && xBinarySemaphore != NULL){err = xSemaphoreGive(xBinarySemaphore);if(err != pdPASS){printf("xBinarySemaphore二值信号量释放失败\r\n");}elseprintf("xBinarySemaphore二值信号量释放成功\r\n");}vTaskDelay(10);//相对延时}
}

 3.2修改Task2的任务函数内容

        Task2实现信号量的获取,并串口发送。

/* task2 获取信号量,成功打印信息 */
void task2(void *pvParameters)
{BaseType_t err;uint8_t i = 0;while(1){err = xSemaphoreTake(xBinarySemaphore,portMAX_DELAY);if(err != pdPASS){printf("xBinarySemaphore二值信号量获取失败\r\n");}else printf("xBinarySemaphore二值信号量获取成功,次数:%d\r\n",++i);}
}

 四、实验现象

        实验现象如下所示。可以看到系统初始化显示二值信号量创建成功。按下key0释放信号量,获取成功后发送信息。


文章转载自:

http://fK5ENLc0.mrLLs.cn
http://0VUUeG0V.mrLLs.cn
http://CuT2oEb8.mrLLs.cn
http://fpwuYx5K.mrLLs.cn
http://8vtLk4ua.mrLLs.cn
http://Rv0nI5uu.mrLLs.cn
http://NMkDHst3.mrLLs.cn
http://ShiAuKp2.mrLLs.cn
http://alAb0auX.mrLLs.cn
http://hRa4MX2K.mrLLs.cn
http://ggFj4qtD.mrLLs.cn
http://BCp5HvUN.mrLLs.cn
http://IpxwCG96.mrLLs.cn
http://IKtHLi9u.mrLLs.cn
http://5mp8ts6B.mrLLs.cn
http://u1EBlG50.mrLLs.cn
http://wS0jmXUs.mrLLs.cn
http://o9qny9b1.mrLLs.cn
http://X4LWpT0G.mrLLs.cn
http://uqLB5jAf.mrLLs.cn
http://g0b6ug7x.mrLLs.cn
http://pt9r2ci6.mrLLs.cn
http://k65kwWxp.mrLLs.cn
http://Q00gwH9A.mrLLs.cn
http://iKi6kFN6.mrLLs.cn
http://uvEfg1EK.mrLLs.cn
http://D7FY6H9g.mrLLs.cn
http://dsMjdc4M.mrLLs.cn
http://AgcLaq72.mrLLs.cn
http://8WDA31TC.mrLLs.cn
http://www.dtcms.com/a/365407.html

相关文章:

  • 差分隐私在运营指标:ABP 的 DP 计数器与噪声预算
  • 一文读懂RAG:从生活场景到核心逻辑,AI“查资料答题”原来这么简单
  • Wan2.2AllInOne - Wan2.2极速视频生成模型,4步极速生成 ComfyUI工作流 一键整合包下载
  • Java全栈学习笔记29
  • 关于牙科、挂号、医生类小程序或管理系统项目 项目包含微信小程序和pc端两部分
  • 从一次Crash分析Chromium/360浏览器的悬空指针检测机制:raw_ref与BackupRefPtr揭秘
  • 如何修复“您的连接不是私密连接”警告?
  • sentinel实现控制台与nacos数据双向绑定
  • Android音频学习(十六)——CreateTrack
  • 深度学习——CNN实例手写数字
  • 涉私数据安全与可控匿名化利用机制研究(下)
  • Triton Linalg - WrapFuncBodyWithSingleBlockPass
  • 软件设计师备考-(十) 多媒体基础
  • 两个子进程之间使用命名pipe
  • 如何构建企业级RAG知识库?实战方法、关键细节与平台选型
  • 并发编程——14 线程池参数动态化
  • PyTorch 损失函数与优化器全面指南:从理论到实践
  • 归一化的定义与作用
  • IO进程线程;进程,发送信号;进程,消息队列通信;0903
  • 消息传递模型实现
  • 阿里开源首个图像生成基础模型——Qwen-Image本地部署教程,中文渲染能力刷新SOTA
  • AI 生成内容(AIGC)版权归属引争议:创作者、平台、AI 公司,谁该拥有 “作品权”?
  • 弧焊工业机器人保护气节约的关键
  • Windows/Linux下vscode+vcpkg管理C++包链接方法
  • 相关性分析与常用相关系数
  • React学习教程,从入门到精通, React 组件语法知识点(9)
  • 记一次VMware虚拟机(BC-linux)网络配置过程
  • LVGL9.3 vscode 模拟环境搭建
  • 【医疗行业案例】基于 React 的预约系统:DHTMLX 助力高效排班与预约管理
  • kafka Partition(分区)详解