news 2026/4/16 18:09:11

在上位机上熟悉FreeRTOS API

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
在上位机上熟悉FreeRTOS API

在上位机上熟悉FreeRTOS API——环境配置

前言

我知道一些朋友初入RTOS的时候,都是直接怼着单片机进行学习的,笔者非常赞同这种方式,毕竟RTOS最后是用在咱们的单片机上的,复杂一些的嵌入式设备甚至可能要使用裁剪后的Linux。不过,将单片机的一些特性跟RTOS的独有的概念混在一起,有时候会有一些累。笔者学习的时候就有感触。

笔者前段时间翻FreeRTOS的官网上,就看到了在上位机模拟API的项目,值得一提的是——它实际上是背靠了Linux System API / Win32 System API的,因此这里模拟的RTOS实在是不Real Time,但是对于新手,熟知什么是任务,内存管理,信号量队列等内容是再合适不过的(我相信大家学C语言都是从上位机开始的)。这就是这篇博客的出发点。

本篇博客的方案是使用CMake来管理我们的项目(至少看着干净),由于是CMake,所以构建就跟平台无关了,不管打算是Windows,WSL还是Linux的某一个发行版(比如说咱们的Ubuntu),都可以直接用起来。

从拿到RTOS的源码开始

Git用起来:

gitclone https://github.com/FreeRTOS/FreeRTOS.git --recurse-submodules

PS:注意要用--recurse-submodules拉取内核源码和其它依赖,否则编译会找不到头文件。这就是拉东西要拉全,除非有doc告诉你不用拿。


建立工程结构

随便找一个文件夹,我们的项目是这样的,把搞下来的RTOS源码下的FreeRTOS目录(这个目录下面就有Source等文件夹的)放到我们的项目中:

freertos-posix-demo/ ├── FreeRTOS/ # 官方源码,这就是纯粹的RTOS库,不要动 ├── app/ # 你自己的 FreeRTOS 代码 │ ├── main.c │ └── FreeRTOSConfig.h ├── CMakeLists.txt # 顶层 CMake 构建文件 └── README.md

编写 CMakeLists.txt

这是一个最简版的CMakeLists.txt,让你能在 Linux/WSL 上构建;如果是Windows的朋友请参考官方文档自己修改下面的CMake。

cmake_minimum_required(VERSION 3.10) project(freertos_posix_demo C) # 设置 FreeRTOS 源码路径 set(FREERTOS_ROOT "${CMAKE_SOURCE_DIR}/FreeRTOS") # 包含路径 include_directories( ${FREERTOS_ROOT}/Source/include ${FREERTOS_ROOT}/Source/portable/ThirdParty/GCC/Posix # Windows的主要改这里 ${FREERTOS_ROOT}/Source/portable/ThirdParty/GCC/Posix/utils # Windows的主要改这里 ${CMAKE_SOURCE_DIR}/app ) # Source 文件列表 file(GLOB FREERTOS_KERNEL_SRCS "${FREERTOS_ROOT}/Source/*.c" ) file(GLOB FREERTOS_PORT_SRCS "${FREERTOS_ROOT}/Source/portable/ThirdParty/GCC/Posix/port.c" # Windows的主要改这里 "${FREERTOS_ROOT}/Source/portable/ThirdParty/GCC/Posix/utils/*.c" # Windows的主要改这里 ) # 应用层代码 file(GLOB APP_SRCS "${CMAKE_SOURCE_DIR}/app/*.c") add_executable(freertos_demo ${FREERTOS_KERNEL_SRCS} ${FREERTOS_PORT_SRCS} ${APP_SRCS} ) # pthread 和时间库 target_link_libraries(freertos_demo pthread) # Windows的主要改这里, 我记得好像可以不用加

这个 CMake 列出 FreeRTOS 内核源码、POSIX portable 层和你的应用层。
其中:

  • FreeRTOSConfig.h放在app/目录下
  • 内核文件从 FreeRTOS 主源码引用
  • 最终生成freertos_demo可执行文件

