当前位置: 首页 > news >正文

【学习日记】【FreeRTOS】FreeRTOS 移植到 STM32F103C8

前言

本文基于野火 FreeRTOS 教程,内容是关于 FreeRTOS 官方代码的移植的注意事项,并将野火例程中 STM32F103RC 代码移植到 STM32F103C8。

一、FreeRTOS V9.0.0 源码的获取

  • 两个下载链接:
    官 网
    代码托管

二、源码文件夹内容简介

  • Source:内核源码,我们需要的主要内容
    • 根目录:这里的 C 文件都是由 C 语言编写的,所以在各种单片机上是通用的
    • include:上述 C 文件的头文件
    • portable:存放不同编译器和不同板子使用的接口文件(大部分使用汇编编写,为了适配不同的板子)
      • KEIL:存放 port.c 接口文件,portmacro.h 是其头文件
      • MemMang:存放内存管理相关文件,主要是动态内存(堆)的配置,我们使用第四个
  • Demo:一些官方的例程(FreeRTOS 不只可以用在 STM32 上,其他单片机上也可以使用,这些例程中有专门为 STM32F1系列写的配置,也需要移植)

所谓移植,本意是将代码适配我们需要使用的单片机,也就是软件得和硬件相匹配的过程。

但是在这里,和硬件相匹配的接口文件 port.c 已经由官方写好了,我们需要的只是将这些文件放入我们的 keil 工程中,实际上是使用官方的移植的过程

详细的工程添加文件过程,请查看野火的教程。

三、FreeRTOSConfig.h 文件内容部分说明

FreeRTOSConfig.h 中,有如下这些代码:

/******************************************************************FreeRTOS与中断有关的配置选项                                                 
******************************************************************/
#ifdef __NVIC_PRIO_BITS#define configPRIO_BITS       		__NVIC_PRIO_BITS
#else#define configPRIO_BITS       		4                  
#endif
//中断最低优先级
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY			15     //系统可管理的最高中断优先级
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY	5 #define configKERNEL_INTERRUPT_PRIORITY 		( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )	/* 240 */#define configMAX_SYSCALL_INTERRUPT_PRIORITY 	( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )

首先我们先捋清楚一个概念, FreeRTOS 是在 STM32 原有的架构上实现的,也就是说,我们在考虑 FreeRTOS 的各种细节的时候不能忘记 STM32 裸机的各种细节。比如裸机上的优先级分配等等。

  • configLIBRARY_LOWEST_INTERRUPT_PRIORITY:用于配置 STM32 的中断最低优先级,这里配置为 15,也就是总共有 0 - 15 共 16 个优先级。
    注意,这里说的 STM32 的中断优先级和 FreeRTOS 的中断优先级不同,注意区分。
    STM32 的中断优先级:Cortex 内核的各种优先级,越小优先级越高
    FreeRTOS 的中断优先级:在 STM32 的中断优先级上实现的任务优先级,越大优先级越高

  • configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY:用于配置 FreeRTOS 可以管理的最高的中断优先级。这里配置为 5,结合上面 STM32 的中断优先级配置共 15 级,那么意味着 FreeRTOS 可以管理的 STM32 的中断优先级为 5 - 15,而0 - 4 FreeRTOS 就管不了。

Q:那为什么 FreeRTOS 要对 STM32 的优先级进行管理呢?
A:很重要的一点是前几篇文章提到过的临界段的保护。
还记得吗,由于 FreeRTOS 的并发性,FreeRTOS 需要确保执行一些代码的时候不能被中断打断,很常见的就是对共享资源的访问,比如全局变量的修改。在访问共享资源前我们需要先屏蔽中断,修改完毕后再开启,这就是临界端的保护,也就是 FreeRTOS 要对 STM32 的中断进行管理的原因
这里贴上临界段保护的文章:临界段保护

四、移植到 STM32F103C8

由于野火的例程中并没有 STM32F1C8T6 这个芯片,所以我们只能自己移植。

STM32 不同的芯片的命名表示如下:
在这里插入图片描述

