FreeRTOS之队列集操作(实践)

    多个任务在在同一队列中传递的同一种数据类型,而队列集能够在任务之间传递不同的数据类型。

配置流程:(更详细流程参考正点原子的教程)

1、启用队列集将configUSE_QUEUE_SETA置1)

2、创建队列集

3、创建队列或信号量

4、往队列集添加队列或信号量

5、往队列发送信息及信号量

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "FreeRTOS.h"
#include "task.h"
#include "sys.h"
#include "semphr.h"
#include "queue.h"
/****************************************************
STM32F103C8T6单片机freertos移植实验
作者:KJX
时间:2023-12-22
*****************************************************/
//优先级
#define START_TASK_PRIO         1
//堆栈大小
#define START_STK_SIZE        128
//任务函数
void start_task(void * pvParameters);
//任务句柄
TaskHandle_t StartTask_Handler;//task1优先级
#define TASK1_TASK_PRIO      	3
//task1堆栈大小
#define TASK1_STK_SIZE        128
//task1函数声明
void task1_task(void * pvParameters);
//task1任务句柄
TaskHandle_t  Task1Task_Handler;//task2优先级
#define TASK2_TASK_PRIO      	2
//task2堆栈大小
#define TASK2_STK_SIZE        128
//task2函数声明
void task2_task(void * pvParameters);
//task2任务句柄
TaskHandle_t  Task2Task_Handler;//相关信号量
QueueSetHandle_t queueset_handle;
QueueHandle_t    queue_handle;
QueueHandle_t    semphr_handle;int main(void)
{NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);delay_init();uart_init(9600);LED_Init();LED0=0;	xTaskCreate((TaskFunction_t )  start_task,     //指向任务函数的指针,必须为第一个(char *   			) "start_task",   //任务名字(uint16_t 			) START_STK_SIZE, //任务堆栈大小,字为单位(void *         	) NULL, 		  //传递给任务函数的参数(UBaseType_t    	) START_TASK_PRIO,//任务优先级,数值大,则优先级大(TaskHandle_t * 	) &StartTask_Handler);//任务句柄(控制块)									vTaskStartScheduler();//开启任务调度							
}//开始任务
//返回值为pdPASS则创建任务成功void start_task(void * pvParameters)
{taskENTER_CRITICAL();//进入临界区,创建任务完成后,才开始执行优先级任务//队列集相关queueset_handle=xQueueCreateSet(2);//创建数列集,可存放2个队列if(queueset_handle!= NULL){printf("队列集创建成功!!\r\n");}queue_handle = xQueueCreate(1,sizeof(uint8_t));//创建队列semphr_handle = xSemaphoreCreateBinary();//创建二值信号量//加入队列集xQueueAddToSet(queue_handle,queueset_handle);xQueueAddToSet(semphr_handle,queueset_handle);//创建Task1xTaskCreate((TaskFunction_t ) task1_task,(char *   			) "task1_task",(uint16_t 			) TASK1_STK_SIZE,(void *         	) NULL,(UBaseType_t    	) TASK1_TASK_PRIO,(TaskHandle_t * 	) &Task1Task_Handler);//创建Task2xTaskCreate((TaskFunction_t ) task2_task,(char *   			) "task2_task",(uint16_t 			) TASK2_STK_SIZE,(void *         	) NULL,(UBaseType_t    	) TASK2_TASK_PRIO,(TaskHandle_t * 	) &Task2Task_Handler);vTaskDelete(StartTask_Handler);//删除开始任务,删除自身用NULLtaskEXIT_CRITICAL();//退出临界区
}//任务一,队列发送及信号量释放
void task1_task(void * pvParameters)
{    uint8_t key=1;BaseType_t err;	while(1){if(key==1){	    err=xQueueSend(queue_handle,&key,portMAX_DELAY);if(err==pdPASS){printf("往队列写入数据成功!!\r\n");	}		}else if(key==2){err=xSemaphoreGive(semphr_handle);if(err==pdPASS){printf("释放信号量成功!!\r\n");	}}vTaskDelay(10);}
}//任务二,获取队列信息
void task2_task(void * pvParameters)
{   QueueSetMemberHandle_t  member_handle;uint8_t key;while(1){member_handle = xQueueSelectFromSet(queueset_handle,portMAX_DELAY);if(member_handle == queue_handle){xQueueReceive(member_handle,&key,portMAX_DELAY);printf("获取的队列数据为:%d\r\n",key);}else if(member_handle==semphr_handle ){xSemaphoreTake(member_handle,portMAX_DELAY);printf("获取信号量成功!!\r\n");}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/293840.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(十七)Flask之大型项目目录结构示例【二扣蓝图】

大型项目目录结构: 问题引入: 在上篇文章讲蓝图的时候我给了一个demo项目,其中templates和static都各自只有一个,这就意味着所有app的模板和静态文件都放在了一起,如果项目比较大的话,这就非常乱&#xf…

学鸿蒙开发的过程,差点要了我的命!

我真的好想感慨一下,这个世界真的给计算机应届生留活路了吗? 看着周围的同学,打算搞前端、JAVA、C、C的,一个两个去跑去应聘。你以为是00后整治职场? 真相是主打一个卑微:现阶段以学习为主(工资…

劈窗算法反演地表温度

目录 摘要操作步骤提取热红外单波段提取NDVI同步像元分辨率与个数劈窗算法地表温度反演制图 摘要 主要使用HJ-2(环境减灾二号卫星)的IRS传感器的两个热红外波段,以及红波段与近红波段计算得到的NDVI,使用劈窗算法,得到…

MailChecker:一款功能强大的跨语言临时电子邮件安全检测库

关于MailChecker MailChecker是一款功能强大的跨语言临时电子邮件安全检测工具,该工具可以帮助广大研究人员快速对目标电子邮件进行安全检测和内容验证。该工具后端由一个包含了超过55000个的虚假电子邮件提供商的数据库驱动,当你需要使用电子邮件与你的…

安全运营之团队人员组织建议

安全运营是一个持续的过程,需要不断地评估风险、监测威胁、改进措施和更新策略,以确保组织的安全性和可靠性。由人员、数据、平台(工具)、流程的共同组合构成安全运营体系。 一、安全运营团队目标 图-安全运营团队目标 安全运营团…

混合精度训练(MAP)

一、介绍 使用精度低于32位浮点数的数字格式有很多好处。首先,它们需要更少的内存,可以训练和部署更大的神经网络。其次,它们需要更少的内存带宽,这加快了数据传输操作。第三,数学运算在降低精度的情况下运行得更快&a…

Games101作业4

1.recursive_bezier用以实现De Casteljau算法 cv::Point2f recursive_bezier(const std::vector<cv::Point2f> &control_points, float t) {// TODO: Implement de Casteljaus algorithm//return cv::Point2f();if (control_points.size() < 2){return control_…

深度学习美化图片,绝对可行,美化效果挺好 DPED

一、背景 要美化生成的图片的效果&#xff0c;找到一个 效果如下&#xff1a; 二、步骤 1、python3.6环境&#xff0c;TensorFlow 2.0.0 2、下载代码&#xff1a;https://github.com/aiff22/DPEDx 3、将要增强的照片放在以下目录中&#xff0c;没有就新建&#xff1a; dpe…

Web 开发与移动应用程序开发 – 哪一种适合您的业务?

目录 Web 开发&#xff1a;释放浏览器的力量 1. 可访问性和跨平台兼容性&#xff1a; 2. 成本效益&#xff1a; 3. 内容交付和搜索引擎优化&#xff1a; 4.即时更新&#xff1a; 持续的网络维护&#xff1a; 移动应用程序开发&#xff1a;针对设备功能定制体验 1.增强用户体验&…

DRF从入门到精通三(反序列化数据校验源码分析、断言Assert、DRF之请求、响应)

文章目录 一、反序列化数据校验源码分析二、断言Assert三、DRF之请求、响应Request类和Response类请求中的Request 能够解析前端传入的编码格式响应中的Response能够响应的编码格式 一、反序列化数据校验源码分析 反序列化数据校验&#xff0c;校验顺序为&#xff1a;先校验字段…

事件和事件源

事件监听 在JS当中写事件监听是这个函数&#xff0c;写了这个函数&#xff0c;前面是DOM对象&#xff0c;当由DOM树和CSSOM树形成的渲染树也有这个监听&#xff0c;这个函数可以添加到DOM树&#xff0c;最后渲染树也有。渲染树会渲染标签当标签发生该事件就会执行这个函数。这个…

只知道短视频和直播带货?抖店好像更适合我们普通人哦!项目介绍

我是王路飞。 说道带货&#xff0c;大多数人还是只知道抖音短视频和抖音直播带货。 毕竟&#xff0c;现在众多平台都在往电商方向发展&#xff0c;做电商的方式就是通过短视频和直播的形式带货。 但是&#xff0c;很明显不是所有人都能去做的&#xff0c;尤其是对我们这些普…