[应用相关] 调度器的实现方法

[复制链接]
 楼主| xuanhuanzi 发表于 2025-1-23 15:23 | 显示全部楼层 |阅读模式
  1. #include <stdint.h>
  2. #include <stdio.h>

  3. // 模拟任务堆栈
  4. uint32_t Task1_Stack[128];
  5. uint32_t Task2_Stack[128];

  6. // 模拟任务控制块 (TCB)
  7. typedef struct {
  8.     uint32_t *StackPointer; // 堆栈指针
  9.     uint32_t Priority;      // 任务优先级
  10. } TCB;

  11. TCB Task1_TCB, Task2_TCB;

  12. // 当前任务指针
  13. TCB *CurrentTask;
  14. TCB *NextTask;

  15. // 模拟任务函数
  16. void Task1(void) {
  17.     while (1) {
  18.         printf("Task 1 is running\n");
  19.         // 模拟延时
  20.         for (volatile int i = 0; i < 1000000; i++);
  21.     }
  22. }

  23. void Task2(void) {
  24.     while (1) {
  25.         printf("Task 2 is running\n");
  26.         // 模拟延时
  27.         for (volatile int i = 0; i < 1000000; i++);
  28.     }
  29. }

  30. // 初始化任务
  31. void Task_Init(void) {
  32.     // 初始化 Task1 堆栈和控制块
  33.     Task1_TCB.StackPointer = &Task1_Stack[127];  // 设置栈顶
  34.     *Task1_TCB.StackPointer-- = (uint32_t)Task1; // 设置 PC 为 Task1 函数地址

  35.     // 初始化 Task2 堆栈和控制块
  36.     Task2_TCB.StackPointer = &Task2_Stack[127];
  37.     *Task2_TCB.StackPointer-- = (uint32_t)Task2;

  38.     // 设置初始任务
  39.     CurrentTask = &Task1_TCB;
  40.     NextTask = &Task2_TCB;
  41. }

  42. // 模拟任务切换
  43. void Task_Switch(void) {
  44.     // 保存当前任务上下文
  45.     __asm volatile ("PUSH {R0-R12, LR}");

  46.     // 切换到下一个任务
  47.     TCB *Temp = CurrentTask;
  48.     CurrentTask = NextTask;
  49.     NextTask = Temp;

  50.     // 恢复下一个任务上下文
  51.     __asm volatile ("POP {R0-R12, LR}");
  52.     __asm volatile ("BX LR");
  53. }

  54. int main(void) {
  55.     Task_Init();

  56.     while (1) {
  57.         Task_Switch(); // 定期切换任务
  58.     }
  59. }


 楼主| xuanhuanzi 发表于 2025-1-23 15:23 | 显示全部楼层
你懂RTOS背后的知识吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

183

主题

2307

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部

183

主题

2307

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部