我们使用 STM32F1RC 这个芯片进行移植。可以看到 C 表示 256K 字节的闪存,而 C8T6 只有 64K 字节。移植主要是根据不同的闪存容量进行配置的。

根据不同容量,有 ld、md、hd 三种缩写:
在这里插入图片描述
我们需要把 RC 中所有的 hd 都修改为 md进行移植。

移植分为基础的编译器移植设置和针对 FreeRTOS 的代码修改两个步骤:

1. 基础设置

① 编译器的设置

  • 点击工程配置选项
    在这里插入图片描述

  • 修改芯片,选择 STM32F1C8
    在这里插入图片描述

  • 晶振频率的修改
    在这里插入图片描述

  • 定义从 STM32F10X_HD 修改为 STM32F10X_MD
    在这里插入图片描述

② 启动文件的修改

这个启动文件就是在执行 main 函数之前执行的一个文件。

需要从 startup_stm32f10x_hd.s 换为 startup_stm32f10x_md.s

  • 从组中移除 hd 启动文件:
    在这里插入图片描述
  • 添加 md 启动文件(一般在项目目录下就有)(…\Libraries\CMSIS\startup):
    在这里插入图片描述
  • 如果项目工程下没有,可以打开 KEIL 的安装目录,在C:\Keil\ARM\PACK\Keil\STM32F1xx_DFP\2.2.0\Device\Source\ARM这个路径下找
    在这里插入图片描述
    至此,基础设置已经全部设置好了,但是如果我们此刻进行编译,可能会出现空间不足的错误。如下:
..\..\Output\Fire_FreeRTOS.axf: Error: L6406E: No space in execution regions with .ANY selector matching heap_4.o(.bss).
..\..\Output\Fire_FreeRTOS.axf: Error: L6406E: No space in execution regions with .ANY selector matching startup_stm32f10x_md.o(STACK).
..\..\Output\Fire_FreeRTOS.axf: Error: L6406E: No space in execution regions with .ANY selector matching tasks.o(.bss).
..\..\Output\Fire_FreeRTOS.axf: Error: L6406E: No space in execution regions with .ANY selector matching tasks.o(.data).
..\..\Output\Fire_FreeRTOS.axf: Error: L6406E: No space in execution regions with .ANY selector matching heap_4.o(.data).
..\..\Output\Fire_FreeRTOS.axf: Error: L6406E: No space in execution regions with .ANY selector matching system_stm32f10x.o(.data).
..\..\Output\Fire_FreeRTOS.axf: Error: L6406E: No space in execution regions with .ANY selector matching stm32f10x_rcc.o(.data).
..\..\Output\Fire_FreeRTOS.axf: Error: L6406E: No space in execution regions with .ANY selector matching port.o(.data).
..\..\Output\Fire_FreeRTOS.axf: Error: L6406E: No space in execution regions with .ANY selector matching stdout.o(.data).
..\..\Output\Fire_FreeRTOS.axf: Error: L6407E: Sections of aggregate size 0x9770 bytes could not fit into .ANY selector(s).
Not enough information to list image symbols.
Not enough information to list load addresses in the image map.
Finished: 2 information, 0 warning and 10 error messages.
"..\..\Output\Fire_FreeRTOS.axf" - 10 Error(s), 0 Warning(s).
Target not created.
Build Time Elapsed:  00:00:02

这是由于 FreeRTOS 中对于容量的配置出错,接着往下看。

2. FreeRTOS 的代码修改

打开 FreeRTOSConfig.h 文件进行配置,找到这个宏定义,它的作用是在 FreeRTOS 中定义系统可用的整个堆的大小,如果设置得太大了就会出现上文所说的空间不足的报错。

原来设置的大小是 ((size_t)(36*1024)) ,这里的 size_t 是 unsigned int,也就是 4 个字节,在 STM32 中是 1 个字的大小。

#define configTOTAL_HEAP_SIZE					((size_t)(36*1024)) 

修改为 ((size_t)(10*1024)) 即可,也就是 10K 字的大小:

//系统所有总的堆大小
#define configTOTAL_HEAP_SIZE					((size_t)(10*1024)) 

这样,我们所有的修改就完成了,尝试编译吧!

后记

