stm32 移植 FreeRTOS

2023-05-16

1. 建立裸机工程

在移植 freeRTOS 之前需要创建一个 stm32f103 的 keil5 裸机工程。所谓裸机工程就是包含 stm32f103 单片机的启动文件,外设驱动固件库的文件集合,也可以说是支持裸机开发的一个单片机运行环境。通过这样的一个工程即可进行 stm32 单片机的驱动开发。同时对于 freeRTOS 移植也需要一个这样的工程环境,换而言之 freeRTOS 的移植和配置需要用到裸机工程中的文件。
20211129224921.jpg

2. 移植相关文件版本

freeRTOS 使用 9.00 版本(这篇文章同样适用 FreeRTOSv10.00版本),可以通过 github 官网搜索进行下载,或通过我的 github 链接 https://github.com/zhbi98/FreeRTOSv9.0.0 下载,下载后将得到一个 FreeRTOSv9.0.0-master.zip 这样的压缩包,该压缩包即为 freeRTOS 源码文件。
stm32 具体型号为 stm32f103vet6(当然如果使用 stm32f4xx系列的移植,本文章移植方法也是适用的,只是一些文件选择不同,下面将会说到如果是 stm32f4xx 如何选择)。

3. 完整 freeRTOS 文件概览

20211129230027.jpg
**FreeRTOS:**该文件夹存放 freertos 的源码(Source 文件夹),移植参考工程(Demo 文件夹),许可证(License 文件夹)。注意:该路径下的源码(Source 文件夹),和移植参考工程(Demo 文件夹)即为移植需要使用的
**FreeRTOS-Plus:**该文件夹存放其他相关应用组件,比如网络等,如果不开发网络相关的设备一般不使用。

源码相关文件(Source 文件夹),这里就包含了 freeRTOS 的所有 C 语言源码文件了,所以可以知道 freeRTOS 整体的源码并不多,如下图。
20211129230937.jpg

4. 删除源码包中不需要使用的文件

FreeRTOS-Plus 文件夹: 该文件夹为网络相关组件和网络相关使用参考,如果不使用网络那么可以直接将这个文件夹删除。
网页 HTML 文件: 一般不使用源码包中凡是 HTML 文件均可直接删除。
License 文件夹: 不需要的话可以直接删除。
Demo 文件夹: 这里留下所使用的 STM32F103 单片机的移植参考,其余非自己使用单片机型号的移植参考直接删除。

5. 移植 freeRTOS 文件

5.1. 需要使用的 C (源文件)文件

路径:FreeRTOS\Source\ 中的 croutine.clist.cqueue.ctimer.ctasks.c
路径:FreeRTOS\Source\portable\RVDS\ARM_CM3\ 中的 port.c(如果是 stm32f4则选择 ARM_CM4\ 中的 port.c)。
路径:FreeRTOS\Source\portable\MemMang\ 中的 heap_2.c

以上这些文件需要添加到 keil 中,也就是前面提到的裸机工程中,在裸机 keil 工程中新建一个 FreeRTOS 文件夹将上面的文件添加到该文件夹中。
20211204233949.jpg

5.2. 需要使用的 H (头文件)文件

路径:FreeRTOS\Source\include\ 中的所有 .h 文件。
路径:FreeRTOS\Source\portable\RVDS\ARM_CM3\ 中的 portmacro.h 文件(如果是 stm32f4则选择 ARM_CM4\ 中的 portmacro.h)。
路径:FreeRTOS\Demo\CORTEX_STM32F103_Keil\ 中的 FreeRTOSConfig.h 文件(如果是 stm32f4则选择 STM32F4xx_Keil 中的 FreeRTOSConfig.h)。

以上这些头文件所在的路径同样需要导入 keil 中。
20211204234035.jpg

6. 修改文件

6.1. 修改 stm32 启动文件 startup_stm32f10x_hd.s

以下的修改是为了将 freeRTOS 的三个中断函数导入到 stm32 的汇编启动文件中。
20211205000209.jpg

以下修改是为了将上面导入的 freeRTOS 中断函数替换 stm32 本身的中断函数。
20211205000849.jpg

第二种办法是不将 freeRTOS 的三个中断函数导入到 stm32 的汇编启动文件中进行替换,而是通过在 freeRTOS 配置文件 FreeRTOSConfig.h 中将这三个函数使用宏定义直接替换,这个操作比较简便。
20211205104431.jpg

修改 stm32 堆栈的大小
20211205104136.jpg

6.2. 修改 freeRTOS 配置文件 FreeRTOSConfig.h

在这里配置 stm32 单片机的系统时钟,这里配置为 72MHz,配置系统调度时间片,这里设置为 1000Hz 即 1ms 的时间片。
20211205105055.jpg

