十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

FreeRTOS 入门指南:5 个步骤跑通你的第一个多任务调度示例

FreeRTOS 入门指南:5 个步骤跑通你的第一个多任务调度示例 FreeRTOS 入门指南5 个步骤跑通你的第一个多任务调度示例【免费下载链接】FreeRTOSClassic FreeRTOS distribution. Started as Git clone of FreeRTOS SourceForge SVN repo. Submodules the kernel.项目地址: https://gitcode.com/GitHub_Trending/fr/FreeRTOSFreeRTOS 实时操作系统提供任务调度、队列通信、信号量与软件定时器是资源受限的单片机、传感器节点和工业控制器上做多任务并发的基础内核。本文带你在本机跑通它的最小示例。30 秒看项目解决什么在单核上把多个任务按优先级并发起来用队列、信号量、事件组在任务之间传数据、做同步。适合谁需要实时响应的 C 语言嵌入式开发从 8 位 MCU 到 Cortex-A 都有对应移植代码。不适合谁需要完整网络栈、文件系统或 POSIX 语义的 Linux 应用本仓库只是经典发行版内核本体是子模块网络与文件系统在 FreeRTOS-Plus/ 下的子模块里。资源量级内核可裁剪到 KB 级 ROM 占用本仓库的 Posix_GCC 示例直接分配 65KB 堆见下文配置。第一步拿到代码仓库包含内核、150 多个硬件平台演示和测试框架三部分内核在FreeRTOS/Source/是通过 git 子模块引用的。克隆时必须带上--recurse-submodules否则内核目录是空的后面的示例无法编译git clone --recurse-submodules https://gitcode.com/GitHub_Trending/fr/FreeRTOS cd FreeRTOS拿到代码后先看 FreeRTOS/Demo/readme.md 确认目录命名规则平台名加工具链例如CORTEX_STM32F103_Keil。没有目标硬件就用模拟器演示FreeRTOS/Demo/Posix_GCC/Linux、macOS、Windows(WSL/MSYS2) 都能编译不需要任何开发板。第二步跑通最小示例Posix_GCC提供两套演示。main.c用宏mainSELECTED_APPLICATION选择默认构建完整版main_blinky.c是最小版一个发送任务每 200ms 向队列写 100一个软件定时器每 2 秒写 200一个接收任务把收到的值打印出来。cd FreeRTOS/Demo/Posix_GCC make clean make USER_DEMOBLINKY_DEMO ./build/posix_demo终端会持续输出 Message received from task每两秒多一条 Message received from software timer。这就是一个完整的 FreeRTOS 应用两个任务、一个定时器、一条队列调度器在后台切换它们。按 CtrlC 结束。想换完整版把USER_DEMOFULL_DEMO传给 make 即可。第三步读懂 FreeRTOSConfig.h每个演示目录里的 FreeRTOSConfig.h 是内核行为的总开关改动不需要重学 API。Posix 演示里的三个值最值得先看#define configUSE_PREEMPTION 1 /* 高优先级任务就绪时立即抢占低优先级任务 */ #define configTICK_RATE_HZ ( 1000 ) /* 系统心跳 1000HzvTaskDelay 的最小粒度由此决定 */ #define configTOTAL_HEAP_SIZE ( ( size_t ) ( 65 * 1024 ) ) /* 内核所有动态分配都来自这块堆 */任务栈大小在创建时按任务单独指定blinky 用的是configMINIMAL_STACK_SIZE而configTOTAL_HEAP_SIZE是全局上限。做上板移植时这个文件里还有 30 多个开关官方配置说明文档在FreeRTOS/README.md指向的位置逐条对照硬件改即可。第四步改成自己的第一个任务最小任务模型就三件事写一个死循环函数、用xTaskCreate注册、调用vTaskStartScheduler交出控制权。以main_blinky.c里main_blinky()的创建方式照抄void vMyTask(void *pv) { TickType_t last xTaskGetTickCount(); for (;;) { console_print(hello\n); /* DelayUntil 按绝对时刻对齐周期比 vTaskDelay 累积误差小 */ vTaskDelayUntil(last, pdMS_TO_TICKS(500)); } }在main_blinky()的xQueueCreate之后加一行xTaskCreate(vMyTask, My, configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY 1, NULL);重新 make 就能看到自己的任务被调度器带上。这就是后面所有功能队列、互斥、事件组的地基。往深里走源码入口是FreeRTOS/Source/子模块拉取后才有内容按这条顺序读每一步都能对应你刚跑过的现象Source/tasks.c任务控制块、就绪/阻塞链表、调度器主循环。blinky 里谁先运行在这里决定。Source/queue.cxQueueSend/xQueueReceive如何把任务挂到等待队列。队列模块的函数调用关系如下图所示可以对照源码验证Source/timers.c软件定时器由一个守护任务驱动解释了为什么定时器回调里不能阻塞。Test/目录CBMC 形式化验证、CMock 单元测试、VeriFast 证明脚本想知道某个 API 的行为边界时先来这里查测试用例。社区讨论区在 FreeRTOS 官方论坛和 FreeRTOS.org 的文档站本仓库内的FreeRTOS/Demo/readme.md与 FreeRTOS/README.md 是指向它们的路标。现在就打开main_blinky.c把mainTASK_SEND_FREQUENCY_MS从 200 改成 50重新编译观察接收任务打印频率的变化。【免费下载链接】FreeRTOSClassic FreeRTOS distribution. Started as Git clone of FreeRTOS SourceForge SVN repo. Submodules the kernel.项目地址: https://gitcode.com/GitHub_Trending/fr/FreeRTOS创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表