网站开发流程分析,wordpress 百万数据库,山儿网站建设公司,哈尔滨大型网站建设前言
本文基于野火 FreeRTOS 教程#xff0c;内容是关于 FreeRTOS 官方代码的移植的注意事项#xff0c;并将野火例程中 STM32F103RC 代码移植到 STM32F103C8。
一、FreeRTOS V9.0.0 源码的获取
两个下载链接#xff1a; 官 网 代码托管
二、源码文件夹内容简介
Source…前言
本文基于野火 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)) 这样我们所有的修改就完成了尝试编译吧
后记
如果您觉得本文写得不错可以点个赞激励一下作者 如果您发现本文的问题欢迎在评论区或者私信共同探讨 共勉