FreeRTOS移植到STM32

一、找一个STM32的裸机工程模板

我们以STM32F103裸机程序为例

随便找的一个裸机程序

二、去官网上下载FreeRTOS V9.0.0 源码

在移植之前,我们首先要获取到 FreeRTOS 的官方的源码包。这里我们提供两个下载 链 接 , 一 个 是 官 网 : http://www.freertos.org/ , 另 外 一 个 是 代 码 托 管 网 站 : https://sourceforge.net/projects/freertos/files/FreeRTOS/。虽然不是最新版本的源码包但是因为内核很稳定, 并且网上资料很多所以我们选用V9.0.0 版本

我们打开 FreeRTOS 的代码托管网站,就可以看到 FreeRTOS 的源码及其版本信息了, 具体见图

 

 点开V9.0.0下载zip这个,

 解压完成后就会得到一个完整的Freertos源码包

FreeRTOS 包含 Demo 例程和内核源码(比较重要,我们就需要提取该目录下的大部分 文件),具体见图 13-5。FreeRTOS 文件夹下的 Source 文件夹里面包含的是 FreeRTOS 内 核的源代码,我们移植 FreeRTOS 的时候就需要这部分源代码;FreeRTOS 文件夹下的 Demo 文件夹里面包含了 FreeRTOS 官方为各个单片机移植好的工程代码,FreeRTOS 为了 推广自己,会给各种半导体厂商的评估板写好完整的工程程序,这些程序就放在 Demo 这 个目录下,这部分 Demo 非常有参考价值。我们把 FreeRTOS 到 STM32 的时候, FreeRTOSConfig.h 这个头文件就是从这里拷贝过来的,我们这里不做详解

三、往裸机工程添加 FreeRTOS 源码

1. 首 先在 我们 的 STM32 裸 机工 程模 板根 目录 下新 建一 个文 件夹, 命名 为 “FreeRTOS”,并且在 FreeRTOS 文件夹下新建两个空文件夹,分别命名为“src” 与“port”,src 文件夹用于保存 FreeRTOS 中的核心源文件,也就是我们常说的 ‘.c 文件’,port 文件夹用于保存内存管理以及处理器架构相关代码,这些代码 FreeRTOS 官方已经提供给我们的,直接使用即可,在前面已经说了,FreeRTOS 是软件,我们的开发版是硬件,软硬件必须有桥梁来连接,这些与处理器架构相 关的代码,可以称之为 RTOS 硬件接口层,它们位于 FreeRTOS/Source/Portable 文 件夹下。

2. 打开 FreeRTOS V9.0.0 源码,在“FreeRTOSv9.0.0\FreeRTOS\Source”目录下找到 所有的‘.c 文件’,将它们拷贝到我们新建的 src 文件夹中,

 V9.0.0 源码,在“FreeRTOSv9.0.0\FreeRTOS\Source\portable”目 录下找到“MemMang”文件夹与“RVDS”文件夹,将它们拷贝到我们新建的 port 文件夹中,

### FreeRTOS 移植STM32 的教程与配置指南 #### 1. 准备工作 在移植 FreeRTOSSTM32 微控制器之前,需要准备必要的工具链和软件环境。这包括安装 Keil MDK 或 IAR Embedded Workbench 等 IDE 工具,或者使用开源的 GNU ARM Toolchain 和 STM32CubeIDE 来完成编译和调试任务[^4]。 #### 2. 配置 `FreeRTOSConfig.h` 文件 `FreeRTOSConfig.h` 是 FreeRTOS 的核心配置文件之一,在移植过程中起着至关重要的作用。该文件定义了调度器的行为、任务优先级范围以及其他系统参数。通常情况下,可以从官方示例工程中提取并修改这个文件以适配目标硬件平台[^3]。 以下是部分关键配置项及其说明: - **`configTICK_RATE_HZ`**: 定义 RTOS 节拍频率,默认值为 1000 Hz 表示每秒发生一次中断。 - **`configMAX_PRIORITIES`**: 设置最大支持的任务优先级数量,一般设置为 5~8 即可满足大多数应用需求。 - **`configMINIMAL_STACK_SIZE`**: 指定最小堆栈大小(单位字节),具体数值取决于目标 MCU 及其运行的应用程序复杂度。 ```c #define configTICK_RATE_HZ ( ( TickType_t ) 1000 ) #define configMAX_PRIORITIES ( 7 ) #define configMINIMAL_STACK_SIZE ( ( uint16_t ) 128 ) ``` #### 3. 初始化时钟源与时基定时器 为了使 FreeRTOS 正常运作,必须提供一个精确的时间基准作为滴答计数的基础。对于基于 Cortex-M 架构的 STM32 设备而言,SysTick 定时器通常是首选方案[^1]。然而也可以选用其他外设比如 TIMx 实现相同的功能,只要能够产生周期性的中断信号即可。 #### 4. 创建启动项目模板 利用 ST 提供的标准库或 HAL 库创建一个新的工程项目,并将 FreeRTOS 源码目录添加至其中。确保链接脚本正确指定了 SRAM/SRAM2 区域用于存储动态分配的数据结构对象。 #### 5. 编写测试用例验证基本功能 最后一步就是编写简单的应用程序来检验整个框架是否搭建成功。下面展示了一个典型的 LED 控制例子,它展示了如何创建两个不同优先级级别的线程分别控制 GPIO 输出状态的变化节奏。 ```c #include "stm32f4xx_hal.h" #include "FreeRTOS.h" #include "task.h" void vTaskBlink(void *pvParameters); uint32_t ulButtonPressed = pdFALSE; int main(void){ /* System Initialization */ HAL_Init(); __HAL_RCC_GPIOA_CLK_ENABLE(); TaskHandle_t xHandleFast; TaskHandle_t xHandleSlow; BaseType_t res_fast, res_slow; res_fast = xTaskCreate(vTaskBlink,"FAST",128,NULL,tskIDLE_PRIORITY+1,&xHandleFast); res_slow = xTaskCreate(vTaskBlink,"SLOW",128,(void*)pdMS_TO_TICKS(500),tskIDLE_PRIORITY,&xHandleSlow); if(res_fast && res_slow){ vTaskStartScheduler(); } } void vTaskBlink(void* pvParameters){ const TickType_t delay_time = *(volatile TickType_t *)pvParameters ? *(volatile TickType_t *)pvParameters : pdMS_TO_TICKS(250); while(true){ HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5); vTaskDelay(delay_time); } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值