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

15,FreeRTOS计数型信号量操作

  一、实验目标


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

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

 二、实验准备

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

2.STM3F407开发板

3.所需API函数介绍

        使用的API函数主要有计数型信号量动态创建函数、计数值获取函数。信号量释放函数、信号量获取函数与二值信号量的相同,可以在上一章查看。

14,FreeRTOS二值信号量操作-CSDN博客https://blog.csdn.net/LC_8575/article/details/151149446?spm=1011.2124.3001.6209

        计数型信号量动态创建函数xSemaphoreCreateCounting(),创建成功返回值为计数型信号量句柄。

#define xSemaphoreCreateCounting( uxMaxCount, uxInitialCount )    xQueueCreateCountingSemaphore( ( uxMaxCount ), ( uxInitialCount ) )

        计数型信号量计数值获取函数uxSemaphoreGetCount(),获取成功返回值为计数值。

#define uxSemaphoreGetCount( xSemaphore )                uxQueueMessagesWaiting( ( QueueHandle_t ) ( xSemaphore ) )

        4.信号量相关定义

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

#include "semphr.h"

        其次定义计数型信号量的句柄:

//计数型信号量定义
SemaphoreHandle_t Count_Semaphore_Handle;//定义计数型信号量句柄

 三、代码编写

3.1修改start_task的任务函数内容

        start_task实现计数型信号量创建、两个任务创建、start_task任务删除。

void start_task(void *pvParameters)
{taskENTER_CRITICAL();           /* 进入临界区 */Count_Semaphore_Handle = xSemaphoreCreateCounting(100,0);if(Count_Semaphore_Handle != NULL) printf("计数型信号量创建成功\r\n");/* 创建任务1 */xTaskCreate((TaskFunction_t )task1,(const char*    )"task1",(uint16_t       )TASK1_STK_SIZE,(void*          )NULL,(UBaseType_t    )TASK1_PRIO,(TaskHandle_t*  )&Task1Task_Handler);/* 创建任务2 */xTaskCreate((TaskFunction_t )task2,(const char*    )"task2",(uint16_t       )TASK2_STK_SIZE,(void*          )NULL,(UBaseType_t    )TASK2_PRIO,(TaskHandle_t*  )&Task2Task_Handler);vTaskDelete(StartTask_Handler); /* 删除开始任务 */taskEXIT_CRITICAL();            /* 退出临界区 */
}

3.2修改Task1的任务函数内容

        Task1实现按键key0按下,释放计数型信号量。

/* task1 按键key0按下释放信号量 */
void task1(void *pvParameters)
{uint8_t key = 0;while(1){key = key_scan(0);if(key == KEY0_PRES && Count_Semaphore_Handle != NULL){xSemaphoreGive(Count_Semaphore_Handle);//按键0按下释放信号量}vTaskDelay(10);//相对延时}
}

 3.3修改Task2的任务函数内容

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

/* task2 获取信号量,成功打印信息 */
void task2(void *pvParameters)
{BaseType_t err;while(1){err = xSemaphoreTake(Count_Semaphore_Handle,portMAX_DELAY);if(err != pdPASS){printf("计数型信号量获取失败\r\n");}else printf("计数型信号量获取成功,计数值数为:%d\r\n",(int)uxSemaphoreGetCount(Count_Semaphore_Handle));vTaskDelay(1000);//相对延时}
}

 四、实验现象

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


文章转载自:

http://RhPXKRBX.khxyx.cn
http://BSL7b2j3.khxyx.cn
http://NtuetzHD.khxyx.cn
http://beY80SIY.khxyx.cn
http://e5d1KN2M.khxyx.cn
http://55akxIZ5.khxyx.cn
http://UUwER8PN.khxyx.cn
http://chd9srAW.khxyx.cn
http://AldafzP6.khxyx.cn
http://s04NPI3m.khxyx.cn
http://uWsezMKn.khxyx.cn
http://s9FzlOL1.khxyx.cn
http://q0078Vbf.khxyx.cn
http://YuBsWqgg.khxyx.cn
http://REy2jEzX.khxyx.cn
http://7Lrgeg29.khxyx.cn
http://3KbtjAVT.khxyx.cn
http://xcB5W0Qu.khxyx.cn
http://KgaHATu6.khxyx.cn
http://GCUGbePD.khxyx.cn
http://zDmAvGsd.khxyx.cn
http://XYIPXrop.khxyx.cn
http://XZATcbXA.khxyx.cn
http://SbXE9uzI.khxyx.cn
http://kXlzYFn6.khxyx.cn
http://irBUlZtn.khxyx.cn
http://IpwBp9GN.khxyx.cn
http://ptzLWXGL.khxyx.cn
http://A8YnfQUj.khxyx.cn
http://Dx08K6ku.khxyx.cn
http://www.dtcms.com/a/366923.html

相关文章:

  • PMP新考纲练习题10道【附答案解析】
  • 开源技术助力企业腾飞,九识智能迈入‘数据驱动’新纪元
  • Docker(①安装)
  • [Windows] PDF工具箱 PDF24 Creator 11.28.0
  • 阿里云轻量应用服务器部署-WooCommerce
  • Java全栈开发面试实战:从基础到高并发的深度解析
  • 并非银弹,而是利器:对软件开发工具的深度探讨与理性思考
  • 使用 Sentry 为 PHP 和 Web 移动小程序提供多平台错误监控
  • 文心iRAG - 百度推出的检索增强的文生图技术,支持生成超真实图片
  • node的模块查找策略
  • HarmonyOS应用开发之界面列表不刷新问题Bug排查记:从现象到解决完整记录
  • 如何架设游戏服务器
  • 如何配置安全的 SFTP 服务器?
  • 【连载 1/9】大模型基础入门学习60页大模型应用:(一)绪论【附全文阅读】
  • Vue基础知识-脚手架开发-初始化目录解析
  • Java面试-HashMap原理
  • 开关电源——只需这三个阶段,从电源小白到维修大神
  • Pydantic模型验证测试:你的API数据真的安全吗?
  • Linux高手才知道的C++高性能I/O秘诀:Vector I/O与DMA深度解析
  • DRMOS电源
  • 经典资金安全案例分享:支付系统开发的血泪教训
  • 手机秒变全栈IDE:Claude Code UI的深度体验
  • Go 自建库的使用教程与测试
  • 生活在数字世界:一份人人都能看懂的网络安全生存指南
  • 【gemini】2.5 Flash费用估算
  • DirectX修复必备指南:解决DLL缺失与游戏崩溃的5种方法
  • 如何建立一套切实可行的绩效考核体系:参考这三个前提、五大步骤、三个案例
  • 火山引擎数据智能体DataAgent总结分享
  • 基于51单片机智能大棚浇花花盆浇水灌溉补光散热设计
  • 深度学习-----修改学习率来优化模型的几个方法