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

FreeRTOS(9):队列的入队与出队

实验现象

实验步骤:

实验现象,在串口助手上观察现象:

项目创建

复制Freertos_列表项的插入与删除文件,粘贴并且重命名为Freertos_队列的入队与出队,进入keil,删除Timer.c 中的中断函数中的内容和函数头上队列句柄删除,如不删除,会发生报错,删除内容如下图所示:

进入FreeRTOS_Task.c文件,首先删除task1与task2中的代码,然后因为此次实验需要三个任务,创建task3,笔者就不多赘述了,随后定义需要的队列头,大数据队列等,如下图所示:

定义好这些后就可以去到FreeRTOS_Task任务中初始化队列了,初始化的同时将队列的创建结果使用串口打印出来,下方是FreeRTOS_Task的代码:

void FreeRTOS_Task(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); Key_Init(); LED_Init(); Serial_Init(); key_queue = xQueueCreate(2, sizeof(uint8_t)); Serial_Sendstring(key_queue ? "key_queue create successful\r\n" : "key_queue create failed\r\n"); big_data_queue = xQueueCreate(1, sizeof(char *)); Serial_Sendstring(big_data_queue ? "big_data_queue create successful\r\n" : "big_data_queue create failed\r\n"); xTaskCreate((TaskFunction_t)Start_task, "Start_task", START_TASK_SIZE, NULL, START_TASK_PRIO, &start_task_handle); vTaskStartScheduler(); }

注意,start_task中要有三个任务的创建函数,分别是task1,2,3,start_task任务的完整函数如下方所示:

void Start_task(void *pvParameters) { taskENTER_CRITICAL(); xTaskCreate((TaskFunction_t)task_1, "task_1", TASK1_SIZE, NULL, TASK1_PRIO, &task1_handle); xTaskCreate((TaskFunction_t)task_2, "task_2", TASK2_SIZE, NULL, TASK2_PRIO, &task2_handle); xTaskCreate((TaskFunction_t)task_3, "task_3", TASK3_SIZE, NULL, TASK3_PRIO, &task3_handle); taskEXIT_CRITICAL(); vTaskDelete(NULL); }

然后进入task1任务,识别键值,并且根据键值进行不同的操作,并别进行按键消抖和队列入队失败的打印,下方是task1的完整代码:

void task_1(void *pvParameters) { uint8_t keynum, last_key = 0; BaseType_t err; char *buf = buff; while(1) { keynum = Key_GetNum(); if (keynum != 0 && last_key == 0) { vTaskDelay(30); if (Key_GetNum() == keynum) { if (keynum == 1 || keynum == 2) { err = xQueueSend(key_queue, &keynum, 0); if (err != pdTRUE) Serial_Sendstring("queue send failed\r\n"); } else if (keynum == 3) { err = xQueueSend(big_data_queue, &buf, 0); if (err != pdTRUE) Serial_Sendstring("big_queue send failed\r\n"); } } } last_key = keynum; vTaskDelay(10); } }

task2就是将存储在key_queue的值读出来既出队,并通过串口打印出来,下方是task2的完整代码:

void task_2(void *pvParameters) { uint8_t keynum; while(1) { if (xQueueReceive(key_queue, &keynum, portMAX_DELAY) == pdTRUE) { Serial_Sendstring("Key received: "); Serial_SendNum(keynum, 1); Serial_Sendstring("\r\n"); } } }

接下来的task3就是将buff数组里的值读取出来,并通过串口打印出来,(注:这里的读取和上方的读取方式不一样,建议先去了解后再看代码比较容易理解)下方是task3的完整代码:

void task_3(void *pvParameters) { char *buf; while(1) { if (xQueueReceive(big_data_queue, &buf, portMAX_DELAY) == pdTRUE) { Serial_Sendstring("Big data: "); Serial_Sendstring(buf); Serial_Sendstring("\r\n"); } } }

之后编译运行后按按键就能实现在串口助手上显示了。

下方是FreeRTOS_Task的完整代码:

