准备
需要提前安装好FreeRTOS的库
一、Demo介绍
示例:在Arduino上跑FreeRTOS的一个简单消息队列demo。
二、步骤
1.添加库
需要两个基础的头文件:
#include <Arduino_FreeRTOS.h>
#include <queue.h>
2.声明
QueueHandle_t stringQueue;
这个都是通用的,在cortex M3 M4下都是一样的。
3.创建队列及任务函数
在setup()中创建:
stringQueue = xQueueCreate(10,
sizeof(String)
);
if (stringQueue != NULL)
{
xTaskCreate(TaskSerial,
"Serial",
128,
NULL,
2,
NULL);
xTaskCreate(TaskStringRead,
"StringRead",
128,
NULL,
1,
NULL);
}
xTaskCreate(TaskBlink,
"Blink",
128,
NULL,
0,
NULL );
4.编写任务函数具体内容
需要注意的是在Arduino上它的系统滴答节拍是15ms一次的,也就是说vTaskDelay(1) 它延时的是15ms;如果需要延时500ms该怎么办呢? 它也为我们提供了portTICK_PERIOD_MS, 我们可以这样写 vTaskDelay(500 / portTICK_PERIOD_MS), 只要除以它本身就可以了
void TaskStringRead(void *pvParameters)
{
for (;;)
{
String Test = "Hello,CSDN";
xQueueSend(stringQueue, &Test, portMAX_DELAY);
vTaskDelay(500 / portTICK_PERIOD_MS);
}
}
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);
}
}
}
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. 😀 授人鱼,更要授人以渔,希望猿一的本篇博客能对您有所帮助!
|