代码改变世界

12,FreeRTOS队列执行

2025-09-20 17:16  tlnshuju  阅读(10)  评论(0)    收藏  举报

  一、实验目标


        创建四个动态任务,栈空间大小均为128字。startTask、Task1、Task2、Task3。startTask仅运行一次,负责两个队列的创建,task1、task2、task3任务的创建,startTask任务的删除。Task1负责两个队列的入队操作。Task2负责小数据的出队操作,并用串口发送。Task3负责大数据的出队操作,并用串口发送。

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

 二、实验准备

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

2.STM3F407开发板

3.宏定义开启

        将configSUPPORT_DYNAMIC_ALLOCATION 置一 。

#define configSUPPORT_DYNAMIC_ALLOCATION                1                       /* 1: 支持动态申请内存, 默认: 1 */

4.所需API函数介绍

        使用的API函数主要有队列动态创建函数、尾部入队函数、出队函数。在上一章详细描述过,这里附上连接,详情请点击连接查看。

上一章链接:11,FreeRTOS队列理论知识-CSDN博客https://blog.csdn.net/LC_8575/article/details/151067972?spm=1001.2014.3001.5501

5.队列相关定义

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

#include "queue.h"

        其次定义两个队列的句柄,以及大数据字符串内容:

//队列定义
QueueHandle_t key_queue; //小数据队列
QueueHandle_t big_data_queue; //小数据队列
char buff[100] = "这是一个大数据队列消息 abcdefg 123456";

 三、代码编写

3.1修改Task1的任务函数内容

        Task1实现两个队列的消息入队操作。具体为:当按键0、按键1按下时将读取到的键值发送入队(小数据)、当按键up按下时将大字符串数组的地址发送入队(大数据)。

/* task1 按键控制数据入队 */
void task1(void *pvParameters)
{
uint8_t key = 0;
BaseType_t err = 0;
char * buf;
buf = &buff[0];
while(1)
{
key = key_scan(0);
if(key == KEY0_PRES || key == KEY1_PRES)
{
err = xQueueSendToFront( key_queue,  &key,  portMAX_DELAY);
if(err != pdTRUE)
{
printf("key_queue队列入队失败\r\n");
}
}
else if(key == WKUP_PRES)
{
err = xQueueSendToFront( big_data_queue,  &buf,  portMAX_DELAY);
if(err != pdTRUE)
{
printf("key_queue队列入队失败\r\n");
}
}
vTaskDelay(10);//相对延时
}
}

 3.2修改Task2的任务函数内容

        Task2实现小数据出队操作,并用串口发送。

/* task2 小数据出队 */
void task2(void *pvParameters)
{
BaseType_t err;
uint8_t key = 0;
while(1)
{
err = xQueueReceive( key_queue, &key, portMAX_DELAY);
if(err != pdTRUE)
{
printf("key_queue出队失败\r\n");
}
else
{
printf("key_queue出队消息为:%d\r\n",key);
}
}
}

 3.3修改Task3的任务函数内容

        Task3实现大数据出队操作,并用串口发送。

/* task3 大数据出队 */
void task3(void *pvParameters)
{
BaseType_t err;
char * buf;
while(1)
{
err = xQueueReceive( big_data_queue, &buf, portMAX_DELAY);
if(err != pdTRUE)
{
printf("big_data_queue出队失败\r\n");
}
else
{
printf("big_data_queue出队消息为:%s\r\n",buf);
}
}
}

四、实验现象

        实验现象如下所示。可以看到系统初始化显示两个队列创建成功。按下key0/key1显示出队消息(小数据),按下keyup显示出队消息(大数据)。