【FreeRTOS】【STM32】02 FreeRTOS 移植

基于
[野火®]《FreeRTOS%20内核实现与应用开发实战—基于STM32》
正点原子《STM32F429+FreeRTOS开发手册_V1.2》

准备

基础工程,例如点灯
FreeRTOS 系统源码

FreeRTOS 移植

上一章节已经说明了Free RTOS的源码文件在移植时所需要的,FreeRTOS 为我们提供了cortex-m0、m3、m4 和 m7 等内核的单片机的接口文件,只要是使用了这些内核的 mcu 都可以使用里面的接口文件。通常网络上出现的叫“移植某某某RTOS 到某某某 MCU”的教程,其实准确来说,不能够叫移植,应该叫使用官方的移植,因为这些跟硬件相关的接口文件,RTOS 官方都已经写好了,我们只是使用而已。我们本章讲的移植也是使用 FreeRTOS 官方的移植,关于这些底层的移植文件之后再说。

上一章节已经提过移植所需要的文件,只需要留下我们需要的就行
在这里插入图片描述
portable 文件夹中只需要留下keil、MemMang 和 RVDS这三个文件夹。
在这里插入图片描述

向工程中添加相应文件

1.复制添加 FreeRTOS 源码

在keil文件中编译文件之前,我们需要有这些文件,所以需要从官网下载的源码中复制这些文件到我们作为例子的工程文件夹下。
在基础工程中新建一个名为 FreeRTOS 的文件夹
在这里插入图片描述
1.在“FreeRTOSv9.0.0\FreeRTOS\Source”目录下找到所有的‘.c 文件’,将它们拷贝到我们新建的 src 文件夹中。
在这里插入图片描述
2.打开 FreeRTOS V9.0.0 源码,在“FreeRTOSv9.0.0\FreeRTOS\Source\portable”目录下找到“MemMang”文件夹与“RVDS”文件夹,将它们拷贝到我们新建的port 文件夹中
在这里插入图片描述
3.在“FreeRTOSv9.0.0\ FreeRTOS\Source”目录下找到“include”文件夹,这是头文件,包含了FreeRTOS提供的API函数。现在我们的FreeRTOS文件夹下有这么三个文件夹了。
在这里插入图片描述

2.在keil工程中添加文件

在上一步我们只是将 FreeRTOS 的源码放到了本地工程目录下,源码复制到我们工程之后,还需要再keil中添加才能使用
在这里插入图片描述

打开基础工程,新建分组 FreeRTOS_CORE 和 FreeRTOS_PORTABLE,然后向这两个分组中添加文件。
在这里插入图片描述
FreeRTOS_CORE:文件来自FreeRTOS 的源码中的.c文件
FreeRTOS_PORTABLE:该文件夹下有 port.c heap_4.c两个文件。
  port.c 是 RVDS 文件夹下的 ARM_CM4F 中的文件,因为 STM32F429 是 Cortex-M4 内核并且带有 FPU,因此要选择 ARM_CM4F 中的 port.c 文件。也就是说,需要根据不同的MCU选择不同的硬件接口文件。
  heap_4.c 是 MemMang 文件夹中跟内存管理相关的文件,MemMang 文件夹中共有 5 个 c 文件:heap_1.c、heap_2.c、heap_3.c、heap_4.c 和 heap_5.c,使用任意一个都可以。这里我们选择heap_4.c

3.添加相应的头文件路径

添加完 FreeRTOS 源码中的 C 文件以后还要添加 FreeRTOS 源码的头文件路径,头文件路径。
在这里插入图片描述

4.解决编译时的一些问题

1.编译时发现无法打开“FreeRTOSConfig.h”这个文件
可以在Free RTOS对stm32F407移植的Demo中找到,文件夹是CORTEX_M4F_STM32F407ZG-SK,复制到工程中去,路径随意,我为了方便放到了 FreeRTOS 源码中的 include 文件夹下。
在这里插入图片描述
FreeRTOSConfig.h 是 FreeRTOS 的配置文件,一般的操作系统都有裁剪、配置功能,而这些裁剪及配置都是通过一个文件来完成的,基本都是通过宏定义来完成对系统的配置和裁剪的.
移植FATFS文件系统的时候也有类似的配置文件。