📄FreeRTOSConfig.h

RTOS项目需要FreeRTOSConfig.h才能跑起来,在app/FreeRTOSConfig.h

#ifndefFREERTOS_CONFIG_H#defineFREERTOS_CONFIG_H/*----------------------------------------------------------- * 应用相关配置 *----------------------------------------------------------*//* Cortex-M3 内核 */#defineconfigCPU_CLOCK_HZ((unsignedlong)72000000)/* RTOS Tick 频率:1ms */#defineconfigTICK_RATE_HZ((TickType_t)1000)/* 最大任务优先级(0 ~ 4) */#defineconfigMAX_PRIORITIES(5)/* 最小任务栈大小(单位:word,不是字节) */#defineconfigMINIMAL_STACK_SIZE((uint16_t)128)/* FreeRTOS 堆大小(字节) */#defineconfigTOTAL_HEAP_SIZE((size_t)(10*1024))/* 任务名最大长度 */#defineconfigMAX_TASK_NAME_LEN(16)/* 使用抢占式调度 */#defineconfigUSE_PREEMPTION1/* 使用时间片轮转 */#defineconfigUSE_TIME_SLICING1/* 空闲任务钩子 */#defineconfigUSE_IDLE_HOOK0/* Tick 钩子 */#defineconfigUSE_TICK_HOOK0/* 启用 16 位 Tick(STM32F1 内存吃紧可用 1) */#defineconfigUSE_16_BIT_TICKS0/*----------------------------------------------------------- * 同步与通信机制 *----------------------------------------------------------*//* 互斥量(一定要开,教学和实战必用) */#defineconfigUSE_MUTEXES1/* 递归互斥量 */#defineconfigUSE_RECURSIVE_MUTEXES1/* 计数信号量 */#defineconfigUSE_COUNTING_SEMAPHORES1/* 任务通知(强烈推荐,性能最好) */#defineconfigUSE_TASK_NOTIFICATIONS1/* 队列注册(调试用) */#defineconfigQUEUE_REGISTRY_SIZE8/*----------------------------------------------------------- * 软件定时器(可选,但建议打开) *----------------------------------------------------------*/#defineconfigUSE_TIMERS1#defineconfigTIMER_TASK_PRIORITY(2)#defineconfigTIMER_QUEUE_LENGTH5#defineconfigTIMER_TASK_STACK_DEPTH(256)/*----------------------------------------------------------- * 中断相关配置(STM32F103 关键部分) *----------------------------------------------------------*//* STM32F103 NVIC 优先级位数 */#defineconfigPRIO_BITS4/* 最低中断优先级 */#defineconfigLIBRARY_LOWEST_INTERRUPT_PRIORITY15/* 允许调用 FreeRTOS API 的最高中断优先级 */#defineconfigLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY5/* 转换为 Cortex-M 内核可识别格式 */#defineconfigKERNEL_INTERRUPT_PRIORITY\(configLIBRARY_LOWEST_INTERRUPT_PRIORITY<<(8-configPRIO_BITS))#defineconfigMAX_SYSCALL_INTERRUPT_PRIORITY\(configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY<<(8-configPRIO_BITS))/*----------------------------------------------------------- * 断言 *----------------------------------------------------------*/#include<assert.h>#defineconfigASSERT(x)\if((x)==0)\{\taskDISABLE_INTERRUPTS();\for(;;);\}/*----------------------------------------------------------- * 调试与统计(教学强烈推荐) *----------------------------------------------------------*//* 启用运行时间统计 */#defineconfigGENERATE_RUN_TIME_STATS1/* 运行时间计数器配置(需提供实现) */#defineconfigUSE_TRACE_FACILITY1#defineconfigUSE_STATS_FORMATTING_FUNCTIONS1/*----------------------------------------------------------- * API 包含控制(建议全开) *----------------------------------------------------------*/#defineINCLUDE_vTaskPrioritySet1#defineINCLUDE_uxTaskPriorityGet1#defineINCLUDE_vTaskDelete1#defineINCLUDE_vTaskSuspend1#defineINCLUDE_vTaskDelay1#defineINCLUDE_vTaskDelayUntil1#defineINCLUDE_xTaskGetSchedulerState1#defineINCLUDE_xTaskGetCurrentTaskHandle1#defineINCLUDE_xTaskGetIdleTaskHandle1#defineINCLUDE_xTimerGetTimerDaemonTaskHandle1#endif/* FREERTOS_CONFIG_H */

