尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

FreeRTOS(9):队列的入队与出队
📅 发布时间:2026/8/2 8:53:46

实验现象

实验步骤:

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

项目创建

复制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"); } } }

若有错误,还望海涵。

相关新闻

  • Android应用启动优化全解析:从冷热启动原理到性能提升实战
  • 大麦网抢票神器:3个智能配置技巧告别手动抢票烦恼
  • 2026国内医生IP geo公司,形象打造真的立体吗?

最新新闻

  • LinkSwift:浏览器脚本技术架构解析与九大网盘直链下载实现方案
  • 莲都防水维修白皮书:5项国标硬标准+12大全场景对症+本地避坑(2026.8新) - 超人防水
  • 2026 正阳一楼顶楼专项家装调研 防潮保温防渗改造实力品牌榜单 - 趣闻早乐评
  • 为什么87%的AI迁移项目超期?揭秘Gartner验证的4层技术债识别模型与实时迁移健康度仪表盘
  • AI赋能专业教材编写,快速生成教材内容,提升编写效率! - AI写论文
  • 2026 年 8 月佛山非急救医疗转运产业全景调研与本土合规企业运营实录 - 平台推荐官

日新闻

  • 怀化母婴除甲醛公司测甲醛中心怎么选:康之居母婴除甲醛标准、流程、避坑指南 - 信誉隆金银铂奢回收
  • 三步打造你的终极音乐中心:foobox-cn网络电台功能完整指南
  • Lance湖仓格式:为多模态AI工作流设计的终极数据存储方案

周新闻

  • 怀化母婴除甲醛公司测甲醛中心怎么选:康之居母婴除甲醛标准、流程、避坑指南 - 信誉隆金银铂奢回收
  • 三步打造你的终极音乐中心:foobox-cn网络电台功能完整指南
  • Lance湖仓格式:为多模态AI工作流设计的终极数据存储方案

月新闻

  • ClickHouse版本管理深度实战:4步构建零风险升级与回滚体系
  • Java 23 种设计模式:从踩坑到精通 | 番外:责任链模式 —— 物流审批流程实战
  • 华硕笔记本性能解放指南:G-Helper轻量级控制工具全面解析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号