为什么单核CPU能同时执行多个任务?比如我们在听歌的同时还可以和别人聊天,CPU是如何做到的呢?其实这个主要依靠任务调度算法,而调度算法只是宏观上让人感觉多个任务在同时执行,但是微观上单核CPU其实任然还是没有实现的,它只是让任务被轮流执行,只是切换的频率非常高,人感觉不到而已。当然多核CPU就无所谓了。
下面我将介绍三种常见的调度算法的C语言代码实现,循环调度、优先级调度和时间片轮转调度,并进行简要讲解。

  • 循环调度算法:
  1. #include <stdio.h>
  2. #define NUM_TASKS 3
  3. // 任务函数类型定义
  4. typedef void (*TaskFunc)();
  5. // 任务结构体
  6. typedef struct {
  7.     TaskFunc func;  // 任务函数指针
  8.     int period;     // 任务执行周期
  9. } Task;
  10. // 任务函数示例
  11. void task1() {
  12.     printf("Task 1\n");
  13. }
  14. void task2() {
  15.     printf("Task 2\n");
  16. }
  17. void task3() {
  18.     printf("Task 3\n");
  19. }
  20. int main() {
  21.     Task tasks[NUM_TASKS] = {
  22.         {task1, 1000},   // 任务1,执行周期为1000ms
  23.         {task2, 2000},   // 任务2,执行周期为2000ms
  24.         {task3, 3000}    // 任务3,执行周期为3000ms
  25.     };
  26.     while (1) {
  27.         for (int i = 0; i < NUM_TASKS; i++) {
  28.             tasks[i].func();   // 执行当前任务
  29.             delay(tasks[i].period);  // 延时任务周期
  30.         }
  31.     }
  32.     return 0;
  33. }
循环调度算法按照固定的顺序依次执行每个任务,并通过延时函数控制每个任务的执行周期。在上面的代码中,定义了3个任务,每个任务具有不同的执行周期。main函数中的while循环会不断执行任务,并通过delay函数进行延时。

  • 优先级调度算法:
  1. #include <stdio.h>
  2. #define NUM_TASKS 3
  3. // 任务函数类型定义
  4. typedef void (*TaskFunc)();
  5. // 任务结构体
  6. typedef struct {
  7.     TaskFunc func;  // 任务函数指针
  8.     int priority;   // 任务优先级
  9. } Task;
  10. // 任务函数示例
  11. void task1() {
  12.     printf("Task 1\n");
  13. }
  14. void task2() {
  15.     printf("Task 2\n");
  16. }
  17. void task3() {
  18.     printf("Task 3\n");
  19. }
  20. int main() {
  21.     Task tasks[NUM_TASKS] = {
  22.         {task1, 1},   // 任务1,优先级为1
  23.         {task2, 2},   // 任务2,优先级为2
  24.         {task3, 3}    // 任务3,优先级为3
  25.     };
  26.     while (1) {
  27.         for (int i = 0; i < NUM_TASKS; i++) {
  28.             if (tasks[i].priority == 1) {
  29.                 tasks[i].func();   // 执行优先级最高的任务
  30.                 delay(tasks[i].period);  // 延时任务周期
  31.             }
  32.         }
  33.         for (int i = 0; i < NUM_TASKS; i++) {
  34.             if (tasks[i].priority == 2) {
  35.                 tasks[i].func();   // 执行次高优先级的任务
  36.                 delay(tasks[i].period);  // 延时任务周期
  37.             }
  38.         }
  39.         for (int i = 0; i < NUM_TASKS; i++) {
  40.             if (tasks[i].priority == 3) {
  41.                 tasks[i].func();   // 执行最低优先级的任务
  42.                 delay(tasks[i].period);  // 延时任务周期
  43.             }
  44.         }
  45.     }
  46.     return 0;
  47. }
优先级调度算法根据任务的优先级依次执行任务。在上面的代码中,定义了3个任务,每个任务具有不同的优先级。

  • 时间片轮转调度算法:
  1. #include <stdio.h>
  2. #define NUM_TASKS 3
  3. #define TIME_QUANTUM 1000
  4. // 任务函数类型定义
  5. typedef void (*TaskFunc)();
  6. // 任务结构体
  7. typedef struct {
  8.     TaskFunc func;   // 任务函数指针
  9.     int remaining_time;   // 任务剩余执行时间
  10. } Task;
  11. // 任务函数示例
  12. void task1() {
  13.     printf("Task 1\n");
  14. }
  15. void task2() {
  16.     printf("Task 2\n");
  17. }
  18. void task3() {
  19.     printf("Task 3\n");
  20. }
  21. int main() {
  22.     Task tasks[NUM_TASKS] = {
  23.         {task1, 2000},   // 任务1,执行时间为2000ms
  24.         {task2, 3000},   // 任务2,执行时间为3000ms
  25.         {task3, 4000}    // 任务3,执行时间为4000ms
  26.     };
  27.     int current_task = 0;
  28.     while (1) {
  29.         if (tasks[current_task].remaining_time > 0) {
  30.             tasks[current_task].func();   // 执行当前任务
  31.             tasks[current_task].remaining_time -= TIME_QUANTUM;
  32.         }
  33.         current_task = (current_task + 1) % NUM_TASKS;   // 切换到下一个任务
  34.         delay(TIME_QUANTUM);   // 延时时间片长度
  35.     }
  36.     return 0;
  37. }
时间片轮转调度算法将CPU的执行时间划分为固定长度的时间片,并依次执行每个任务,当一个任务的时间片用完后,切换到下一个任务。在上面的代码中,定义了3个任务,每个任务具有不同的执行时间。
以上是常见的嵌入式开发中多任务调度算法的C语言代码实现示例。每种调度算法都有不同的特点和适用场景,根据实际需求选择合适的调度算法能够提高嵌入式系统的性能和效率。

来源:头条号 晓亮Albert