FreeRTOS移植到STM32
一、找一个STM32的裸机工程模板
我们以STM32F103裸机程序为例
随便找的一个裸机程序
二、去官网上下载FreeRTOS V9.0.0 源码
在移植之前,我们首先要获取到 FreeRTOS 的官方的源码包。这里我们提供两个下载 链 接 , 一 个 是 官 网 : http://www.freertos.org/ , 另 外 一 个 是 代 码 托 管 网 站 : https://sourceforge.net/projects/freertos/files/FreeRTOS/。虽然不是最新版本的源码包但是因为内核很稳定, 并且网上资料很多所以我们选用V9.0.0 版本
我们打开 FreeRTOS 的代码托管网站,就可以看到 FreeRTOS 的源码及其版本信息了, 具体见图
点开V9.0.0下载zip这个,
解压完成后就会得到一个完整的Freertos源码包
FreeRTOS 包含 Demo 例程和内核源码(比较重要,我们就需要提取该目录下的大部分 文件),具体见图 13-5。FreeRTOS 文件夹下的 Source 文件夹里面包含的是 FreeRTOS 内 核的源代码,我们移植 FreeRTOS 的时候就需要这部分源代码;FreeRTOS 文件夹下的 Demo 文件夹里面包含了 FreeRTOS 官方为各个单片机移植好的工程代码,FreeRTOS 为了 推广自己,会给各种半导体厂商的评估板写好完整的工程程序,这些程序就放在 Demo 这 个目录下,这部分 Demo 非常有参考价值。我们把 FreeRTOS 到 STM32 的时候, FreeRTOSConfig.h 这个头文件就是从这里拷贝过来的,我们这里不做详解
三、往裸机工程添加 FreeRTOS 源码
1. 首 先在 我们 的 STM32 裸 机工 程模 板根 目录 下新 建一 个文 件夹, 命名 为 “FreeRTOS”,并且在 FreeRTOS 文件夹下新建两个空文件夹,分别命名为“src” 与“port”,src 文件夹用于保存 FreeRTOS 中的核心源文件,也就是我们常说的 ‘.c 文件’,port 文件夹用于保存内存管理以及处理器架构相关代码,这些代码 FreeRTOS 官方已经提供给我们的,直接使用即可,在前面已经说了,FreeRTOS 是软件,我们的开发版是硬件,软硬件必须有桥梁来连接,这些与处理器架构相 关的代码,可以称之为 RTOS 硬件接口层,它们位于 FreeRTOS/Source/Portable 文 件夹下。
2. 打开 FreeRTOS V9.0.0 源码,在“FreeRTOSv9.0.0\FreeRTOS\Source”目录下找到 所有的‘.c 文件’,将它们拷贝到我们新建的 src 文件夹中,
3. 打开 FreeRTOS V9.0.0 源码,在“FreeRTOSv9.0.0\FreeRTOS\Source\portable”目 录下找到“MemMang”文件夹与“RVDS”文件夹,将它们拷贝到我们新建的 port 文件夹中,
4. 打开 FreeRTOS V9.0.0 源码,在“FreeRTOSv9.0.0\ FreeRTOS\Source”目录下找到 “include”文件夹,它是我们需要用到 FreeRTOS 的一些头文件,将它直接拷贝 到我们新建的 FreeRTOS 文件夹中,完成这一步之后就可以看到我们新建的 FreeRTOS 文件夹已经有 3 个文件夹,这 3个文件夹就包含 FreeRTOS 的核心文件, 至此,FreeRTOS 的源码就提取完成,
5
5.拷贝 FreeRTOS 到裸机工程根目录
鉴于 FreeRTOS 容量很小,我们直接将刚刚提取的整个 FreeRTOS 文件夹拷贝到我们 的 STM32 裸机工程里面,让整个 FreeRTOS 跟随我们的工程一起发布,使用这种方法打包 的 FreeRTOS 工程,即使是将工程拷贝到一台没有安装 FreeRTOS 支持包(MDK 中有 FreeRTOS 的支持包)的电脑上面都是可以直接使用的,因为工程已经包含了 FreeRTOS 的 源码。
FreeRTOS 文件夹下就是我们提取的 FreeRTOS 的核心代码,该文件夹下的 具体内容作用,这里就不再赘述。
6.拷贝 FreeRTOSConfig.h 文件到 user 文件夹
FreeRTOSConfig.h 文件是 FreeRTOS 的工程配置文件,因为 FreeRTOS 是可以裁剪的 实时操作内核,应用于不同的处理器平台,用户可以通过修改这个 FreeRTOS 内核的配置 头文件来裁剪 FreeRTOS 的功能,所以我们把它拷贝一份放在 user 这个文件夹下面。 打开 FreeRTOSv9.0.0 源码,在“FreeRTOSv9.0.0\FreeRTOS\Demo”文件夹下面找到 “ CORTEX_STM32F103_Keil ” 这 个 文 件 夹 , 双 击 打 开 , 在 其 根 目 录 下 找 到 这 个 “FreeRTOSConfig.h”文件,然后拷贝到我们工程的 user 文件夹下即可,
7.添加 FreeRTOS 源码到工程组文件夹
在上一步我们只是将 FreeRTOS 的源码放到了本地工程目录下,还没有添加到开发环 境里面的组文件夹里面,FreeRTOS 也就没有移植到我们的工程中去。
新建 FreeRTOS/src 和 FreeRTOS/port 组,接下来我们在开发环境里面新建 FreeRTOS/src 和 FreeRTOS/port 两个组文件夹,其中 FreeRTOS/src 用于存放 src 文件夹的内容,FreeRTOS/port 用于存放 port\MemMang 文件夹 与 port\RVDS\ARM_CM?文件夹的内容,“?”表示 3、4 或者 7,具体选择哪个得看你 使用的是哪个型号的 STM32 开发板,如果是F3系列就拷贝port\RVDS\ARM_CM3
F4系列就拷贝port\RVDS\ARM_CM4,然后我们将工程文件中 FreeRTOS 的内容添加到工程中去,按照已经新建的分组添加 我们的 FreeRTOS 工程源码。 在 FreeRTOS/port 分组中添加 MemMang 文件夹中的文件只需选择其中一个即可,我 们选择“heap_4.c”,这是 FreeRTOS 的一个内存管理源码文件。同时,需要根据自己的开 发板型号在 FreeRTOS\port\RVDS\ARM_CM?中选择,“?”表示 3、4 或者 7,具体选择 哪个得看你使用的是哪个型号的 STM32 开发板。
然后在 user 分组中添加我们 FreeRTOS 的配置文件“FreeRTOSConfig.h”,因为这是 头文件(.h),所以需要在添加时选择文件类型为“All files (*.*)”,至此我们的 FreeRTOS 添加到工程中就已经完成,效果图如下
8.指定 FreeRTOS 头文件的路径
这一步不过多解释,用过STM32的人都知道
9.FreeRTOSConfig.h 文件修改
FreeRTOSConfig.h 头文件的内容修改的不多,具体是:修改与对应开发板的头文件 , 如果是使用野火 STM32F1 的开发板,则包含 F1 的头文件#include "stm32f10x.h",同理是 使用了其它系列的开发板,则包含与开发板对应的头文件即可,当然还需要包含我们的串 口的头文件“bsp_usart.h”,因为在我们 FreeRTOSConfig.h 中实现了断言操作,需要打印 一些信息。其他根据需求修改即可,
10. 修改 stm32f10x_it.
SysTick 中断服务函数是一个非常重要的函数,FreeRTOS 所有跟时间相关的事情都在 里面处理,SysTick 就是 FreeRTOS 的一个心跳时钟,驱动着 FreeRTOS 的运行,就像人的 心跳一样,假如没有心跳,我们就相当于“死了”,同样的,FreeRTOS 没有了心跳,那么 它就会卡死在某个地方,不能进行任务调度,不能运行任何的东西,因此我们需要实现一 个 FreeRTOS 的心跳时钟,FreeRTOS 帮我们实现了 SysTick 的启动的配置:在 port.c 文件 中已经实现 vPortSetupTimerInterrupt()函数,并且 FreeRTOS 通用的 SysTick 中断服务函数 也实现了:在 port.c 文件中已经实现 xPortSysTickHandler()函数,所以移植的时候只需要我 们在 stm32f10x_it.c 文件中实现我们对应(STM32)平台上的 SysTick_Handler()函数即可。 FreeRTOS 为开发者考虑得特别多,PendSV_Handler()与 SVC_Handler()这两个很重要的函 数都帮我们实现了,在 port.c 文件中已经实现 xPortPendSVHandler()与 vPortSVCHandler() 函数,防止我们自己实现不了,那么在 stm32f10x_it.c 中就需要我们注释掉 PendSV_Handler()与 SVC_Handler()这两个函数了,具体看一下代码
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x_it.h"
#include "FreeRTOS.h" //FreeRTOS使用
#include "task.h"
/** @addtogroup STM32F10x_StdPeriph_Template* @{*//* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*//******************************************************************************/
/* Cortex-M3 Processor Exceptions Handlers */
/******************************************************************************//*** @brief This function handles NMI exception.* @param None* @retval None*/
void NMI_Handler(void)
{
}/*** @brief This function handles Hard Fault exception.* @param None* @retval None*/
void HardFault_Handler(void)
{/* Go to infinite loop when Hard Fault exception occurs */while (1){}
}/*** @brief This function handles Memory Manage exception.* @param None* @retval None*/
void MemManage_Handler(void)
{/* Go to infinite loop when Memory Manage exception occurs */while (1){}
}/*** @brief This function handles Bus Fault exception.* @param None* @retval None*/
void BusFault_Handler(void)
{/* Go to infinite loop when Bus Fault exception occurs */while (1){}
}/*** @brief This function handles Usage Fault exception.* @param None* @retval None*/
void UsageFault_Handler(void)
{/* Go to infinite loop when Usage Fault exception occurs */while (1){}
}/*** @brief This function handles SVCall exception.* @param None* @retval None*/
//void SVC_Handler(void)
//{
//}/*** @brief This function handles Debug Monitor exception.* @param None* @retval None*/
void DebugMon_Handler(void)
{
}extern void xPortSysTickHandler(void);
//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 */
}/******************************************************************************/
/* STM32F10x Peripherals Interrupt Handlers */
/* Add here the Interrupt Handler for the used peripheral(s) (PPP), for the */
/* available peripheral interrupt handler's name please refer to the startup */
/* file (startup_stm32f10x_xx.s). */
/******************************************************************************//*** @brief This function handles PPP interrupt request.* @param None* @retval None*/
/*void PPP_IRQHandler(void)
{
}*/
11.修改main.c里面的代码
#include "FreeRTOS.h"
#include "task.h"
/* 开发板硬件bsp头文件 */
#include "bsp_led.h"
#include "bsp_usart.h"int main(void)
{ //里面什么都不做
}
修改好后编译看看有没有错误
笔者这是没有任何问题的。
本篇内容参考野火的Freertos内核实现与应用开发指南,详细代码可以去野火官方下载中心下载查看https://doc.embedfire.com/products/link/zh/latest/index.html
FreeRTOS移植到STM32相关推荐
- 【STM32】FreeRTOS移植
00. 目录 文章目录 00. 目录 01. 简介 02. 预备工作 03. FreeRTOS移植 04. SYSTEM文件修改 05. 测试程序设计 06. 附录 07. 参考 01. 简介 我们已 ...
- stm32的FreeRTOS移植
目录 FreeRTOS移植到STM32F103步骤与注意事项 前言: 一.从官网下载最新版的FreeRTOS源码 二.IAR下移植FreeRTOS 三.MDK下移植FreeRTOS 总结: STM32 ...
- 基于Linux的kfifo移植到STM32(支持os的互斥访问)
基于Linux的kfifo移植到STM32(支持os的互斥访问) 声明:本文为杰杰原创,转载请说明出处 https://blog.csdn.net/jiejiemcu/article/details/ ...
- harmonyos能否移植到MCU,HarmonyOS(LiteOs_m) 官方例程移植到STM32初体验
HarmonyOS(LiteOs_m) 官方例程移植到STM32初体验 硬件平台 基于正点原子战舰V3开发板 MCU:STM32F103ZET6 片上SRAM大小:64KBytes 片上FLASH大小 ...
- Basic脚本解释器移植到STM32
上次讲了LUA移植到STM32,这次讲讲Basic脚本解释器移植到STM32.在STM32上跑Basic脚本,同样可以跟穿戴设备结合,也可以作为初学者学习MCU的入门工具,当然前提是有人做好Basic ...
- STM32C8T6的FreeRTOS移植
直接开撸 直接看着正点原子的FreeRTOS移植,就是我用的是C8T6 O(∩_∩)O哈哈~ 穷孩子,先用C8T6凑合着.不过C8T6的flash比较小,不知道什么时候就爆了哈哈. ①首先改完所有报错 ...
- FreeRTOS学习笔记【二】——FreeRTOS 移植
上一章中我们初步的了解了一下 FreeRTOS,本章就正式踏上 FreeRTOS 的学习之路, 首先 肯定是把 FreeRTOS 移植到我们所使用的平台上, 这里以 ALIENTEK 的 STM32F ...
- 12864移植到STM32平台
利用串口方式将原本51单片机上的串口程序移植到STM32上,调试了两天终于可以显示了 1. 排查IO的初始化是否有问题,在STM32平台上需要对IO口时钟使能,IO口模式配置,一些特殊的管脚还需要做特 ...
- U8G2库移植到STM32平台上
U8G2库简介 U8g2是嵌入式设备的单色图形库,一句话简单明了.主要应用于嵌入式设备,包括我们常见的单片机: 建议先看这篇博客的介绍,写的比较好u8g2库的使用 这篇博客介绍了对于u8g2的使用,但 ...
最新文章
- FreeBSD最小化安装没有man解决方法
- Linux内核源码树学习:Kconfig和Makefile
- [转]查看事物码相关的数据对象
- resnet论文_ResNet还是DenseNet?即插即用的DS涨点神器来了!
- Windows 查看所有进程命令tasklist
- 过滤脚本(C#,script,iframe,html)
- Linux设备驱动开发-linux驱动中的阻塞访问方式
- 腾讯技术工程沙龙深圳站来了,我们一起聊聊“工业互联网”
- 【雷军】给程序员的五点建议--如何成为编程高手并以此创业
- django系列3.3--CBV 和 FBV
- easyui添加删除表格任意行(2)
- python字典实现好友管理系统简易版
- Sizes of tensors must match except in dimension 1. Got 85 and 6 in dimension 2
- 狂神说java-Mybatis
- html5刮刮卡,canvas 实现刮刮卡
- (五)2.自动控制原理 Frequency Responce Methods 之 Nyquist曲线
- 亲测UEFI启动模式的电脑安装Win10和Ubuntu双系统
- Delphi Thread 线程2
- Nero8 刻录数据到CD/DVD
- adobe 奥多比bridge extention等产品 “安装程序无法初始化。请下载Adobe Support Advisor检测该问题”
热门文章
- 灼口综合征的症状这么多呢呀?!
- 恒流LED驱动芯片 SM15133EK SM15133EH 明微电子
- 一个账号多路由器拨号失败服务器无响应,PPPoE拨号失败 PPPoE拨号失败服务器无响应怎么办?...
- 阿里云ACP级认证考试心得+过关经验
- Qt获取图片色值(提供源码)
- php 月份英文,所有月份的英语单词
- Tecplot进阶——如何用Tecplot制作一张满足论文投稿要求的图片
- 安卓手机屏幕镜像显示截取屏幕时没有【不再提示】选项的解决办法
- [工作积累] TAA Ghosting 的相关问题
- JavaScript的相关知识与问题