FreeRTOS
FreeRTOS是一个迷你的实时操作系统内核。作为一个轻量级的操作系统,功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能、软件定时器、协程等,可基本满足较小系统的需要。
由于RTOS需占用一定的系统资源(尤其是RAM资源),只有μC/OS-II、embOS、salvo、FreeRTOS等少数实时操作系统能在小RAM单片机上运行。相对μC/OS-II、embOS等商业操作系统,FreeRTOS操作系统是完全免费的操作系统,具有源码公开、可移植、可裁减、调度策略灵活的特点,可以方便地移植到各种单片机上运行,其最新版本为10.3.1版。
任务调度机制是嵌入式实时操作系统的一个重要概念,也是其核心技术。对于可剥夺型内核,优先级高的任务一旦就绪就能剥夺优先级较低任务的CPU使用权,提高了系统的实时响应能力。不同于μC/OS-II,FreeRTOS对系统任务的数量没有限制,既支持优先级调度算法也支持轮换调度算法,因此FreeRTOS采用双向链表而不是采用查任务就绪表的方法来进行任务调度。
引用自百度百科
FreeRTOS是一款实时操作系统,一种比较特殊的操作系统。
我们使用PC时,windows、MAC、linux等,我们可以打开多个进程和应用程序,看上去都是同时进行的
对于单核计算机而言,一次只能执行一个进程。计算机实际上实在多个任务之间进行高速切换,让用户看上去一切像是在同时进行
进程的切换通常依赖于不同的算法,以确保每个进程能分配到足够的cpu运算时间。一般来说,我们无法预测多个进程的执行过程,因为这个过程并非确定不变。
任务
任务是实时操作系统的基本模块,它们在自己的上下文中执行,调度程序负责决定单核CPU在某个时刻应该执行哪个任务。
我们可以并行运行多个任务(每次只执行一个任务,但是可以有更多的实例)。
函数相关
- 创建一个任务
xTaskCreate(
TaskCode, /* 任务将要调用的功能函数 */
TaskName, /* 任务名字 */
StackDepth, /* Stack size in bytes. */
Parameter, /* Parameter passed as input of the task */
priority, /* 任务优先级 */
TaskHandle); /* 句柄 */
TaskCode:指向任务函数的指针
TaskName:任务的名称
StackDepth:任务堆栈大小,以字节数表示。
Parameter:指针,指向任务函数所接收的参数
Priority:任务的优先级,数字越大优先级越高,默认最大32级(不定,可以自行去库文件修改),不同任务可以有相同优先级,够用的情况下,最大优先级越小越好
TaskHandle:返回一个句柄,用于以后进行函数调用(比如要删除某个任务或者修改其优先级)时对任务的引用
该函数会返回pdPass(成功时)或错误代码
- 任务函数
任务函数就是我们自定义的功能函数了,
注意,任务函数不能有任何返回值,即应该定义成void
使用TaskDelte(句柄)
函数可以删除任务
参考文章:
实例演示
代码:
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);
}
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 );
}
结果: