任务休眠
上一篇我们实现的多任务,是为每个任务分配相同的时间。实际情况可能是A任务一直闲着没事干,B任务就一直拼命干活,这种分配显然是不合理的。
那么如何避免这种浪费呢?
我们可以把这样闲着没事干的任务,从tasks里删除,这种做法在多任务里叫作“休眠”(sleep)。当FIFO有数据过来时,我们再将A任务唤醒。(这里大家可以类比线程状态及状态切换,思路是相同的。)
首先来创建task_sleep,mtask.c节选:
void task_sleep(struct TASK *task)
{
int i;
char ts = 0;
if (task->flags == 2) {
/* 如果指定任务处于唤醒状态 */
if (task == taskctl->tasks[taskctl->now]) {
ts = 1; /* 让自己休眠的话,稍后需要进行任务切换 */
}
/* 寻找task所在的位置 */
for (i = 0; i < taskctl->running; i++) {
if (taskctl->tasks[i] == task) {
/* 在这里 */
break;
}
}
taskctl->running--;
if (i < taskctl->now) {
taskctl->now--; /* 需要移动成员,要相应地处理 */
}
/* 移动成员 */
for (; i < taskctl->running; i++) {
taskctl->tasks[i] = taskctl->tasks[i + 1];
}
task->flags = 1; /* 不工作的状态 */
if (ts != 0) {