任务创建
操作
一、硬件初始化
static void Hardware_Init(void){
}
1.使用初始化函数可以方便所有初始化函数的统一,以免遗漏需要初始化的函数,方便初始化的增删加减。
2.此处进行中断优先级分组,以防其他地方重复分组,扰乱系统运作。
3.用于分割硬件和软件,方便测试出错时,时硬件问题导致还是软件问题导致。
二、构建启动任务函数框架
static void AppCreateTask(void)
{
taskENTER_CRITICAL();
vTaskDelete();
taskEXIT_CRITICAL();
}
1.进入临界态是防止在创建任务时,高优先级任务和中断任务的运行打断任务创建,带来保护现场的麻烦问题。
2.在创建任务的函数中创建出所有有实际需求的任务。
3.在所有任务创建完毕,将创建任务的任务删除。
4.任务妥当后退出临界态。
三、创建启动任务
appTaskReturn = xTaskCreate((TaskFunction_t ) AppCreateTask,
(const char * ) "AppCreateTask",
(uint16_t ) 512,
(void * ) NULL,
(UBaseType_t ) 3,
(TaskHandle_t * ) &appCreateTask_handle );
if (appTaskReturn == pdPASS) vTaskStartScheduler();
1.调用系统的动态创建任务函数。
2.将创建任务所需的参数一一写入(具体内容见代码块的注释)。
3.创建成功后启动调度器(东风)。
四、构建功能任务函数
static void TestCreateTask(void* parameters)
{
while(1)
{
vTaskDelay();
}
}
1.一定是一个无法返回的无线循环函数。
2.一定要有阻塞发生,可以是等待事件、消息、信号或使用延时函数。
五、创建功能任务
注:调用启动任务函数,操作与创建启动任务相同,但是无需启动调度器。
机制
一、优先级机制
1.优先级的数字越大(理论上可以是0到无限大),优先级越高(这与很多地方的优先级机制相反),高优先级有权先运行,高优先级任务可以抢占地优先级(此处说法只是个人用法选择),可做配置是否抢占,是否礼让。
2.所有创建后,只要是就绪任务,就将任务按照任务优先级挂载到就绪链表中,每个优先级下都有一个链表。
3.相同有限及的任务服从先来后到的原则排队。
4.空闲任务的优先级是0,如果将创建的任务优先级设置成0,将会受到空闲任务的礼让机制的干扰,导致排队的规则改变。
5.很不建议开发者将任务的优先级设置成0,以减少不必要的麻烦。
二、任务调度机制
1.任务调度是任务调度器,就绪链表中,从高优先级到底优先级寻找任务来执行。
2.相同优先级的任务执行运行后,乖乖到队尾排队(进入就绪态后)
三、阻塞机制
1.在等待延时、事件、消息或信号时,会将入任务放入延时链表。
2.在延时链表中任务是按照阻塞的时长来排列的。
3.延时结束后,将任务放入就绪链表,如果是最高优先级可以直接进入运行态。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)