- #include <stdint.h>
- #include <stdio.h>
- // 模拟任务堆栈
- uint32_t Task1_Stack[128];
- uint32_t Task2_Stack[128];
- // 模拟任务控制块 (TCB)
- typedef struct {
- uint32_t *StackPointer; // 堆栈指针
- uint32_t Priority; // 任务优先级
- } TCB;
- TCB Task1_TCB, Task2_TCB;
- // 当前任务指针
- TCB *CurrentTask;
- TCB *NextTask;
- // 模拟任务函数
- void Task1(void) {
- while (1) {
- printf("Task 1 is running\n");
- // 模拟延时
- for (volatile int i = 0; i < 1000000; i++);
- }
- }
- void Task2(void) {
- while (1) {
- printf("Task 2 is running\n");
- // 模拟延时
- for (volatile int i = 0; i < 1000000; i++);
- }
- }
- // 初始化任务
- void Task_Init(void) {
- // 初始化 Task1 堆栈和控制块
- Task1_TCB.StackPointer = &Task1_Stack[127]; // 设置栈顶
- *Task1_TCB.StackPointer-- = (uint32_t)Task1; // 设置 PC 为 Task1 函数地址
- // 初始化 Task2 堆栈和控制块
- Task2_TCB.StackPointer = &Task2_Stack[127];
- *Task2_TCB.StackPointer-- = (uint32_t)Task2;
- // 设置初始任务
- CurrentTask = &Task1_TCB;
- NextTask = &Task2_TCB;
- }
- // 模拟任务切换
- void Task_Switch(void) {
- // 保存当前任务上下文
- __asm volatile ("PUSH {R0-R12, LR}");
- // 切换到下一个任务
- TCB *Temp = CurrentTask;
- CurrentTask = NextTask;
- NextTask = Temp;
- // 恢复下一个任务上下文
- __asm volatile ("POP {R0-R12, LR}");
- __asm volatile ("BX LR");
- }
- int main(void) {
- Task_Init();
- while (1) {
- Task_Switch(); // 定期切换任务
- }
- }
|