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

这篇具有很好参考价值的文章主要介绍了【学习日记】【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 不同的芯片的命名表示如下:
【学习日记】【FreeRTOS】FreeRTOS 移植到 STM32F103C8,RTOS,学习,stm32,嵌入式硬件,RTOS

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

根据不同容量,有 ld、md、hd 三种缩写:
【学习日记】【FreeRTOS】FreeRTOS 移植到 STM32F103C8,RTOS,学习,stm32,嵌入式硬件,RTOS
我们需要把 RC 中所有的 hd 都修改为 md进行移植。

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

1. 基础设置

① 编译器的设置

  • 点击工程配置选项
    【学习日记】【FreeRTOS】FreeRTOS 移植到 STM32F103C8,RTOS,学习,stm32,嵌入式硬件,RTOS

  • 修改芯片,选择 STM32F1C8
    【学习日记】【FreeRTOS】FreeRTOS 移植到 STM32F103C8,RTOS,学习,stm32,嵌入式硬件,RTOS

  • 晶振频率的修改
    【学习日记】【FreeRTOS】FreeRTOS 移植到 STM32F103C8,RTOS,学习,stm32,嵌入式硬件,RTOS

  • 定义从 STM32F10X_HD 修改为 STM32F10X_MD
    【学习日记】【FreeRTOS】FreeRTOS 移植到 STM32F103C8,RTOS,学习,stm32,嵌入式硬件,RTOS

② 启动文件的修改

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

需要从 startup_stm32f10x_hd.s 换为 startup_stm32f10x_md.s

  • 从组中移除 hd 启动文件:
    【学习日记】【FreeRTOS】FreeRTOS 移植到 STM32F103C8,RTOS,学习,stm32,嵌入式硬件,RTOS
  • 添加 md 启动文件(一般在项目目录下就有)(…\Libraries\CMSIS\startup):
    【学习日记】【FreeRTOS】FreeRTOS 移植到 STM32F103C8,RTOS,学习,stm32,嵌入式硬件,RTOS
  • 如果项目工程下没有,可以打开 KEIL 的安装目录,在C:\Keil\ARM\PACK\Keil\STM32F1xx_DFP\2.2.0\Device\Source\ARM这个路径下找
    【学习日记】【FreeRTOS】FreeRTOS 移植到 STM32F103C8,RTOS,学习,stm32,嵌入式硬件,RTOS
    至此,基础设置已经全部设置好了,但是如果我们此刻进行编译,可能会出现空间不足的错误。如下:
..\..\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)) 

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

后记

如果您觉得本文写得不错,可以点个赞激励一下作者!
如果您发现本文的问题,欢迎在评论区或者私信共同探讨!
共勉!文章来源地址https://www.toymoban.com/news/detail-670756.html

到了这里,关于【学习日记】【FreeRTOS】FreeRTOS 移植到 STM32F103C8的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 全网最简单的stm32f103c8t6移植ucosiii教程(附移植好的工程)

       最近在做一个机器人项目,需要使用到stm32f103c8t6核心板。考虑程序中的多任务特性,因此决定使用ucosiii用于多任务管理。ucosiii移植可能对于一些嵌入式老鸟来说,可能是信手拈来,但是对于很多新手特别是刚入门的小白来说还是有一定的难度的。尤其是全网的移植教程

    2024年02月16日
    浏览(17)
  • 【U8G2库移植到STM32F103C8T6上】

    最近在B站上刷到了一位up主设计的oled丝滑界面WouoUI,一个优雅得比较像话的UI框架,128 * 64 经过询问,得知up用的是U8G2库,U8G2多用于arduino编译器上,但是我们学校常用的是stm32。 所以经过一段时间的研究,我将U8G2库移植到了stm32f103c8t6上进行使用。 关于U8G2的使用,可以参考

    2024年02月11日
    浏览(17)
  • 正点原子stmf103zet6代码移植为stm32f103c8t6(库函数版)

    目录 1、打开正点原子的工程模板template, 点击魔术棒  2、 修改芯片型号 为stm32f103c8

    2024年02月01日
    浏览(26)
  • STM32F103C8T6的学习(4)——外部中断

    :  本教程基于up主江科大自化协——“STM32入门教程”记录的个人学习笔记 跳转链接: STM32入门教程-2022持续更新中_哔哩哔哩_bilibili  中断: 在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后

    2024年02月02日
    浏览(22)
  • 初步了解STM32的学习笔记(以STM32F103C8T6为例)

      STM32F103C8T6属于主流系列STM32F1 内核是ARM Cortex-Mex3 主频为72Hz RAM:20K(SRAM) ROM:64K(Flash) 封装:LQFP48 供电:2~3.6V(一般为3.3) (注意:以前51用的是5V,而USB也是5V,所以直接插上,而stm32会加上一个稳压芯片,让电压为3.3V) (所有图都是用的是B站上整理过的)  表里面

    2024年02月05日
    浏览(22)
  • 学习OSAL并移植到STM32F103开发板上

    代码参考出处:https://github.com/mcuwty/osal.git 我在此此基础上做了整理,移植到了stm32f103上:demo链接: https://pan.baidu.com/s/1WoL8QCnicxO11hdeh4uh2Q 提取码: wsn3 参考资料: 学习笔记(二)——BLE协议栈OSAL - 知乎 (zhihu.com)   OSAL:即操作系统抽象层,它并不是一个传统意义上的操作系统

    2024年03月26日
    浏览(60)
  • Stm32f103c8t6(proteus仿真)学习——3.按键控制LED灯

    按键:button 电阻:res 先配置LED灯的GPIO 编写LED亮灭的函数 实现按下按键LED灯的状态取反 led.c总代码 先配置按键的GPIO 获取当前按键键值的函数 key.c总代码 5.1 按键按下实现LED亮或者灭 仿真效果图: 5.2 按键按下实现LED状态取反 仿真效果图: 百度网盘 链接:https://pan.baidu.co

    2024年02月07日
    浏览(20)
  • Stm32f103c8t6(proteus仿真)学习——1.点亮LED流水灯

    软件准备:keil uVsion 5 和 proteus 8.15 打开proteus8.15 - 新建项目 - 改名 - 一直next 鼠标右键 - 放置 - 元件 - From Libraries 搜索Stm32 - 选择stm32f103c8 画出点亮一个LED灯的原理图 提示,各元器件搜索: 主控芯片:stm32 电阻:res LED灯:led 鼠标右键 - 放置 - 元件 - From Libraries 地和VCC 在左侧

    2024年02月08日
    浏览(21)
  • stm32f103VET6和stm32f103c8t6有什么区别?

    我来终结下这个问题。 这两款单片机我都用过,其中无际单片机特训营其中一款wifi报警主机项目就是用了stm32f103c8t6。  stm32f103VET6和stm32f103c8t6都是STMicroelectronics公司推出基于ARM Cortex-M3内核的单片机。 它们在硬件规格和性能上存在一些差异,下面我详细讲解下它们的差异之处

    2024年02月15日
    浏览(21)
  • STM32f103c8t6小白学习笔记(一)从点灯开始之USB转TTL

    步骤一:与stm32f103c8t6最小系统板接线:       一共四根,PA9,PA10分别对应连接RXD,TXD (如下图),GND连GND ,3V3连32系统板的3.3V,跳线帽将5V和VCC相连(如上图),原因 from数据手册 步骤二:跳线帽:接法如上图 BOOT0置1,BOOT1置0 ,原因from参考手册      因为我使用的是串口下载模

    2023年04月09日
    浏览(13)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包