Toriyung

导航

freertos-入门:整理笔记

任务创建

动态创建:vTaskCreate()。参数:任务函数、命名、堆大小、任务函数参数(没有的话为NULL)、优先级(越大优先级越高)。动态创建只需传入堆的大小,自动分配地址,内部自动生成TCB结构体,该结构体用来初始化任务的一些属性参数。

静态创建:vTaskCreateStatic()。参数:任务函数、命名、堆大小、任务函数参数(没有的话为NULL)、优先级(越大优先级越高)。静态创建需要传入堆的地址,需要自己先生成staticTCB结构体,且先启动开关(文件:FreeRTOSConfig.h---宏定义:configSUPPORT_STATIC_ALLOCATION == 1),且该函数调用到下面的函数,需要定义

 

 

 

任务状态理论

  rtos本质就是多线程运行,配置的切换时间(文件:FreeRTOSConfig.h---宏定义:configTICK_RATE_HZ),当任务运行设置好的时间后,由中断进行决定切换;切换时要对任务的状态进行确认。任务的状态一共有四种:运行(run)、准备(ready)、阻塞(blocked)、暂停或休息(suspended)

  命令函数:vTaskSuspend()、vTaskResume()

 

 

延时:  vTaskDelay

    从Delay开始计时,直到计时结束

  vTaskDelayUntil

    从任务开始计时,直到计时结束

  简单来说就是Delay的计时是从调用vTaskDelay开始,不包括任务本身执行时长,所以从任务开始到计时结束的时长是不确定的,同时取决于任务处理时间和延时时间;而DelayUntil的计时从任务开始到计时结束,计时本身包含了任务执行时长,所以整个任务的总时长是确定的,只取决于延时时间的设置

 

 

 


任务删除:

  vTaskDelete():传入参数为想要删除的任务句柄,或传入为NULL时为自杀,删除任务后,空闲任务会清理内存,假如有其他高优先级一直抢占使得空闲任务无法执行,则无法清理内存

钩子函数

  有些功能或事情需要空闲任务进行执行,在不破坏官方核心代码的情况下,让空闲任务运行我们定义的一些事务,空闲任务中有一个钩子函数,我们可以将事务写在里面,空闲任务会自动调用钩子函数(打开的情况下)。在空闲任务函数tasks.c---portTASK_FUNCTION()下有vApplicationIdleHook()函数,这就是钩子函数。

  配置:

    首先打开钩子函数功能:文件:FreeRTOSConfig.h---宏定义:configUSE_IDLE_HOOK  定义为1时,打开

    然后为了不破坏官方核心代码,重定义钩子函数vApplicationIdleHook()

任务调度策略

  1. 是否允许抢占

    即任务的运行调度是否根据优先级来抢占,如果允许抢占,则当优先级高的任务就绪(ready)时,立马被优先级高的任务抢占运行(run);而不允许抢占时,即使优先级高的任务就绪时,当优先级低的任务还在运行着不会被抢占

  配置:

    文件:FreeRTOSConfig.h---宏定义:configUSE_PREEMPTION        当定义为1时,允许抢占,当定义为0时,不允许抢占

  2. 允许抢占时,是否允许时间片轮转

    即相同优先级的任务是否根据时间片进行轮流运行,如果允许轮流,则每个任务运行相同时间段后交替,如果不允许,则单个任务运行到被高优先级抢占为止,且当下一次高优先级让出回到低优先级时,优先让先前未运行的任务

  配置:

    文件:FreeRTOSConfig.h---宏定义:configUSE_TIME_SLICING  当定义为1时,允许轮转,当定义为0时,不允许轮转

  3. 空闲任务是否让步

    当存在任务的优先级和空闲任务一致(一般为0),此时可以决定空闲任务是否和普通任务一样进行交替调度,如果让步,则空闲任务为其他任务让步;如果不让步,则空闲任务和普通任务一起交替调度。其原理为空闲任务中有判断field定义的语句,如图

            

 

  配置:

    文件:FreeRTOSConfig.h---宏定义:configIDLE_SHOULD_YIELD  当定义为1时,空闲任务让步,当定义为0时,空闲任务不让步

 

posted on 2022-10-11 22:28  Toriyung  阅读(197)  评论(0编辑  收藏  举报