2.再编译一次,发现SystemCoreClock 未定义错误。这是因为在 FreeRTOSConfig.h 中使用到了SystemCoreClock 来标记 MCU 的频率。而这里的定义是有条件的。
在这里插入图片描述
但是这边是条件预编译,条件是

#ifdef __ICCARM__#include <stdint.h>extern uint32_t SystemCoreClock;
#endif

需要修改这个条件编译,修改后的代码如下

#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)#include <stdint.h>extern uint32_t SystemCoreClock;
#endif

3.未定义的Hook函数,钩子函数,这是因为在FreeRTOSConfig.h中开启了这些钩子函数,但是却没有定义这些钩子函数而导致的,在 FreeRTOSConfig.h 中关闭这些钩子函数就行了,将 宏 configUSE_IDLE_HOOK 、 configUSE_TICK_HOOK 、configUSE_MALLOC_FAILED_HOOK 和 configCHECK_FOR_STACK_OVERFLOW 定义为 0。

5.FreeRTOSConfig.h头文件修改

之前也说过了,FreeRTOSConfig.h文件可以添加在工程中任意文件夹,只需要在路径中添加好了就行。该头文件对裁剪整个FreeRTOS 所需的功能的宏均做了定义。
这边是野火电子添加注释版本的FreeRTOSConfig.h,添加了一些中文注释,并且把相关的头文件进行分类,方便查找宏定义已经阅读,详见[野火®]《FreeRTOS%20内核实现与应用开发实战—基于STM32》.pdf

(1)代码清单中的这类标号在[野火®]《FreeRTOS%20内核实现与应用开发实战—基于STM32》.pdf有具体说明

一般来说,参照官方DEMO中的文件就可以了

FreeRTOSConfig.h 头文件的内容修改的不多,具体是:修改与对应开发板的头文件 ,如果是使用 STM32F1 ,则包含 F1 的头文件#include “stm32f10x.h”,同理是使用了其它系列,则包含对应的头文件即可。
在这里插入图片描述

6.修改 stm32f10x_it.c防止重复定义

FreeRTOS 所有跟时间相关的事情都在SysTick 中断服务函数中处理。也就是FreeRTOS 的心跳。
PendSV_Handler()、SVC_Handler()和 Systick_Handler()三个中断处理函数重复定义,这是因为 port.c 和 stm32f4xx_it.c 这两个文件中有重复定义的函数。这里屏蔽掉 stm32f4xx_it.c 中的 PendSV_Handler()、SVC_Handler()和 Systick_Handler()这三个函数。

或者:

屏蔽

PendSV_Handler()、SVC_Handler()两个重复定义的中断处理函数重写SysTick_Handler()函数

 //systick 中断服务函数 void SysTick_Handler(void) { #if (INCLUDE_xTaskGetSchedulerState == 1 ) if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) { #endif /* INCLUDE_xTaskGetSchedulerState */ xPortSysTickHandler(); #if (INCLUDE_xTaskGetSchedulerState == 1 ) } #endif /* INCLUDE_xTaskGetSchedulerState */ } 

7.修改 main.c

#include " FreeRTOS.h"
#include " task.h"int main(void){/* 暂时没有在 main 任务里面创建任务应用任务 */}

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

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

相关文章

win11右键菜单显示更多的设置方法

用了一年多win11系统了&#xff0c;Win11最大的变化之一莫过于右键菜单发生了变化。右键菜单很多时候需要点两次&#xff0c;实在是反人类&#xff0c;太麻烦了。 必须使用“显示更多选项”的右键菜单。 今天分享一个使用命令行更改右键菜单显示更多的设置方法&#xff1a; …

【Mybatis】动态 SQL

动态 SQL \<if>标签\<trim>标签\<where>标签\<set>标签\<foreach>标签 动态 sql 是 Mybatis 的强⼤特性之⼀&#xff0c;能够完成不同条件下不同的 sql 拼接。 <if>标签 前端用户输入时有些选项是非必填的, 那么此时传到后端的参数是不确…

