2、任务管理
2022-11-29 20:35:23 0 举报
AI智能生成
FreeRTOS任务管理
作者其他创作
大纲/内容
创建与删除
什么是任务
一个函数 如:void ATaskFunction (void *pvParameters) //Parameter 参数
无返回值 void
每个任务/函数都有自己的栈
可以一个函数,多个调度
任务创建0)
BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, // 函数指针, 任务函数
const char * const pcName, // 任务的名字
const configSTACK_DEPTH_TYPE usStackDepth, // 栈大小,单位为word,10表示40字节 void * const pvParameters, // 调用任务函数时传入的参数
UBaseType_t uxPriority, // 优先级
TaskHandle_t * const pxCreatedTask ); // 任务句柄, 以后使用它来操作这个任务 )
const char * const pcName, // 任务的名字
const configSTACK_DEPTH_TYPE usStackDepth, // 栈大小,单位为word,10表示40字节 void * const pvParameters, // 调用任务函数时传入的参数
UBaseType_t uxPriority, // 优先级
TaskHandle_t * const pxCreatedTask ); // 任务句柄, 以后使用它来操作这个任务 )
例子 xTaskCreate(vTask1, "Task 1", 1000, NULL, 1, NULL);
任务删除
void vTaskDelete( TaskHandle_t xTaskToDelete )
参数:vTaskDelete(NULL) 自杀 vTaskDelete(pvTaskCode) 被杀 pvTaskCode --> 自己的句柄 杀人 pvTaskCode --> 别人的句柄
任务优先级和Tick
优先级
范围 0~(configMAX_PRIORITIES – 1),越大优先级越高
Tick(记号)
vTaskDelay(2); //等待2个Tick,假设configTICK_RATE_HZ=100, Tick周期时10ms, 等待20ms
vTaskDelay(pdMS_TO_TICKS(100)); //等待100ms
任务状态(Runing 、 Not Runing )
阻塞状态(Blocked)
时间阻塞
同步事件阻塞
queue(队列)
binary semaphores(二进制信号量)
counting semaphores (计数信号量)
mutexes(互斥量)
recursive mutexes(递归互斥量、互斥锁)
event groups(事件组)
task notifications(任务通知)
暂停状态(Suspended)
void vTaskSuspend( TaskHandle_t xTaskToSuspend );
参数: NULL(暂停自己) 别人的句柄(暂停别人)
退出暂停状态(别人调用) Resume(简历、恢复)
vTaskResume (别的任务调用)
xTaskResumeFromISR(中断程序调用)
就绪状态(Ready)
Delay函数
vTaskDelay:至少等待指定个数的Tick Interrupt才能变为就绪状态
vTaskDelay(n)
vTaskDelayUntil:等待到指定的绝对时刻,才能变为就绪态。 xTaskDelayUntil(&Pre, n)
空闲任务及其钩子函数
空闲任务
空闲任务优先级为0:它不能阻碍用户任务运行
空闲任务要么处于就绪态,要么处于运行态,永远不会阻塞
钩子函数 Idle Task Hook Functions
执行一些低优先级的、后台的、需要连续执行的函数
测量系统的空闲时间
让系统进入省电模式
使用前提(FreeRTOS\Source\tasks.c )
定义宏 #define configUSE_IDLE_HOOK 1
使用函数 vApplicationIdleHook()
调度算法
配置(FreeRTOSConfig.h) preemption(优先权) slice(切片)yield
configUSE_PREEMPTION 优先级抢占
configUSE_TIME_SLICING 时间片轮转
configIDLE_SHOULD_YIELD 空闲任务是否让步于用户任务
0 条评论
下一页