1、任务创建和删除的API函数
任务的创建和删除本质就是调用FreeRTOS的API函数。
和任务创建和删除有关的函数主要有三:
xTaskCreate():动态方式创建任务。
xTaskCreateStatic():静态方式创建任务。
vTaskDelete():删除任务。
那又有思考了
2、动态方式创建任务和静态方式创建任务有什么区别?
动态创建任务:任务的任务控制块以及任务的栈空间所需的内存,均由FreeRTOS从FreeRTOS管理的堆中分配。这样创建任务是方便的,省事儿的。
又遇到了一个新概念-任务控制块:是一个用于存储与任务相关的各种信息的数据结构(结构体),例如任务的状态、优先级、堆栈指针、上下文等。它包含了管理和控制任务所需的所有关键数据。
后边还会有一个新概念,句柄,等遇到了,我们再做解释。
静态创建任务:任务的任务控制块以及任务的栈空间所需的内存,需要用户分配提供。
总结:二者区别在于内存的分配由FreeRTOS分配还是用户自己分配。
3、动态创建任务函数xTaskCreate()
哈~码字码累了,直接上正点原子PPT的截图吧。
右图中我们可以看到,在调用xTaskCreate函数创建任务的时候,我们需要传入的实参有指向任务函数的指针、任务的名字、任务的堆栈大小、传递给任务函数的参数、任务优先级和任务句柄。
有一点需要注意一下,就是对于任务句柄的解释,正点原子的视频说是任务的句柄就是任务的控制块,上百度我们可以搜到,任务句柄是一个指针,指向任务控制块或者任务堆栈地址。所以原子哥说他是任务控制块,是为了让初学者方便学习,其实并不是任务控制块。
任务控制块:
既然说到任务控制块了,放一张任务控制块的图吧。
看吧,没骗你,任务控制块就是一个结构体。任务控制块是任务的身份证。
我们在创建动态任务的时候,指定任务堆栈大小,然后系统就自动为我们分配栈空间了,就会有任务栈栈顶,创建任务的时候设置的任务优先级就直接传递到了任务控制块中,任务句柄就是任务控制块的起始地址。任务控制块中有任务状态列表项,这里边放的就是任务的状态。
动态创建函数流程:
动态创建任务只需要三步:
第一,将宏configSUPPORT_DYNAMIC_ALLOCATION 配置为1。
第二,定义函数入口参数。
第三,编写任务函数。
4、静态创建任务函数xTaskCreateStatic()
二者的区别从任务优先级往下开始不同。返回值也不同,静态创建会返回任务的句柄。
静态创建任务流程:
5、任务删除函数vTaskDelete()
void vTaskDelete(TaskHandle_t xTaskToDelete);
形参为待删除任务的任务句柄;当传入的参数为NULL时,则代表删除任务自身(当前正在运行的任务)。