准备
需要提前安装好FreeRTOS的库
一、Demo介绍
示例:在Arduino上跑FreeRTOS的一个简单消息队列demo。
二、步骤
1.添加库
需要两个基础的头文件:
#include <Arduino_FreeRTOS.h>
#include <queue.h> //消息队列头文件
2.声明
QueueHandle_t stringQueue; //声明下一个我们需要使用的消息队列,类型为QueueHandle_t
这个都是通用的,在cortex M3 M4下都是一样的。
3.创建队列及任务函数
在setup()中创建:
stringQueue = xQueueCreate(10, // 队列长度
sizeof(String) // 队列项大小
);
if (stringQueue != NULL)
{
//创建TaskSerial串口任务
xTaskCreate(TaskSerial, //任务函数
"Serial", // 任务名
128, // 堆栈大小
NULL, //传递给任务的参数
2, //任务优先级为2,优先级为0-3
NULL); //任务句柄
//创建字符串读取任务
xTaskCreate(TaskStringRead, //任务函数
"StringRead", // 任务名
128, // 堆栈大小
NULL, //传递给任务的参数
1, //任务优先级为1
NULL); //任务句柄
}
xTaskCreate(TaskBlink, //任务函数
"Blink", // 任务名
128, // 堆栈大小
NULL, //传递给任务的参数
0, //任务优先级为0,最低
NULL ); //任务句柄
4.编写任务函数具体内容
需要注意的是在Arduino上它的系统滴答节拍是15ms一次的,也就是说vTaskDelay(1)
它延时的是15ms;如果需要延时500ms该怎么办呢?
它也为我们提供了portTICK_PERIOD_MS,
我们可以这样写 vTaskDelay(500 / portTICK_PERIOD_MS),
只要除以它本身就可以了
/*
TaskStringRead
字符串消息入队,500ms一次
*/
void TaskStringRead(void *pvParameters)
{
for (;;)
{
String Test = "Hello,CSDN";
xQueueSend(stringQueue, &Test, portMAX_DELAY); //消息入队
vTaskDelay(500 / portTICK_PERIOD_MS);
}
}
/*
Serial task.
读取队列消息(出队)并串口打印
*/
void TaskSerial(void * pvParameters)
{
(void) pvParameters;
Serial.begin(9600);
while (!Serial)
{
vTaskDelay(1);
}
String Test_R = "";
for (;;)
{
if (xQueueReceive(stringQueue, &Test_R, portMAX_DELAY) == pdPASS) //消息出队
{
Serial.println(Test_R);
}
}
}
/*
Blink task.
用于任务运行提示,LED250ms闪烁一次
*/
void TaskBlink(void *pvParameters)
{
(void) pvParameters;
pinMode(LED_BUILTIN, OUTPUT);
for (;;)
{
digitalWrite(LED_BUILTIN, HIGH);
vTaskDelay( 250 / portTICK_PERIOD_MS );
digitalWrite(LED_BUILTIN, LOW);
vTaskDelay( 250 / portTICK_PERIOD_MS );
}
}
5.Loop函数不做任何处理
void Loop () {}
6.运行效果
总结
以上就是一个字符串消息队列demo的完整步骤,还是很简单易懂的,不用像STM32那么相对复杂难理解一点。
代码下载:
StringQueue.
😀 授人鱼,更要授人以渔,希望猿一的本篇博客能对您有所帮助!