如果您觉得本文写得不错,可以点个赞激励一下作者!
如果您发现本文的问题,欢迎在评论区或者私信共同探讨!
共勉!

相关文章:

【学习日记】【FreeRTOS】FreeRTOS 移植到 STM32F103C8

前言 本文基于野火 FreeRTOS 教程&#xff0c;内容是关于 FreeRTOS 官方代码的移植的注意事项&#xff0c;并将野火例程中 STM32F103RC 代码移植到 STM32F103C8。 一、FreeRTOS V9.0.0 源码的获取 两个下载链接&#xff1a; 官 网 代码托管 二、源码文件夹内容简介 Source…...

Qt 屏幕偶发性失灵

项目场景: 基于NXP i.mx7的Qt应用层项目开发,通过goodix使用触摸屏,走i2c协议。 问题描述 触摸屏使用过程中意外卡死,现场分为多种: i2c总线传输错误,直观表现为触摸屏无效,任何与触摸屏挂接在同一总线上的i2c设备,均受到干扰,并且在传输过程中内核报错以下代码: G…...

如何在pycharm中指定GPU

如何在pycharm中指定GPU 作者:安静到无声 个人主页 目录 如何在pycharm中指定GPU打开编辑配置点击环境变量添加GPU配置信息推荐专栏在Pycharm运行程序的时候,有时候需要指定GPU,我们可以采用以下方式进行设置: 打开编辑配置 点击环境变量 添加GPU配置信息 添加名称:CU…...

C#判断字符串中有没有字母,正则表达式、IsLetter

要判断字符串中是否包含字母&#xff0c;可以使用正则表达式或者循环遍历字符串的方式。 方法一&#xff1a;使用正则表达式 using System.Text.RegularExpressions;string input "Hello123"; bool containsLetter Regex.IsMatch(input, "[a-zA-Z]");上…...

Jtti:Ubuntu怎么限制指定端口和IP访问

在 Ubuntu 系统中&#xff0c;可以使用防火墙规则来限制特定的端口和IP访问。常用的防火墙管理工具是 iptables&#xff0c;以下是使用 iptables 来限制指定端口和IP访问的步骤&#xff1a; 安装 iptables&#xff1a; 如果系统中没有安装 iptables&#xff0c;可以使用以下命…...

机器学习/深度学习需要掌握的linux基础命令

很多深度学习/机器学习/数据分析等领域&#xff08;或者说大多数在Python环境下进行操作的领域&#xff09;的初学者入门时是在Windows上进行学习&#xff0c;也得益于如Anaconda等工具把环境管理做的如此友善 但如果想在该领域继续深耕&#xff0c;一定会与Linux操作系统打交…...

C++11 std::async推荐使用 std::launch::async 模式

