文章目录[隐藏]
关于FreeRTOS 在arduino环境下的应用
一、关于FreeRTOS
1、什么是FreeRTOS
FreeRTOS是运行在微控制器上的一种实时操作系统,可以有效的管理任务,合理的分配硬件资源。
举例来说,当我们在使用Windows或者Linux时,可以打开多个进程和应用程序,看起来是同时运行的。但是对于单核计算机来讲,一次只能执行一个进程。所以计算机其实是在多个任务间非常快速的进行切换,以致于使用者感觉好一切都是在同时运行。
而操作系统就是为我们提供了合理的任务调度程序机制,并且对这些任务所需要使用的资源进行管理,来满足每个线程都可以得到正确的执行,并且满足其的资源需求。
这里我们有了一个新的概念。任务调度机制,调度的机制先不看,先来看任务。
2、什么是任务
任务是实时操作系统的基本模块,它们在自己的上下文中执行(这部分概念,有需要可以参考我针对操作系统的一些文章)。
PS: 任务的切换涉及到上下文的切换,在我的操作系统专栏多线程部分略有涉及。
而调度机制,是负责决定CPU在某个时刻应该执行哪个任务。如果多个任务的并发执行,没有调度机制的话,会很糟糕很糟糕,这里有具体的示例。
3、建议
关于操作系统的知识,我会专门进行总结,有需求的可以学习一下,建议初学,可以从Arduino的FreeRTOS中先学习体会,然后再去系统的学习操作系统的概念。
二、创建FreeRTOS任务
我们先来看在Arduino中FreeRTOS的简单应用,本例中将先创建两个打印"hello world"消息的任务,然后将它们删除。
1、xTaskCreate任务创建函数
API参数
- pvTaskCode
- 一个函数指针,用来传递负责任务实现的函数
- pcName
- 任务的名称
- usStackDepth
- 任务堆栈大小,以字节数表示,通常会使用一个足够大的数值
- pvParameters
- 指针,指向任务函数所接收的参数,其类型必须为(void *)
- uxPriority
- 任务的优先级
- TaskHandle_t
- 返回一个句柄,用于以后函数调用时对任务的引用
#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
static inline IRAM_ATTR BaseType_t xTaskCreate(
TaskFunction_t pvTaskCode,
const char * const pcName,
const uint32_t usStackDepth,
void * const pvParameters,
UBaseType_t uxPriority,
TaskHandle_t * const pvCreatedTask)
{
return xTaskCreatePinnedToCore( pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pvCreatedTask, tskNO_AFFINITY );
}
#endif
2、setup函数 和 循环代码
串口设置
首先我们需要在Setup函数中,打开一个串行连接,用于输出测试程序的运行结果。
Serial.begin(115200);
delay(1000);
创建任务示例
#include<Arduino.h>
#include<FreeRTOS.h>
void taskOne( void * parameter )
{
for( int i = 0;i<10;i++ ){
Serial.println("Hello from task 1");
delay(1000);
}
Serial.println("Ending task 1");
vTaskDelete( NULL );
}
void taskTwo( void * parameter)
{
for( int i = 0;i<10;i++ ){
Serial.println("Hello from task 2");
delay(1000);
}
Serial.println("Ending task 2");
vTaskDelete( NULL );
}
void setup() {
Serial.begin(112500);
delay(1000);
xTaskCreate(
taskOne, /* Task function. */
"TaskOne", /* String with name of task. */
10000, /* Stack size in bytes. */
NULL, /* Parameter passed as input of the task */
1, /* Priority of the task. */
NULL); /* Task handle. */
xTaskCreate(
taskTwo, /* Task function. */
"TaskTwo", /* String with name of task. */
10000, /* Stack size in bytes. */
NULL, /* Parameter passed as input of the task */
1, /* Priority of the task. */
NULL); /* Task handle. */
}
void loop() {
delay(1000);
}
程序执行结果
版权声明:本文为CSDN博主「多彩的2022」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_54357381/article/details/122914999
暂无评论