任务函数
任务作为一个C函数进行执行,唯一特别之处在于其返回的类型,以及输入参数的类型都为void型,其标准格式如下所示:
void ATaskFunction( void *pvParameters );
任何一个任务都是一个独立的程序,将会在一个无限循环中一直执行,或并不会返回。
FREESTROS中的任务函数一定不能含有return,并且不能执行到退出函数,当一个任务再也不使用时应被明确的delete。每个创建的任务是一个单独的执行实例,拥有自己定义的的堆栈以及变量空间。如下图所示:
上层任务状态
一个应用程序可以包含多个任务,当处理器只含有一个核心时,这时只有一个任务可以在任一时间内执行,这表明任务只能处于运行与停止两种状态中的一种。在实际使用中停止状态又分为其他几种状态。
当任务处于执行状态时,处理器就会运行该任务中的相关代码,当任务没有处于运行状态时,任务就会休眠,它的状态会保存好等待处理器准备执行它时来恢复执行。等到再次执行时会从上次断点时开始执行。如图所示:
一个任务从非运行状态转到运行状态被称作:‘switched in’ 或 ‘swapped in’,相反,从运行状态转到非运行状态被称作 ‘switched out’ 或 ‘swapped out’,FREESTROS的进程调度器是唯一控制任务进入执行状态与退出执行状态的方式。
创建任务
任务可以通过FreeRTOS xTaskCreate() 函数来创建,其具体实例如下所示:
BaseType_t xTaskCreate( TaskFunction_t pvTaskCode,
const char * const pcName,
uint16_t usStackDepth,
void *pvParameters,
UBaseType_t uxPriority,
TaskHandle_t *pxCreatedTask );
参数以及返回值讲解:
pvTaskCode:表示一个任务的地址,该任务就是一个单纯的C函数,该函数永远不会退出,或者一般情况下是一个无限循环。它指向任务函数,或直接为任务函数名字。(注意:可以开启多个任务共用一个任务函数,即多个任务具有同一个函数名字)
pcName:任务的一个描述性名字,FREESTROS中一些情况下并没有用,它的存在仅仅为了帮助调试。通过易于读的名字来区分任务比通过任务函数名字来区分任务容易的多。configMAX_TASK_NAME_LEN定义的这个名字的最大长度,可以用NULL,若名字太长,会被截短。
usStackDepth:每一个任务在创建时都有一个内核分配的独立堆栈,该参数用于表示堆栈的大小。这个值表明了该任务堆栈的最大字数,注意,不是字节数,是‘字’(注意:一个字包含多少字节与机器有关,32位机一个字含有4个字节,即宽度为4)。任务堆栈的深度与宽度的乘积不能超过uint16_t所能表示的最大值。空闲任务的堆栈大小通过应用层的常量configMINIMAL_STACK_SIZE来定义,这个值表明了任何一个任务的最小推荐堆栈深度,如果需要使用较大堆栈,则需要自己分配一个更大的值。
pvParameters:任务函数需要一个void类型的参数,这个参数即是为了传递给任务函数。
uxPriority:表明了任务的优先级,它的范围为0到(configMAX_PRIORITIES – 1),优先级数越大,优先级越高。若值过大将会将值设为所支持的最大值。
pxCreatedTask:用于在将句柄传递给正在创建的任务,应用层可以通过这个函数来改变任务优先级或删除任务。如果用不到则设置为NULL;。
Returned value:只有两种返回状态 1,pdPASS 表示成功 2,pdFAIL 表示失败。
例子如下所示:
创建两个任务:
两个任务的内容:
执行结果:
其时间片分配如下:
当然任务也可以通过任务函数中创建,如下所示:
采用上述的方式可以将任务一中的参数传递到任务二中,供任务2使用,
如下所示:
注:关于FREERTOS学习笔记内容均为官方英文版内核讲解里内容,本人由于最近在学这个东西,在看这本书时为方便记忆将需要的记录下来,有错欢迎指正。