#include "stm32f10x.h" #include "FreeRTOS.h" #include "task.h" #include "queue.h" #include "led.h" #include "key.h" #include "serial.h" /* 任务参数 */ #define START_TASK_SIZE 128 #define START_TASK_PRIO 1 #define TASK1_SIZE 256 #define TASK1_PRIO 2 #define TASK2_SIZE 256 #define TASK2_PRIO 3 #define TASK3_SIZE 256 #define TASK3_PRIO 4 TaskHandle_t start_task_handle; TaskHandle_t task1_handle; TaskHandle_t task2_handle; TaskHandle_t task3_handle; void Start_task(void *pvParameters); void task_1(void *pvParameters); void task_2(void *pvParameters); void task_3(void *pvParameters); QueueHandle_t key_queue; QueueHandle_t big_data_queue; char buff[100] = {"12354651165461032216120301654603"}; //大数据的具体内容,可随意更改,注意别超过规定的长度 void FreeRTOS_Task(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); Key_Init(); LED_Init(); Serial_Init(); key_queue = xQueueCreate(2, sizeof(uint8_t)); Serial_Sendstring(key_queue ? "key_queue create successful\r\n" : "key_queue create failed\r\n"); big_data_queue = xQueueCreate(1, sizeof(char *)); Serial_Sendstring(big_data_queue ? "big_data_queue create successful\r\n" : "big_data_queue create failed\r\n"); xTaskCreate((TaskFunction_t)Start_task, "Start_task", START_TASK_SIZE, NULL, START_TASK_PRIO, &start_task_handle); vTaskStartScheduler(); } void Start_task(void *pvParameters) { taskENTER_CRITICAL(); xTaskCreate((TaskFunction_t)task_1, "task_1", TASK1_SIZE, NULL, TASK1_PRIO, &task1_handle); xTaskCreate((TaskFunction_t)task_2, "task_2", TASK2_SIZE, NULL, TASK2_PRIO, &task2_handle); xTaskCreate((TaskFunction_t)task_3, "task_3", TASK3_SIZE, NULL, TASK3_PRIO, &task3_handle); taskEXIT_CRITICAL(); vTaskDelete(NULL); } void task_1(void *pvParameters) { uint8_t keynum, last_key = 0; BaseType_t err; char *buf = buff; while(1) { keynum = Key_GetNum(); if (keynum != 0 && last_key == 0) { vTaskDelay(30); if (Key_GetNum() == keynum) { if (keynum == 1 || keynum == 2) { err = xQueueSend(key_queue, &keynum, 0); if (err != pdTRUE) Serial_Sendstring("queue send failed\r\n"); } else if (keynum == 3) { err = xQueueSend(big_data_queue, &buf, 0); if (err != pdTRUE) Serial_Sendstring("big_queue send failed\r\n"); } } } last_key = keynum; vTaskDelay(10); } } void task_2(void *pvParameters) { uint8_t keynum; while(1) { if (xQueueReceive(key_queue, &keynum, portMAX_DELAY) == pdTRUE) { Serial_Sendstring("Key received: "); Serial_SendNum(keynum, 1); Serial_Sendstring("\r\n"); } } } void task_3(void *pvParameters) { char *buf; while(1) { if (xQueueReceive(big_data_queue, &buf, portMAX_DELAY) == pdTRUE) { Serial_Sendstring("Big data: "); Serial_Sendstring(buf); Serial_Sendstring("\r\n"); } } }

若有错误,还望海涵。

http://www.jsqmd.com/news/1312379/

相关文章:

  • 大麦网抢票神器:3个智能配置技巧告别手动抢票烦恼
  • 2026年如何找到可靠的PC/ABS改性联系方式?优选指南来了 - geo交流
  • Android应用启动优化全解析:从冷热启动原理到性能提升实战
  • CP2102 USB转UART模块:嵌入式开发的必备桥梁与实战指南
  • 2026年徐汇区三角包丹茵茶包装机厂家怎么选?这份优选指南让你少走弯路 - geo交流
  • Unity集成RMBG-2.0实现实时AI抠像:架构设计与性能优化全解析
  • 2026国内医生IP geo公司,形象打造真的立体吗?
  • ScanTailor Advanced:专业文档扫描处理的终极解决方案
  • RP2350驱动点阵屏:PIO+DMA双缓冲方案与图形库设计
  • 生成树计数原理与实战:从矩阵树定理到网络可靠性分析
  • 股东持股变动监控系统:用Python追踪大股东增减持与筹码集中度
  • 伺服驱动器预充电阻选型:为什么同尺寸水泥电阻需要更高的瞬态能力?
  • AI推动工业智能化转型~系列文章07:分类与诊断算法体系:故障识别的完整工具箱
  • 2026年珠海正规的巴斯夫TPU1185A总代理甄选指南:3个场景化对比帮你择优推荐 - geo交流
  • 如何用Python实现95%成功率的大麦自动化抢票工具:完整配置指南
  • 工业边缘计算实战:在NVIDIA Jetson reComputer R1000上通过FIN框架实现Modbus TCP/RTU通信
  • 5G核心网UPF开放:从云原生架构到可编程数据面的技术实践
  • cf ratring1600 7月29日
  • 清华团队研发活体水产品智能分拣系统,柔性机器人实现龙虾“安全着陆”
  • 宁波鄞州区装饰装修优选:金诚装饰一体化整装服务详解 - 国麟测评
  • 基于微信小程序的心理咨询预约系统(源码+LW+部署讲解)
  • CUDA安装与配置全攻略:从驱动到cuDNN的深度学习环境搭建
  • AI辅助编程实战:Python实现微信聊天记录本地导出工具
  • 2026企业文件管理系统横向对比测评|通用选型标准与场景适配指南
  • 青岛中央空调维修-欧米到家金牌师傅全城区30分钟火速上门覆盖市南/市北/崂山/李沧等全域各区 专治不制冷/漏水/异响/跳闸
  • 算法复杂度分析:大O、大Ω、大θ、小o、小ω的完整指南
  • C++表达式求值:从双栈算法到编译器前端核心原理
  • 1.54英寸三色电子纸模块驱动指南:从SPI原理到多平台实战
  • 2026年杜邦POM500P甄选指南:这7个应用场景为何值得优先考虑? - geo交流
  • Go 文件与 IO 操作知识点总结:操作系统底层、源码原理与 bufio 流式高性能实战