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 );
}

结果:

arduino esp32 TCP服务端 arduino esp32 freertos_sed