FreeRTOS在Proteus上面验证
·
目标:
Level 1: 任务调度与多任务宏观视角 (The Scheduler)
🎯 学习目标(Checklist):
[ ] 理解什么是“抢占式调度” vs “协作式调度”。
[ ] 掌握 xTaskCreate (动态创建) 和 vTaskDelete。
[ ] 核心: 彻底搞懂 Task Priorities (优先级) 和 States (Running, Ready, Blocked, Suspended)。
[ ] 掌握 vTaskDelay (相对延时) 和 vTaskDelayUntil (绝对延时) 的区别。
🛠️ Proteus 专项实验:
实验名: 优先级的暴政。
操作: 创建 Task1 (LED1闪烁, 优先级低) 和 Task2 (LED2闪烁, 优先级高)。
验证:
让 Task2 处于死循环忙等(不调用延时)。你会发现 Task1 永远不亮(饿死现象)。
将 Task2 改为 vTaskDelay。你会发现 Task1 在 Task2 休息时亮了。
进阶操作: 把示波器的 A 通道接 LED1,B 通道接 LED2。观察波形,直观看到两个任务是如何“分时复用”CPU 的。
Level 2: 任务间通信 (Inter-Task Communication)
🎯 学习目标(Checklist):
[ ] 理解 Queue (队列) 是 FreeRTOS 通信的脊梁。
[ ] 掌握数据是“拷贝”进队列的,而不是传引用。
[ ] 能够处理多源发送、单源接收的情况。
🛠️ Proteus 专项实验:
实验名: 串口打印服务器。
场景: 多个任务都想打印日志,但直接调用 printf 会导致字符错乱。
操作:
创建一个“打印守护任务”,它死循环读取一个队列,读到什么就通过 UART 发给 Proteus 的 Virtual Terminal。
创建 Task A 和 Task B,它们不操作串口,而是把要说的话(字符串结构体)xQueueSend 发送给队列。
验证: 在 Virtual Terminal 中看到完整的、不乱序的日志输出。
Level 3: 信号量与互斥量 (Synchronization)
🎯 学习目标(Checklist):
[ ] 核心: 区分 Binary Semaphore (二值信号量) 和 Mutex (互斥量) 的应用场景。
二值信号量 = 同步(一个任务通知另一个)。
互斥量 = 锁(保护共享资源)。
[ ] 理解“优先级翻转”问题以及 Mutex 是如何通过“优先级继承”解决它的。
🛠️ Proteus 专项实验:
实验名: 模拟中断同步。
操作:
配置一个外部中断(通过 Proteus 的 Button 触发)。
在 ISR (中断服务函数) 中 xSemaphoreGiveFromISR 释放一个二值信号量。
创建一个任务 xSemaphoreTake 阻塞等待这个信号量。
验证: 按下 Proteus 的按钮,立刻看到 LED 翻转。这是验证“中断到任务”延迟最低的标准实验。
Level 4: 软件定时器与事件组 (Timing & Events)
🎯 学习目标(Checklist):
[ ] 理解 Software Timer 的回调函数是在哪个任务里执行的(Tmr Svc 任务),不能有阻塞代码。
[ ] 掌握 Event Group (事件组),实现“多个条件同时满足才执行”的逻辑(比如:Wi-Fi已连接 AND 按钮按下 -> 才发送数据)。
🛠️ Proteus 专项实验:
实验名: 交通灯控制器。
操作:
不使用 vTaskDelay 来控制红绿灯时间。
创建单次触发的软件定时器,回调函数里切换 LED 颜色并启动下一个定时器。
验证: 观察 LED 切换时序,并通过 Virtual Terminal 打印定时器回调时的系统 Tick 值,验证精度。
Level 5: 任务通知 (Task Notifications)
🎯 学习目标(Checklist):
[ ] 理解为什么官方推荐用 Task Notification 替代二值信号量(速度更快,内存更省)。
[ ] 掌握直接向指定任务发送信号。
🛠️ Proteus 专项实验:
实验名: 极速响应。
操作: 复制 Level 3 的中断实验,把二值信号量换成 vTaskNotifyGiveFromISR 和 ulTaskNotifyTake。
验证: 功能看起来和 Level 3 一模一样,但这是 FreeRTOS 最推崇的高效写法。
Level 6: 内存管理与系统调试 (System Health)
🎯 学习目标(Checklist):
[ ] 了解 Heap_4.c (最常用) 的原理。
[ ] 学会检测 Stack Overflow (栈溢出)。
[ ] 学会查看剩余堆栈大小 uxTaskGetStackHighWaterMark。
🛠️ Proteus 专项实验:
实验名: 炸弹实验 (故意搞崩系统)。
操作:
开启 FreeRTOS 配置里的 CHECK_FOR_STACK_OVERFLOW 设为 2。
定义 vApplicationStackOverflowHook 回调函数,在里面点亮一个红色 LED 并死循环。
创建一个任务,定义一个巨大的局部数组(比如 char big_buff[512]),超过分配给它的栈大小。
验证: 运行仿真,看那个红色 LED 是否亮起。这证明你拥有了调试系统崩溃的能力。
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐


所有评论(0)