开启 FreeRTOS--最经典的双闪灯案例--deepseek

发布时间:2026/10/28 8:22:22
开启 FreeRTOS--最经典的双闪灯案例--deepseek 我想知道如何才是开启了freertos如何使用freertos您可以使用最简单最经典的一个案例来给小白说明一下吗可以讲细致一点讲每一步为啥这么做对应底层是如何运行的谢谢啦老师太棒了这个问题问到点子上了要真正理解 FreeRTOS咱们就抛开那些复杂的网口、DMA用最经典的“红灯停绿灯行”双闪灯案例来演示。这就好比你要开一家公司运行 FreeRTOS我们一步步来看怎么注册公司、怎么招人、怎么让员工干活。第一步怎么才算“开启了 FreeRTOS”在 Vitis 里开启 FreeRTOS 不是你在代码里写一句#include FreeRTOS.h就行的。它是在底层配置层面完成的也就是你之前看过的 BSP 设置里。操作本质底层原理你在 Vitis 里创建了一个 Platform并在 Domain域里选择了freertos10_xilinx。Vitis 会自动在你的工程里引入 FreeRTOS 的内核源码tasks.c、queue.c等。它会生成一个FreeRTOSConfig.h并在里面配置了心跳时间比如 1000Hz即 1ms 一次。最重要的是它会在底层把 ARM 芯片的硬件定时器比如 Systick和几个关键的异常中断如 SVC、PendSV绑定到 FreeRTOS 的启动函数上。这就是“公司的营业执照”。一旦配置好你的工程在编译时就会自动把 RTOS 的调度器代码几千行塞进你的可执行文件里。第二步最经典的双闪灯案例源码 拆解你看一下这段极简的代码我会在每一行注释里告诉你“为什么”c#include stdio.h #include xil_printf.h #include FreeRTOS.h #include task.h // 1. 定义 LED 的引脚和寄存器这里是伪代码代表硬件操作 #define LED_RED 0x01 #define LED_GREEN 0x02 // 2. 红灯任务员工A void Task_RedLED(void *pvParameters) { while (1) // 为什么要有死循环因为任务不能退出退出会崩溃 { LED_Write(LED_RED, 1); // 点亮红灯 vTaskDelay(pdMS_TO_TICKS(500)); // 阻塞 500 毫秒重点见下方解释 LED_Write(LED_RED, 0); // 熄灭红灯 vTaskDelay(pdMS_TO_TICKS(500)); // 阻塞 500 毫秒 } } // 3. 绿灯任务员工B void Task_GreenLED(void *pvParameters) { while (1) { LED_Write(LED_GREEN, 1); // 点亮绿灯 vTaskDelay(pdMS_TO_TICKS(1000));// 阻塞 1000 毫秒绿灯亮得更久 LED_Write(LED_GREEN, 0); // 熄灭绿灯 vTaskDelay(pdMS_TO_TICKS(1000)); } } // 4. 主函数老板 / 包工头 int main() { // 初始化硬件不需要上系统直接调 LED_Init(); xil_printf(系统启动开始创建任务...\r\n); // 创建红灯任务 // 参数说明任务函数, 任务名字, 栈大小, 参数, 优先级, 句柄 xTaskCreate(Task_RedLED, RedLED, 512, NULL, 2, NULL); // 创建绿灯任务 // 注意优先级绿灯是 1红灯是 2。数字越大优先级越高。 xTaskCreate(Task_GreenLED, GreenLED, 512, NULL, 1, NULL); // 开启调度器开始干活 // 这一句执行后CPU 的控制权完全交给 FreeRTOS vTaskStartScheduler(); // 如果代码跑到这里说明内存不够了因为没地方建任务栈了 while (1) { xil_printf(调度器启动失败\r\n); } return 0; }第三步底层到底是怎么运行的微观视角现在代码烧进板子Vitis 调试器按下“运行”。微观世界里发生了什么1.main()被执行招人阶段主程序执行到xTaskCreateFreeRTOS 会在内存堆区里给红灯和绿灯各分配一块专门的独立空间栈 Stack。相当于给每个员工发了个专属的记事本和办公桌。此时CPU 只是把这两个任务登记在“花名册”就绪列表上但还没开始执行。2.vTaskStartScheduler()被执行开工这是极其关键的一步。FreeRTOS 启动第一个硬件定时器Systick。它从“花名册”里找优先级最高的任务红灯优先级2。然后伪造了一个中断返回的现场直接让 CPU 跳到Task_RedLED函数开始执行。从此以后main()函数就“死”了永远不会再往下执行。3. 第一次执行红灯任务CPU 点亮红灯。遇到vTaskDelay(500)。这是 FreeRTOS 的灵魂底层发生的事FreeRTOS 把红灯任务从“花名册”里划掉扔进“休息室”阻塞列表并在它的记事本上写“500 毫秒后叫醒他”。注意此时 CPU 并没有死等不像裸机的 delay 傻转圈而是立刻去“花名册”里找下一个能干活的人绿灯任务4. 第一次执行绿灯任务绿灯任务被唤醒其实是 CPU 跳过去点亮绿灯。遇到vTaskDelay(1000)。绿灯也被扔进“休息室”。5. 定时器“心跳”上下文切换 / Context Switch重点来了刚才不是启动了一个定时器吗假设 1 毫秒跳动一次产生一次中断。每到 1 毫秒CPU 就被强制打断一下跳进 FreeRTOS 的中断服务函数里。系统一看时间如果红灯的 500 毫秒到了就把红灯从“休息室”拽出来放回“花名册”。此时系统会对比红灯优先级2和正在休息的其他人优先级1。发现红灯优先级高或者大家优先级一样就开始切换现场把当前寄存器里的数据保存到绿灯的内存Stack里。把红灯内存里的数据恢复到寄存器里。让 CPU 继续执行红灯的代码紧接着上一次延时的地方继续跑。第四步为什么必须用vTaskDelay()小白避坑如果你在上面红灯任务的while(1)里没写vTaskDelay()或者写了delay_ms(500)那种单纯死等的裸机延时会发生什么底层现象红灯任务一旦开始跑它就在while(1)里疯狂循环点亮、死等、熄灭。因为它是最高优先级2它绝对不会交出 CPU 的控制权。结果绿灯任务永远得不到执行的机会哪怕它也已经被创建了。这就叫“任务饿死”。通俗解释红灯员工是个卷王霸占了老板CPU的办公桌死活不下来。绿灯员工在外面排队连门都进不去。只要用了vTaskDelay就是在告诉老板“我活干完了我去旁边喝口水休眠你把桌子让给别人用吧。” 这样大家才能和谐共处。总结给小白的口诀开 RTOS 在 BSP 里选 FreeRTOS 引入头文件。建任务xTaskCreate租场地、发工牌。跑起来vTaskStartScheduler把控制权交出去。防独裁 任务里必须有vTaskDelay交还 CPU 控制权让其他任务也能跑。这就是最经典的 FreeRTOS 入门。你去 Vitis 里建个空工程把这段代码换成你板子实际 LED 的引脚敲进去跑一下看看灯是不是交替闪烁体会一下那种“不用写死循环延时两个任务居然能同时跑”的魔法This response is AI-generated, for reference only.

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询