公众号
欢迎扫码关注本人微信公众号:公众号上分享更多嵌入式知识和资料,分享个人学习嵌入式的心得体会。欢迎大家一起来玩呀。
任务
在软件中的任务和我们现实当中的任务是类似的,在现实当中有大任务也有小任务。大任务也可以拆解成很多小任务,然后各个小任务一起配合完成一个大任务。在不带操作系统中所有的任务都跑在while(1)大循环中。在带操作系统中的程序任务就可以把大任务分解成很多个小任务,各个小任务互相配合完成程序需要满足的这个大任务。
xTaskCreate
xTaskCreate是一个建立任务的函数,通过调用这个函数就可以建立一个任务。
//函数原始接口
BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,
const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
const configSTACK_DEPTH_TYPE usStackDepth,
void * const pvParameters,
UBaseType_t uxPriority,
TaskHandle_t * const pxCreatedTask )
TaskFunction_t pxTaskCode:这个参数的类型是TaskFunction_t 实际是指向我们任务入口函数的指针,通过这个参数将任务的入口函数的地址传递进来,然后保存到任务控制块上,可以简单的理解为先把任务入口函数地址保存在一个函数指针上,在任务调度的时候就可以通过保存在函数指针的函数地址从而调用任务的函数,所以任务得到运行。
const char * const pcName:任务的名字,你可以给你的任务取一个名字,这个可以根据任务的运行的实际含义进行取名。
const configSTACK_DEPTH_TYPE usStackDepth:栈深度,因为每个任务都运行在独立的栈上,所以需要配置任务栈的深度,这个大小可以根据任务的需要大小而配置。
void * const pvParameter: 这个是任务第一次调度的时候给任务传递的参数,如果没有参数可以设置为NULL,这个参数不要传入局部变量,因为局部变量是临时的,有可能任务调度的时候传入的参数已经被修改,所以就出现了bug。
UBaseType_t uxPriority:任务优先级,在freeRTOS中任务是可以设置优先级的,所以建立任务的时候可以传入任务的优先级。优先级高的任务可以首先获得运行,所以大家可以根据任务的优先级设置合适的优先级。
TaskHandle_t * const pxCreatedTask:返回任务的handle,怎么理解这个handle?handle大家可以理解为你建立这个任务返还回来的“账号”,比如建立了任务,但是运行到某个时候,你不想让任务运行了,就可以通过调用销毁任务的函数把任务进行销毁,但是调用这个销毁任务的函数之前你首先需要传入这个任务的账号,就是handle,然后销毁函数可以通过你的handle找到你的任务从而把任务从任务控制块中销毁了,通过这个handle我们还可以调用系统的函数获得任务的一些信息,比如任务现在运行的状态等。
vTaskDelete
任务删除函数,如果一个任务不需要在运行了,可以使用这个函数将任务删除了,删除之后任务将释放一些建立任务的时候分配的资源。
//任务原型
void vTaskDelete( TaskHandle_t xTaskToDelete )
TaskHandle_t xTaskToDelete:任务的handle,这handle在任务建立的时候分配的,这个值就是xTaskCreate任务建立时候的生成的“账号”,也就是TaskHandle_t * const pxCreatedTask 返回的值。
vTaskSuspend
任务挂起函数,如果一个任务一段时间不需要运行了就可以讲这个任务挂起,挂起和删除是有点区别的,删除就是将这个任务彻底释放了,挂起只是暂时让这个任务得不到运行而已,如果有需要还可以讲任务恢复运行。
//任务原型
void vTaskSuspend( TaskHandle_t xTaskToSuspend )
TaskHandle_t xTaskToSuspend:任务的handle,也就是任务的“账号”。
vTaskResume
任务挂起恢复,与vTaskSuspend这个函数是相反的操作。
void vTaskResume( TaskHandle_t xTaskToResume )
TaskHandle_t xTaskToResume:任务的handle,也就是任务的“账号”。