FreeRTOS入门详解之---移植篇

本章简介

本章是FreeRTOS入门详解系列的第一篇:移植篇。本章基于STM32F103系列芯片进行FreeRTOS内核的移植,使用库函数为标准库函数,开发环境为keil MDK5。

1、资料获取

获取资料的最有效方式是访问官网进行资料下载。FreeRTOS官网:
链接: RTOS官网
官网首页点击下载FreeRTOS。跳转到下载界面,下载最新的FreeRTOS(下图第一个),包含RTOS内核、示例项目(Demo)等。
在这里插入图片描述

2、内核文件描述

一般来说,RTOS的移植有两种方式:
1、将官方给出的示例项目作为自己新项目的基础。
2、将RTOS内核相关文件移植到自己已有的项目中。
FreeRTOS官方强烈推荐第一种方式入门。个人建议,如果想对RTOS有更深入的了解,可以尝试用第二种方法。本篇的侧重点也是第二种方法。
下载的压缩包解压后如下:
在这里插入图片描述
FreeRTOS文件夹:包含FreeRTOS实时内核和示例程序。
FreeRTOS-Plus文件夹:包含FreeRTOS-Plus组件和示例程序。
移植所需所有文件都在FreeRTOS文件夹下。
进入FreeRTOS文件夹:
在这里插入图片描述
Demo:官方提供的示例程序。
Source:FreeRTOS内核文件。
核心的RTOS代码仅仅包含在3个源文件中:tasks.c list.c queue.c 。这3个源文件都在FreeRTOS/Source下。
进入Source文件夹:
在这里插入图片描述
include文件夹:RTOS内核头文件
portable文件夹:特定处理器代码(移植层代码)
每个支持的处理器都需要特定的架构RTOS代码,这些代码位于可移植层FreeRTOS/Source/Portable/[compiler]/[architecture],其中compiler是用于创建移植的编译器。architecture是运行移植的架构。

RTOS移植还需要用到内存管理(堆分配方案),内存管理相关的文件位于FreeRTOS/Source/portable/MemMang 目录中。

3、移植

两种移植方式都需要自己首先构建好一个项目,确保构建的项目可以正常运行。项目可以正常运行后,再考虑进行移植和RTOS功能。

3.1、基于官方示例项目移植

这种方法是将官方的示例程序中的源文件一点点剔除,逐步替换为自己的源程序。FreeRTOS官网建议使用此种方式进行入门。
由上一章节分析可知,移植所需文件如下:
FreeRTOS/Demo/Common (Common文件夹被所有的示例程序共用,必须保留)
FreeRTOS/Demo/CORTEX_STM32F103_Keil (示例程序)
FreeRTOS/Source/portable/MemMang (内存分配文件 heap_x.c)
FreeRTOS/Source/portable/RVDS/ARM_CM3 (处理器特定文件 port.c)
FreeRTOS/Source/include
FreeRTOS/Source/*.c

在FreeRTOS/Demo/CORTEX_STM32F103_Keil目录下打开工程,点击编译。0 Error ,0 Warning。
在这里插入图片描述

3.2、将RTOS移植到已有项目中

这种方法需要对RTOS有一定的了解,清除知道哪些文件是自己所需要的。将所需的文件放到已经构建好的文件中。
至少需要的源文件:
FreeRTOS/Source/tasks.c (RTOS内核源文件)
FreeRTOS/Source/queue.c (RTOS内核源文件)
FreeRTOS/Source/list.c (RTOS内核源文件)
FreeRTOS/Source/portable/RVDS/ARM_CM3/port.c. (处理器特定文件)
FreeRTOS/Source/portable/MemMang/heap_x.c (内存管理文件)
头文件:
FreeRTOS/Source/include
FreeRTOS/Source/portable/RVDS/ARM_CM3
配置文件
FreeRTOSConfig.h (从同架构的Demo中复制出来即可)

由以上文件可知,RTOS移植需要3种文件:源文件、头文件、配置文件。
源文件中的内存管理文件有5个:heap_1.c heap_2.c heap_3.c heap_4.c heap_5.c 。内存管理文件我们只需要用1个。其中官方推荐使用heap_4.c,关于内存管理文件的差异,会单独出一篇进行解释。
需要特别注意的是配置文件,配置文件的作用是为自己构建的应用程序量身定制RTOS内核。因此,配置文件取决于应用程序,而非RTOS内核。配置文件应该在应用程序目录下,而不是内核目录。
配置文件中的configTOTAL_HEAP_SIZE决定RTOS占用堆的大小,如果定义的太大,会导致编译失败。
configMINIMAL_STACK_SIZE 决定了空闲任务占用堆栈大小,推荐参考Demo中的此变量设置。

3.2.1、修改内容
3.2.1.1、RTOS系统心跳配置

上面的移植完成后,此时程序还不能够正常运行。因为FreeRTOS运行需要一个时钟心跳,一般选择系统时钟定时器(systick)作为RTOS的时钟心跳。而RTOS内核源码port.c中已经配置好了systick作为心跳时钟,在vPortSetupTimerInterrupt函数中。而我们仅仅需要在FreeRTOSConfig.h中配置心跳频率configTICK_RATE_HZ。如1ms心跳则configTICK_RATE_HZ为1000即可。
而vPortSetupTimerInterrupt函数是在开启调度器是调用的。

3.2.1.2、启动文件修改

因为FreeRTOS已经在port.c中定义了调度相关的函数:
xPortPendSVHandler
xPortSysTickHandler
vPortSVCHandler
而启动文件中,则还是原来的
PendSVHandler
SysTickHandler
SVCHandler
所以要进行2处修改,如下图:
在这里插入图片描述
在这里插入图片描述
经过以上修改,RTOS就可以正常运行了。一灯大师们,启动!

  • 27
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值