RTOS多优先级
多优先级概述
问题:当资源(CPU、事件等等)可用时,应该分配哪个任务去占用这些资源呢?
使用优先级策略可以解决这个问题。将任务按优先级进行划分,优先级高的优先占有资源运行。
实现
RTOS维护一个就绪表,每个表项对应一个任务,代表一个不同的优先级。就绪表指明哪些优先级的任务等待占用资源。使用位图数据结构来标识这个就绪表的状态,位图的某一位为1
代表就绪表的这一表项中的任务等待占用CPU(资源)。
为任务添加一个优先级字段
1
2
3
4
5
6
7
8
9
10
11
typedef struct _t_Task {
taskStack_t *stack; // 任务的栈指针
uint32_t delayTicks; // 任务延时计数器,在调用延时函数时每SysTick中断减一
listNode delayNode; // 延时队列结点
uint32_t state; //任务此时的状态
uint32_t priority; // 任务的优先级
}task_t;
添加优先级位图表与所有任务的指针数组
1
2
Bitmap taskPriorityBitmap;
task_t* taskTable[RTOS_PRIORITY_COUNT];
修改任务调度器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 任务调度函数,来决定下一个运行的任务是哪个
void taskSched(void) {
uint32_t st = enterCritical();
// 如果调度锁计数器大于0,则不切换任务
if (schedLockCount > 0) {
leaveCritical(st);
return;
}
// 寻找最高优先级的任务
task_t* tempTask = getHighestReadyTask();
// 如果最高优先级的任务不是当前的任务,则切换到最高优先级的任务进行运行,否则不切换
if (tempTask != currentTask) {
nextTask = tempTask;
taskSwitch();
}
leaveCritical(st);
}
// 目前来看这个函数好像没什么必要去单独写
task_t* getHighestReadyTask(void) {
return taskTable[bitmapGetFirstSet(&taskPriorityBitmap)];
}
本文由作者按照 CC BY 4.0 进行授权