通过以上的修改就移植完成了。

6.3. 验证任务调度

#include "stm32f10x.h"

#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "croutine.h"
#include "semphr.h"

// Lowest priority 0
#define TASK1_PRIORITY 1
#define TASK1_STACK_SIZE 512

#define TASK2_PRIORITY 2
#define TASK2_STACK_SIZE 512

TaskHandle_t task1_handler;
TaskHandle_t task2_handler;

static void task1(void * pvParameters)
{
    for (;;) {
        printf("%s\n", "task1");
        vTaskDelay(1000);
    }
}

static void task2(void * pvParameters)
{
    for (;;) {
        printf("%s\n", "task2");
        vTaskDelay(1000);
    }
}

static unsigned char task_init()
{
    BaseType_t status = pdPASS;

    status = xTaskCreate(task1,
            "task1",
            TASK1_STACK_SIZE,
            NULL,
            TASK1_PRIORITY,
            &task1_handler);

    status = xTaskCreate(task2,
            "task2",
            TASK2_STACK_SIZE,
            NULL,
            TASK2_PRIORITY,
            &task2_handler);

    return status;
}

int main()
{
    if (task_init() == pdPASS)
        vTaskStartScheduler();

    for (;;) {

    }
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

stm32 移植 FreeRTOS 的相关文章

  • 优化 ARM Cortex M3 代码

    我有一个 C 函数 它尝试将帧缓冲区复制到 FSMC RAM 这些函数将游戏循环的帧速率降低至 10FPS 我想知道如何分析反汇编的函数 我应该计算每个指令周期吗 我想知道CPU把时间花在哪里 在哪个部分 我确信该算法也是一个问题 因为它的
  • 139-基于stm32单片机老人居家监护报警系统Proteus仿真+源程序

    资料编号 139 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 MQ4传感器 电位器模拟 MQ2传感器 电位器模拟 蜂鸣器 电机 制作一个基于stm32单片机老人居家监护报警系统Proteus仿真 2 通过MQ2传
  • 140-基于stm32单片机智能晾衣杆控制系统Proteus仿真+源程序

    资料编号 140 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 ds1302时钟 光敏传感器 蜂鸣器 LED灯 制作一个基于stm32单片机智能晾衣杆控制系统Proteus仿真 2 通过光敏传感器
  • 138-基于stm32单片机汽车多功能仪表盘显示系统Proteus仿真+源程序

    资料编号 138 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 ds1302时钟 LED灯 蜂鸣器 电位器 制作一个基于stm32单片机汽车多功能仪表盘显示系统Proteus仿真 2 通过DHT1
  • 135-基于stm32单片机超声波非接触式感应水龙头控制系统Proteus仿真+源程序

    资料编号 135 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 电机 超声波传感器 制作一个基于stm32单片机超声波非接触式感应水龙头控制系统Proteus仿真 2 通过DHT11传感器检测当前
  • STM32用一个定时器执行多任务写法

    文章目录 main c include stm32f4xx h uint32 t Power check times 电量检测周期 uint32 t RFID Init Check times RFID检测周期 int main Timer
  • HAL库学习

    CMSIS简介 CMSIS Cortex Microcontroller Software Interface Standard 微控制器软件接口标准 由ARM和其合作的芯片厂商 ST NXP 软件工具厂商 KEIL IAR 共同制定的标准
  • SHT10温湿度传感器——STM32驱动

    实验效果 硬件外观 接线 3 3V供电 IIC通讯 代码获取 查看下方 END
  • [MM32硬件]搭建灵动微MM32G0001A6T的简易开发环境

    作为学习单片机的经典 自然是通过GPIO点亮LED 或者是响应按钮的外部中断例程 这我们看看SOP8封装的芯片MM32G0001A6T得引脚 除了VDD和GND固定外 我们可以使用PA14 PA1 PA13 PA15 PA2 PA3这六个G
  • 硬件基础-电容

    电容 本质 电容两端电压不能激变 所以可以起到稳定电压作用 充放电 电容量的大小 想使电容容量大 使用介电常数高的介质 增大极板间的面积 减小极板间的距离 品牌 国外 村田 muRata 松下 PANASONIC 三星 SAMSUNG 太诱
  • 解决KEIL编译慢问题

    两种方案 使用v6版本的ARM Compiler 如果v6版本编译不过 必须使用v5版本的 则可以勾选掉Browse Information选项 提升很明显 1分多钟能优化到几秒 看代码量 但是这个有个弊端 在KEIL中会影响函数跳转 建议
  • 在 Atollic TrueStudio、STM32CubeMX 中导入 C 库

    我目前正在开发 STM32F767ZI Nucleo 板和一个小安全芯片 microchip atecc508a 通过 i2c 连接进行连接 该芯片有一个可用的库加密验证库 https github com MicrochipTech cr
  • 擦除后无法写入闪存

    所以我不能在擦除后直接写入内部闪存 如果写操作之前没有擦除操作 那么我可以 有什么想法吗 编程函数返回 成功写入 值 但查看内存时 没有写入任何数据 这是代码 uint32 t pageAddress 0x08008000 uint16 t
  • 毕设开题分享 单片机智能教室系统(智能照明+人数统计)

    1 简介 Hi 大家好 今天向大家介绍一个学长做的单片机项目 单片机智能教室系统 智能照明 人数统计 大家可用于 课程设计 或 毕业设计 项目分享 https gitee com feifei1122 simulation project
  • CMSIS & STM32,如何开始? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在 STM32 上使用 CMSIS 启动项目 网上一搜 没找到具体的教程 有些使用 SPL 开始项
  • Arm:objcopy 如何知道 elf 中的哪些部分要包含在二进制或 ihex 中?

    我正在开发一个项目 其中涉及解析arm elf 文件并从中提取部分 显然 elf 文件中有很多部分没有加载到闪存中 但我想知道 objcopy 到底如何知道要在二进制文件中包含哪些部分以直接闪存到闪存中 以arm elf文件的以下reade
  • 嵌入式 C++11 代码 — 我需要 volatile 吗?

    采用 Cortex M3 MCU STM32F1 的嵌入式设备 它具有嵌入式闪存 64K MCU固件可以在运行时重新编程闪存扇区 这是由闪存控制器 FMC 寄存器完成的 所以它不像a b那么简单 FMC 获取缓冲区指针并将数据刻录到某个闪存
  • 有可用的 FreeRTOS 解释语言库吗?

    我在一家公司工作 该公司使用 FreeRTOS 为多个设备创建固件 最近 我们对新功能的要求已经超出了我们固件工程师的工作能力 但我们现在也无力雇用任何新人 即使进行微小的更改 也需要固件人员在非常低的级别上进行修改 我一直在为 FreeR
  • 小型 ARM 微控制器的 RTOS 内核之间的可量化差异 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有许多不同的 RTOS 可用于微控制器 我专门寻找支持 ARM Cortex M 处理器的 RTOS 另外 我对闭源解决方案不感兴趣 试图从网站
  • stm32l0: 执行MI命令失败。使用 vFlashErase 数据包擦除闪存时出错

    我正在使用 Nucleo STM32L031 和 AC6 STM32 工作台 eclipse 我编写应用程序并进入调试模式 一切正常 直到我在应用程序中添加另一个功能 我注意到当我删除 评论 新函数 软件可以再次进入调试模式 但是当我添加

随机推荐

  • matlab中文乱码的解决(UTF-8不支持的问题)

    1 解决editor中的UTF 8不支持的问题 xff0c 需要加入下面几行 在matlab 安装的目录的bin子文件夹中找到lcdata xml文件 xff1a 打开加入 lt Locale entries example gt lt l
  • FreeRTOS分析

    freertos是一个轻量级的rtos xff0c 它目前实现了一个微内核 xff0c 并且port到arm7 avr pic18 coldfire等众多处理器上 xff1b 目前已经在rtos的市场上占有不少的份额 它当然不是一个与vxw
  • STM32之FreeRTOS

    学习操作系统 xff0c 我并没有一开始就学习UCOS xff0c 而是选择了FreeRTOS FreeRTOS可以方便地搭建在各个平台上 xff0c 因为汇编相关 xff0c 都已经由官方完成 xff0c 我们要做的仅是添加自己的代码 x
  • FrankMocap Fast monocular 3D Hand and Body Motion Capture by Regression and Intergretion

    paper title FrankMocap Fast monocular 3D Hand and Body Motion Capture by Regression and Intergretion paper link https ar
  • 矩阵中的路径(C++)

    题目 xff1a 请设计一个函数 xff0c 用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径 路径可以从矩阵中的任意一个格子开始 xff0c 每一步可以在矩阵中向左 xff0c 向右 xff0c 向上 xff0c 向下移动一个格
  • TensorFlow入门(五)多层 LSTM 通俗易懂版

    欢迎转载 xff0c 但请务必注明原文出处及作者信息 64 author huangyongye 64 creat date 2017 03 09 前言 根据我本人学习 TensorFlow 实现 LSTM 的经历 xff0c 发现网上虽然
  • 程序员面试经历

    现在找工作 已经没有了毕业以后那时候找工作的那种紧张心情 自从在上家公司离职以后 自己进行了一段时间的工作 世界上本来没有面霸 面试的多了 也就成了面霸 不得不承认 一开始自己面试是有些紧张 但是 面试的多了 也就不觉得紧张 反而有些平淡了
  • keil中快速注释一段代码

    方法一 xff1a 在该段代码的前面加 在该段代码的后面加 代码 方法二 xff1a 自行添加快捷键 lt 1 gt 点击configuration lt 2 gt 点击shortcut keys xff0c 选择Edit Advanced
  • java实习两个月总结

    实习两个月总结 刚开始实习的时候激情满满 慢慢的激情也退却了 在杭州月薪3000干了两个月我自己都觉得不可思议 杭州的物价大家有目共睹 先谈谈收获 认识了java8的新特性 了解了开发中常用的工具和工具包 持续集成部署的jenkins sw
  • 一台电脑如何装3个系统操作教程

    很多小伙伴都想安装个三系统试试 xff0c 但是安装三系统需要一些装机基础才能成功安装 xff0c 电脑如何安装三系统 接下来快启动小编带大家了解电脑如何安装三系统的详细操作 xff0c 希望给走入迷途的小伙伴一些正能量 电脑三系统安装准备
  • Modbus的常见问题解答:多台设备如何连接?为什么要加终端电阻?RS485总线可挂接多少个设备?在RS485通讯中,最大传输距离是多少?

    多台RS485设备如何连接呢 xff1f 使用屏蔽双绞线 xff0c 采用手拉手菊花链式拓扑结构将网关和各串行设备节点连接起来 xff0c 并在网络起始端和末尾端设备的RS485 43 和RS485 之间各并接一个120 电阻以减少信号在两
  • ADRC学习|TD微分跟踪器(原理解析和Matlab实现)

    系列文章目录 TD微分跟踪器 原理解析和Matlab实现 状态扩张观测器 目录 系列文章目录前言微分跟踪器作用原理线性TD非线性TDTD的一个定理最速离散控制函数 Matlab实现参考文献 前言 学习韩老师的ADRC xff0c 把学习过程
  • ROS踩坑|warning:clock skew detected. Your build may be incomplete

    报错展示 warning xff1a clock skew detected Your build may be incomplete 问题分析 ROS编译时遇到这个问题95 是因为系统时钟错误了 xff0c 比如说你之前的编译的时间时20
  • ros学习|功能包相关|查找、安装、卸载删除某个功能包

    在运行别人的demo时 xff0c 是不是会出现找不到功能包的情况 所以查找 安装和卸载某个功能包是蛮重要的 查找 查询当前安装完成的所有包文件 rospack list 查询ros的所有功能包 span class token funct
  • Vector数组类型在ROS开发中的用法小结

    目录 前言数组类型在不同消息类型中的定义在ROS消息中的定义在C 43 43 中定义数组 vector数组的一些常用操作基本操作求数组的最值遍历数组排序数组查找数组注意 前言 ROS系统的一个显著优势就是分布式和灵活性 xff0c 用户可以
  • Java 核心技术卷一 随笔

    Java 易混 xff0c 重难点汇总 1 基础篇 整型 浮点 final 一般用于指示常量 xff0c 即变量只能被赋值一次 一旦被赋值 xff0c 就不能更改了 xff08 即没有set方法 xff09 命名规则一般使用全大写及下划线
  • Linux 面试最常问的十个问题

    如果你要去面试一个Linux系统运维工程师的职位 xff0c 下面这十个最常见的问题一定要会 xff0c 否则你的面试可能就危险了 这些都是比较基本的问题 xff0c 大家要理解 xff0c 不能光死记硬背 1 如何查看系统内核的版本 这里
  • 处理iOS开发中的各种警告

    iOS开发中我们会遇到各种警告 包括第三方不再支持更新导致的警告 苹果一些过时方法的警告 其中尤其是ASIHttpRequest的不支持更新导致有很多的警告 所以我在这里做了罗列 Semantic Warnings WarningMessa
  • c#利用虚拟串口工具进行串口通信数据的发送和接收

    原文 xff1a 我的个人博客 串口通信 串口通信 xff08 Serial Communications xff09 的概念非常简单 xff0c 串口按位 xff08 bit xff09 发送和接收字节 尽管比按字节 xff08 byte
  • stm32 移植 FreeRTOS

    1 建立裸机工程 在移植 freeRTOS 之前需要创建一个 stm32f103 的 keil5 裸机工程 所谓裸机工程就是包含 stm32f103 单片机的启动文件 xff0c 外设驱动固件库的文件集合 xff0c 也可以说是支持裸机开发