03-FreeRTOS移植指南.md 3.7 KB


tags: [source-summary] type: source source: "尚硅谷嵌入式技术之FreeRTOS实时操作系统 V1.0.3 — 第3章" author: "尚硅谷研究院" date: 2026-07-12 url: ""

created: 2026-07-12

FreeRTOS 移植指南

来源:尚硅谷 FreeRTOS 教程第 3 章。覆盖:源码结构、HAL 库移植步骤、寄存器移植步骤、FreeRTOSConfig.h 配置详解。

源码结构

FreeRTOS/
├── Demo/           演示例程(多芯片架构)
├── License/        许可
├── Source/         核心源码
│   ├── include/    头文件(通用)
│   ├── portable/   移植文件(编译器相关)
│   │   ├── Keil/  → 指向 RVDS
│   │   ├── RVDS/  不同内核芯片移植文件
│   │   │   └── ARM_CM3/   port.c + portmacro.h
│   │   └── MemMang/  heap_1~5.c
│   ├── tasks.c     任务管理
│   ├── queue.c     队列
│   ├── timers.c    软件定时器
│   ├── event_groups.c
│   ├── stream_buffer.c
│   └── list.c      列表
└── Test/           测试代码

port.c:上下文切换等核心汇编代码,由 FreeRTOS 官方为各内核编写。 portmacro.h:数据类型和宏定义。

MemMang 五个 heap 文件必须使用一个(初学推荐 heap_4.c)。

HAL 库移植步骤

目录添加源码

Project/FreeRTOS/
├── portable/   (Keil + RVDS + MemMang,保留 ARM_CM3 + heap_4.c)
└── source/     (7 个 .c 文件)
Core/Inc/FreeRTOSConfig.h  (从 Demo 目录拷贝)

工程添加文件

  1. 新建 Group FreeRTOS/SourceFreeRTOS/Portable
  2. Source 组添加 7 个 .c 文件
  3. Portable 组添加 port.c + heap_4.c
  4. 添加头文件路径:include/RVDS/ARM_CM3/

系统配置

#define xPortPendSVHandler    PendSV_Handler
#define vPortSVCHandler       SVC_Handler
#define INCLUDE_xTaskGetSchedulerState   1

修改 stm32f1xx_it.c

#include "FreeRTOS.h"
#include "task.h"

// 注释掉 SVC_Handler() 和 PendSV_Handler()

extern void xPortSysTickHandler(void);
void SysTick_Handler(void) {
    if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) {
        xPortSysTickHandler();
    }
}

注意:HAL 和 FreeRTOS 都默认依赖 SysTick,建议在 CubeMX 中将 HAL 时基换成其他定时器。

寄存器移植步骤

与 HAL 移植类似,但不需要 HAL 相关配置。main.c 中直接添加 SysTick_Handler:

extern void xPortSysTickHandler(void);
void SysTick_Handler(void) {
    if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) {
        xPortSysTickHandler();
    }
}

FreeRTOSConfig.h 配置

配置项分三类:

  1. INCLUDE_ 开头:函数使能(1=可用,0=禁用)
  2. config 开头:功能配置(基本、内存、钩子、中断)
  3. 其他:PendSV/SVC 宏定义

关键配置项

配置 说明
configUSE_PREEMPTION 1 抢占式调度
configCPU_CLOCK_HZ SystemCoreClock CPU 主频
configTICK_RATE_HZ 1000 系统节拍频率
configMAX_PRIORITIES 32 最大优先级数
configMINIMAL_STACK_SIZE 128 空闲任务栈大小(Word)
configTOTAL_HEAP_SIZE 10*1024 堆大小(Byte)
configUSE_MUTEXES 1 使能互斥信号量
configUSE_TIMERS 1 使能软件定时器
configUSE_TICKLESS_IDLE 0 低功耗模式
configMAX_SYSCALL_INTERRUPT_PRIORITY 5<<4 FreeRTOS 管理的最高中断优先级

配套代码

移植完成的 HAL 库基础工程模板:

  • code/00_HAL_Key/ — HAL 库按键检测模板(FreeRTOS 移植基础工程)

后续章节:[[04-数据类型与命名规范]]、[[05-任务创建删除与挂起恢复]]