Tabby All configured authentication methods failed

文章目录 重要序言错误原因tabby的连接设置 总结 重要序言 Tabby是一款美观耐用的软件&#xff0c;平常一直用来输入密码方法SSH公司服务器&#xff0c;后来为了另外一台服务器加了SSH私钥&#xff0c;之后Tabby SSH连接死活不成功&#xff0c;哎&#xff0c;折腾了好久&#…

微服务09-Sentinel的入门

文章目录 微服务中的雪崩现象解决办法&#xff1a;1. 超时处理2. 舱壁模式3. 熔断降级4.流量控制 Sentinel1.介绍2.使用操作3.限流规则4.实战&#xff1a;流量监控5.高级选项功能的使用1.关联模式2.链路模式3.总结 流控效果1.预热模式2.排队等待模式3.总结4.热点参数限流5.实战…

【eNSP】VLAN基础配置

一、基于接口划分VLAN&#xff08;Access接口和Trunk接口&#xff09; 1、创建VLAN LSW1 [LSW1]vlan batch 10 20 Info: This operation may take a few seconds. Please wait for a moment...done.LSW2 [LSW2]vlan batch 10 20 Info: This operation may take a few second…

K8S存储总结持久化存储解决方案(以NFS为例)

目录 K8S存储 一、emptydir 1. emptydir是什么 2. emptydir例子 二、hostpath hostpath 是什么 hostpath 例子 弊端 三、持久化存储 1.Persistent Volume(PV) 2.Persistent Volume Claim(PVC) 3.PV/PVC结合NFS使用实践&#xff08;持久存储&#xff09; 1. NFS服务…

Linux编译FFmpeg

Linux编译FFmpeg 1. 下载FFmpeg源码 FFmpeg源码下载地址&#xff1a;http://ffmpeg.org/download.html 在下面选择版本 2. 解压并创建生成目录 tar xvf ffmpeg-snapshot.tar.bz2 // 解压下载的FFmpeg源码 makedir /root/ffmpeg // 创建生成目录3. 编译FFmpeg 进入FF…

Flink---10、处理函数(基本处理函数、按键分区处理函数、窗口处理函数、应用案例TopN、侧输出流)

星光下的赶路人star的个人主页 我的敌手就是我自己&#xff0c;我要他美好到能使我满意的程度 文章目录 1、处理函数1.1 基本处理函数&#xff08;ProcessFunction&#xff09;1.1.1 处理函数的功能和使用1.1.2 ProcessFunction解析1.1.3 处理函数的分类 1.2 按键分区处理函数&…

软件测试工具有什么作用?有哪些好用的测试工具推荐?

软件测试工具是现代软件测试中不可或缺的重要组成部分&#xff0c;指的是一系列在软件开发过程中使用的工具&#xff0c;用于帮助测试人员进行测试活动&#xff0c;提高测试效率&#xff0c;减少测试成本。选择并使用合适的软件测试工具&#xff0c;可提高软件质量和效率。 一…

【docker】Docker--harbor私有仓库部署与管理——重点

一、理论 1、本地私有仓库 只能在当前机器上做 #首先下载 registry 镜像 docker pull registry #在 daemon.json 文件中添加私有镜像仓库地址 vim /etc/docker/daemon.json { "insecure-registries": ["192.168.10.23:5000"], …

数学建模——确定性时间序列分析方法

介绍 将预测对象按照时间顺序排成一组序列&#xff0c;称为时间序列。从时间序列过去的变化规律&#xff0c;推断今后变化的可能性及变化趋势、变化规律&#xff0c;这就是时间序列预测法。 时间序列模型&#xff0c;其实也是一种回归模型。其基本原理是&#xff0c;一方面承认…

uni-app:实现页面效果4(echarts数据可视化)

效果 代码 <template><view><view><view class"title">概况</view><view class"line_position"><view class"line1"><view class"item"><view class"one">今日销售…