这是一个最基本的配置,你可根据教学需要调整。


示例的 main.c

app/main.c

#include"FreeRTOS.h"#include"task.h"#include<stdio.h>voidTask1(void*pv){for(;;){printf("Task1 running\n");vTaskDelay(pdMS_TO_TICKS(1000));}}intmain(void){xTaskCreate(Task1,"t1",configMINIMAL_STACK_SIZE,NULL,1,NULL);vTaskStartScheduler();return0;}

这个例子每秒打印一次任务信息,用于演示调度器工作。


构建与运行

mkdirbuild&&cdbuild cmake..make./freertos_demo

运行会输出你任务的打印内容。

OK,这样就搞定了!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 10:53:32

计算机毕设Java基于推荐算法的高校就业管理系统 基于Java技术的高校就业智能推荐系统设计与实现 Java语言开发的高校就业管理与推荐一体化系统

计算机毕设Java基于推荐算法的高校就业管理系统467l69 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。随着高校毕业生数量的不断增加&#xff0c;高校就业管理面临着复杂多变的挑…

作者头像 李华
网站建设 2026/4/16 1:09:02

Linly-Talker能否挑战Synthesia等商业数字人平台?

Linly-Talker能否挑战Synthesia等商业数字人平台&#xff1f; 在内容创作与人机交互的边界不断被AI重塑的今天&#xff0c;一个新趋势正悄然兴起&#xff1a;只需一张照片、一段文字&#xff0c;就能生成会说话、能互动的“数字人”。像Synthesia这样的商业平台早已让企业用户尝…

作者头像 李华
网站建设 2026/4/16 10:52:36

保健品行业本地企业网盘搭建方案

一、保健品行业企业网盘建设背景1、行业特性带来的文档管理挑战保健品行业正处于高速发展与严格监管并存的时期。从原料采购、生产工艺、质检报告到营销素材&#xff0c;企业每天都在产生海量的多类型文档。更为复杂的是&#xff0c;这些文档往往需要跨部门、跨区域的协同使用—…

作者头像 李华
网站建设 2026/4/16 9:17:08

22、工业信息物理系统对交通运输的影响

工业信息物理系统对交通运输的影响 1. 引言 工业信息物理系统(ICPS)对铁路和公路等交通运输系统产生了重要影响,并且可以通过ICPS来提升这些运输系统的性能。交通运输是信息物理系统(CPS)概念的一个重要应用领域,ICPS对运输系统的影响主要涉及货运、客运和物流等方面。…

作者头像 李华
网站建设 2026/4/16 10:53:18

(保姆级教程)啥是AI Agent?从入门到精通:2025年五大工具框架深度盘点,收藏这一篇就够了!

在AI技术飞速发展的今天&#xff0c;AI Agent已经成为了一个热门的研究和应用领域。无论是企业还是个人开发者&#xff0c;都希望能够借助AI Agent来提升工作效率、优化业务流程或创造全新的用户体验。然而&#xff0c;从零开始构建一个AI Agent并非易事&#xff0c;幸运的是&a…

作者头像 李华
网站建设 2026/4/16 10:38:37

软著避坑指南:以为交了材料就能过?这些细节让你多走半年弯路!

大家好&#xff01;今天来聊聊软著申请那些事儿。很多开发者觉得软著申请不过是“填表交代码”的简单流程&#xff0c;但现实中&#xff0c;材料被打回、反复补正、甚至申请失败的情况比比皆是。更关键的是&#xff0c;软著审核周期通常需要1-3个月&#xff0c;一旦踩坑返工&am…

作者头像 李华