async真假多线程 std::launch::async真多线程 std::launch::async | std::launch::deferred可能多线程 std::launch::deferred假多线程 枚举变量说明 枚举定义 enum class launch {async 1, // 0b1deferred 2, // 0b10any async | def…...

没有使用springboot 单独使用spring-boot-starter-logging

如果您不使用Spring Boot框架&#xff0c;但想单独使用Spring Boot Starter Logging&#xff0c;您可以按照以下步骤进行&#xff1a; 1. 添加Maven依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boo…...

创建Azure资源锁

锁的介绍 在Azure中&#xff0c;资源锁是一种用于保护订阅、资源组或者单个资源的机制。它可以防止对受锁定的资源进行删除或修改操作&#xff0c;帮助确保资源的连续可用性和安全性。 Azure中的资源锁可以分为两种类型&#xff1a; 删除锁&#xff08;CanNotDelete&#xf…...

卷积神经网络教程 (CNN) – 使用 TensorFlow 在 Python 中开发图像分类器

在这篇博客中,让我们讨论什么是卷积神经网络 (CNN) 以及 卷积神经网络背后的架构——旨在解决 图像识别系统和分类问题。 卷积神经网络在图像和视频识别、推荐系统和自然语言处理方面有着广泛的应用。 目录 计算机如何读取图像? 为什么不是全连接网络?...

MyBatis XML映射处理CLOB和BLOB类型

Mybatis的MapperXML映射文件应该处理数据库字段类型为CLOB和BLOB类型的数据呢&#xff1f;首先我们先看下CLOB和BLOB这两种数据类型的介绍。 介绍 使用Mybatis时涉及到两种特殊类型的处理&#xff0c;分别是Blob&#xff08;Binary Large Object&#xff09;和Clob&#xff0…...

FPGA_学习_14_第一个自写模块的感悟和ila在线调试教程与技巧(寻找APD的击穿偏压)

前一篇博客我们提到了&#xff0c;如果要使用算法找到Vbr&#xff0c;通过寻找APD采集信号的噪声方差的剧变点去寻找Vbr是一个不错的方式。此功能的第一步是在FPGA中实现方差的计算&#xff0c;这个我们已经在上一篇博客中实现了。 继上一篇博客之后&#xff0c;感觉过了很久了…...

【2023新教程】树莓派定时自动拍照并上传腾讯云对象存储COS

1 换源 仅适用于Release date: May 3rd 2023、Debian version: 11 (bullseye)这个树莓派OS版本&#xff0c;其他版本不保证有效。 首先使用如下命令&#xff0c;查看自己树莓派的架构。 uname -a结果如下&#xff1a; 如果红圈处显示为aarch64&#xff0c;使用命令sudo na…...

校企合作谋发展 合作共赢谱新篇|云畅科技与湖南民族职业学院签订校企合作协议

产业是经济发展的重要引擎&#xff0c;人才是产业发展的重要资源。为积极探索软件人才培育新路径&#xff0c;共商政产学研协同新机制&#xff0c;8月8日&#xff0c;云畅科技与湖南省民族职业学院教育技术学院软件技术专业签订校企合作协议。 会上&#xff0c;学院副校长王志平…...

vue技术学习

vue快速入门 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>vue快速入门</title> </head> <body> <!--老师解读 1. div元素不是必须的&#xff0c;也可以是其它元素&#xff0…...

基于空间的图卷积神经网络:GNN

目录 欧氏空间中神经网络发挥巨大最作用&#xff0c;DNA&#xff0c;知识图谱三维或者多维空间不行 邻接矩阵实现图结构的矩阵化表示&#xff1a;造梦师 局和操作实现层内消息传递&#xff1a;带线的连接机传递消息 GCN通过邻域聚合实现特征提取 SVM支持向量机 ​编辑 硬分…...

.net core发布到IIS上出现 HTTP 错误 500.19

1.检查.net core 环境运行环境是否安装完成&#xff0c;类似如下环境 2.IIS是否安装全 本次原因就是IIS未安装全导致的 按照网上说的手动重启iis&#xff08;iisreset&#xff09;也不行...

01_Redis单线程与多线程

01——Redis单线程与多线程 一、Redis是单线程还是多线程 在谈Redis的单线程或多线程时&#xff0c;需要根据版本来区分。 在redis 3.x之前&#xff0c;redis是单线程的从redis 4.x开始&#xff0c;redis引入多线程。处理客户端请求时&#xff0c;使用单线程&#xff1b;在异…...

机器学习——随机森林【手动代码】

随机森林这个内容&#xff0c;是目前来说。。。最最最简单&#xff0c;最好理解&#xff0c;应该也是最好实现的了&#xff01;&#xff01;&#xff01; 先挖坑&#xff0c;慢慢填 随机森林&#xff0c;这个名字取得&#xff0c;果然深得该算法的核心精髓&#xff0c;既随机&a…...

Vue 2 处理边界情况

访问元素和组件 通过Vue 2 组件基础一文的学习&#xff0c;我们知道组件之间可以通过传递props或事件来进行通信。 但在一些情况下&#xff0c;我们使用下面的方法将更有用。 1.访问根实例 根实例可通过this.$root获取。 我们在所有子组件中都可以像上面那样访问根实例&…...

开源像素艺术工具推荐:Pixel Fashion Atelier vs Automatic1111定制化对比

开源像素艺术工具推荐&#xff1a;Pixel Fashion Atelier vs Automatic1111定制化对比 1. 工具概览 1.1 Pixel Fashion Atelier简介 Pixel Fashion Atelier是一款基于Stable Diffusion与Anything-v5的图像生成工作站。它采用独特的复古日系RPG界面设计&#xff0c;将AI图像生…...

Windows下FFmpeg环境配置全攻略:从下载到视频剪辑实战

Windows下FFmpeg环境配置全攻略&#xff1a;从下载到视频剪辑实战 在数字内容创作爆发的时代&#xff0c;视频处理能力已成为开发者和创作者的必备技能。FFmpeg作为开源多媒体处理领域的"瑞士军刀"&#xff0c;其强大功能与跨平台特性使其成为处理音视频文件的首选工…...

如何高效访问优质内容?bypass-paywalls-chrome-clean工具全方位使用指南

如何高效访问优质内容&#xff1f;bypass-paywalls-chrome-clean工具全方位使用指南 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 在信息爆炸的数字时代&#xff0c;大量优质内容被…...

RWKV7-1.5B-G1A入门实战:手把手教你写文案、做总结、玩对话

RWKV7-1.5B-G1A入门实战&#xff1a;手把手教你写文案、做总结、玩对话 1. 认识RWKV7-1.5B-G1A RWKV7-1.5B-G1A是一个基于RWKV-7架构的多语言文本生成模型&#xff0c;特别适合处理基础问答、文案续写、简短总结和轻量中文对话任务。这个1.5B参数的模型在保持良好生成质量的同…...

MD_DS3231库:工业级DS3231 RTC全功能驱动设计与实践

1. MD_DS3231库深度解析&#xff1a;面向工业级RTC应用的DS3231全功能驱动设计与工程实践DS3231是Maxim&#xff08;现属Analog Devices&#xff09;推出的高精度IC实时时钟芯片&#xff0c;其2ppm温漂特性、内置温度补偿晶振&#xff08;TCXO&#xff09;、独立电池供电备份、…...

告别手动编译:用Conda在Ubuntu 20.04上一键安装与管理SUMO交通仿真环境

告别手动编译&#xff1a;用Conda在Ubuntu 20.04上一键安装与管理SUMO交通仿真环境 在交通工程和智能驾驶研究领域&#xff0c;SUMO&#xff08;Simulation of Urban MObility&#xff09;作为开源的微观交通仿真工具&#xff0c;正被越来越多的研究者和开发者采用。然而&#…...

15秒生成12个测试用例:AI写的测试比我写的还全

说实话&#xff0c;我一直是个"测试拖延症患者"。每次写完功能代码&#xff0c;心里都清楚应该补测试&#xff0c;但手就是敲不下去。想着"这个功能这么简单&#xff0c;不会有问题的"&#xff0c;然后安慰自己"等有空了再补"。结果呢&#xff1…...

UE4.62生成sln时失败:Missing .../DotNET/UnrealBuildTool/UnrealBuildTool/UnrealBuildTool.exe

问题1&#xff1a; vs编译报错&#xff0c;以为是热加载&#xff0c;把项目的几个文件删了&#xff0c;想右键点击Generate Visual Studio Project Files重构&#xff0c;报错。 解决方法&#xff1a;: 是看m0_62179790这个博主解决的。 只要把下面这行东西添加到你自己的UE…...

OpenClaw自动化测试:Qwen3-32B批量执行LeetCode题目

OpenClaw自动化测试&#xff1a;Qwen3-32B批量执行LeetCode题目 1. 为什么需要自动化编程能力测试 作为一名长期关注AI编程辅助工具的技术博主&#xff0c;我一直在寻找能够客观评估大模型编程能力的方法。传统的单次对话测试往往带有偶然性&#xff0c;无法系统性地反映模型…...

ROS2数据录制实战:手把手教你用ros2 bag记录Duckiebot图像数据(附常见错误排查)

ROS2数据录制实战&#xff1a;从Duckiebot仿真到真实场景的全流程指南 在机器人开发过程中&#xff0c;数据记录与分析是算法验证和系统调试的关键环节。ROS2提供的ros2 bag工具链为开发者提供了强大的数据采集能力&#xff0c;但实际应用中往往会遇到各种意料之外的问题。本文…...