【学习日记】【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)) 

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

后记

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/81626.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DevExpress WinForms数据编辑器组件,提供丰富的数据输入样式!(二)

DevExpress WinForms超过80个高影响力的WinForms编辑器和多用途控件&#xff0c;从屏蔽数据输入和内置数据验证到HTML格式化&#xff0c;DevExpress数据编辑库提供了无与伦比的数据编辑选项&#xff0c;包括用于独立数据编辑或用于容器控件(如Grid, TreeList和Ribbon)的单元格。…

POI groupRow 折叠分组,折叠部分不显示问题

折叠组是什么&#xff1f;如图就是用POI 实现的&#xff0c;代码很简单&#xff1a;sheet.groupRow(开始行&#xff0c;结束行)即可 但是万万没想到&#xff0c;最终实现出的结果&#xff0c;合并的组&#xff0c;有一部分并没有渲染出来&#xff0c;如下图&#xff1a; 因为我…

【分享】小型园区组网场景

小型园区组网图 在小型园区中&#xff0c;S2700&S3700通常部署在网络的接入层&#xff0c;S5700&S6700通常部署在网络的核心&#xff0c;出口路由器一般选用AR系列路由器。 接入交换机与核心交换机通过Eth-Trunk组网保证可靠性。 每个部门业务划分到一个VLAN中&#…

英特尔开始加码封装领域 | 百能云芯

在积极推进先进制程研发的同时&#xff0c;英特尔正在加大先进封装领域的投入。在这个背景下&#xff0c;该公司正在马来西亚槟城兴建一座全新的封装厂&#xff0c;以加强其在2.5D/3D封装布局领域的实力。据了解&#xff0c;英特尔计划到2025年前&#xff0c;将其最先进的3D Fo…

SocketTools.NET 11.0.2148.1554 Crack

添加新功能以简化使用 URL 建立 TCP 连接的过程。 2023 年 8 月 23 日 - 12:35新版本 特征 添加了“HttpGetTextEx”函数&#xff0c;该函数在返回字符串缓冲区中的文本内容时提供附加选项。添加了对“FileTransfer”.NET 类和 ActiveX 控件中的“GetText”和“PutText”方法的…

前端工程化之模块化

模块化的背景 前端模块化是一种标准&#xff0c;不是实现理解模块化是理解前端工程化的前提前端模块化是前端项目规模化的必然结果 什么是前端模块化? 前端模块化就是将复杂程序根据规范拆分成若干模块&#xff0c;一个模块包括输入和输出。而且模块的内部实现是私有的&…

精准高效农业作业,植保无人机显身手

中国作为农业大国&#xff0c;拥有约18亿亩的农田&#xff0c;每年都需要进行种子喷洒和农药施用等农业作业&#xff0c;对于普通农户来说&#xff0c;这是一项耗时耗力的工程&#xff0c;同时&#xff0c;人工喷洒农药极易造成农药慢性中毒&#xff0c;对农民的身体健康产生极…

横扫“盲区”、“看透”缺陷,维视智造推出短波红外相机

在可见光领域&#xff0c;工业相机的视觉应用已经十分成熟&#xff0c;但在日常的客户咨询中&#xff0c;我们也经常接到一些“超纲需求”——客户想要检测“白底上的白色缺陷”、“不透明包装内的透明物体有无”等&#xff0c;均属于可见光无法实现的检测&#xff0c;而市面上…

飞天使-k8s基础组件分析-安全

文章目录 名称空间解释访问kubernetes API的控制RBAC的介绍 kubeconfig用户的创建集群默认角色 给组创建授权针对pod配置服务账户参考文档 名称空间解释 名字是啥&#xff1f; 答&#xff1a;集群中每个对象的名称对于该类型的资源都是唯一的。并且每一个对象在整个集群中也有…

Postman测WebSocket接口

01、WebSocket 简介 WebSocket是一种在单个TCP连接上进行全双工通信的协议。 WebSocket使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务端主动向客户端推送数据。在WebSocket API中&#xff0c;浏览器和服务器只需要完成一次握手&#xff0c;两者之间就直…

Maven介绍与配置+IDEA集成Maven+使用Maven命令

目录 一、Maven简介 二、配置环境变量 三、IDEA集成Maven 1.配置本地仓库地址 2.集成Maven 3. pom.xml文件介绍 四、Maven命令 jar包太多、jar包相互依赖、不方便管理、项目编译还需要jar包&#xff0c;Maven工具来帮你&#xff01; 一、Maven简介 Maven 是 Apache 软…

673. 最长递增子序列的个数

673. 最长递增子序列的个数 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;方法一&#xff1a;动态规划方法二&#xff1a;贪心 前缀和 二分查找 参考代码&#xff1a;__673最长递增子序列的个数__动态规划__673最长递增子序列的个数__贪心_前缀和_二分查找…