freeRTOS实时操作系统移植

本文详细介绍了如何在STM32F103开发板上移植FreeRTOS操作系统,包括从下载源码到配置移植过程,涉及内存管理策略的选择、宏定义的修改以及中断服务函数的定制。同时,文章提到了低功耗模式的注意事项,为开发者提供了完整的移植步骤和配置示例。
摘要由CSDN通过智能技术生成

前言

只从接触到系统和驱动以后,就越来越烦躁裸机开发。没有一个系统好像感觉缺点上面似的,这几天刚好要做毕设,顺带复习一下FreeRtos,FreeRtos我会作为一个专栏全部更完,一天一更。
首先我们来了解一下什么是freeRTOS?

FreeRTOS是一个迷你的实时操作系统内核。作为一个轻量级的操作系统,
功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能、软件定时器、协程等,可基本满足较小系统的需要。
由于RTOS需占用一定的系统资源(尤其是RAM资源),只有μC/OS-II、embOS、salvo、FreeRTOS等少数实时操作系统能在小RAM单片机上运行。相对μC/OS-II、embOS等商业操作系统,FreeRTOS操作系统是完全免费的操作系统,具有源码公开、可移植、可裁减、调度策略灵活的特点,可以方便地移植到各种单片机上运行。

移植过程

我使用的开发板是stm32f103

首先你需要下载一个Freertos源码包,不会下载的可私聊我,我发一个给您。有源码包以后下面开始移植:
首先建立一个文件夹名字就叫FreeRtos好分辨嘛。
在这里插入图片描述

然后打开下载的Freertos源码包
在这里插入图片描述

打开源码包下面的Freertos文件
在这里插入图片描述
然后打开source文件
将里面的include文件复制到你创建的文件夹下面:
在这里插入图片描述
在这里插入图片描述
然后在你创建文件夹下面再创建两个文件夹,分别命名为src和port
在这里插入图片描述
然后回到你的源码包文件下面:
FreeRtos源码\FreeRTOSv10.2.1\FreeRTOS\Source\portable\MemMang
将MemMang文件里面的heap4.c文件全都复制到你创建的文件夹下port文件夹下面,为啥选head4.c呢?

heap_1只实现了堆内存的申请,并未实现堆内存的释放,适用与内存及实时操作系统组件例如队列、信号量等只申请不释放的情况,显而易见,这种只申请不释放的使用方式是不会产生内存碎片的,但是内存的利用率会降低。

heap_2 既实现了内存的申请也实现了内存的释放,但是频繁的申请释放必然会产生内存碎片,但是当每次申请释放的内存块长度是固定值时,就可以避免内存被分割的可能行,就可以避免内存碎片。

heap_3 仅实现了对C标准库中malloc 及free函数的封装,但是保证了线程安全行,注意malloc 和free函数不是原子操作,是非线程安全的,分配内存时要使用实时操作系统自身提供的内存分配函数。

heap_4 使用了一个内存最有算法去分配内存,相比heap_2来讲,内存碎片化会轻的多。

heap_5 允许跨域不同的内存段,及可以同时使用片内和片外内存作为内存分配空间。

在这里插入图片描述
在这里插入图片描述
然后将FreeRtos源码\FreeRTOSv10.2.1\FreeRTOS\Source\portable\RVDS\ARM_CM3
下的两个文件也复制到你创建的port文件夹下面
我的开发板是stm32f103属于M3系列所以选择ARM_CM3

FreeRTOS 为我们提供了 cortex-m0、m3、m4 和 m7 等内核的单片机的接口文件,只要是使用了这些内核的 MCU 都可以使用里面的接口文件。我们这里以 ARM_CM3 这个文件夹为例,看看里面的文件,里面只有“port.c”与“portmacro.h”两个文件, port.c 文件里面的内容是由 FreeRTOS 官方的技术人员为 Cortex-M3 内核的处理器写的接口文件,里面核心的上下文切换代码是由汇编语言编写而成;portmacro.h 则是 port.c 文件对应的头文件,主要是一些数据类型和宏定义。

在这里插入图片描述

在这里插入图片描述
然后将FREERTOS资料\FreeRtos源码\FreeRTOSv10.2.1\FreeRTOS\Source下的所有.c文件都复制到你创建文件夹下面src文件下面
在这里插入图片描述
在这里插入图片描述

里面那个txt文件不影响,是个介绍文档。
然后我们还需要最后一个文件FreeRTOSConfig.h 文件是 FreeRTOS 的工程配置文件,因为 FreeRTOS 是可以裁剪的实时操作内核,应用于不同的处理器平台,用户可以通过修改这个 FreeRTOS 内核的配置头文件来裁剪 FreeRTOS 的功能。

我们可以再例程里面找一个符合开发板的例程复制过去,我的不是f103的嘛,注意路径
在这里插入图片描述
在这里插入图片描述
你需要把这个文件加到你工程里面,注意是你的工程里面,你放哪都可以,放到你创建的include下面也行。

这样freerots库就制作好了。下面将你制作的库放到工程里面。
添加俩个分组,一个放你创建的文件下的src文件,一个放你创建文件下的port文件
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

这样.c文件是不是就添加完成了,下面添加.h文件
在这里插入图片描述
.h文件只有include和port文件下面有嘛,添加进去就行。
在这里插入图片描述
这样移植已近完成一大半了,下面开始修改。
在这里插入图片描述
打开这个文件在下面加上一些宏定义

/* 我们可以添加的宏定义 */
#define configUSE_TIME_SLICING 1 //使能时间片调度(默认式使能的)
#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 //硬件计算前导零指令,如果所使用的, MCU 没有这些硬件指令的话此宏应该设置为 0
#define configUSE_TICKLESS_IDLE 1 //置 1:使能低功耗 tickless 模式;置 0:保持系统节拍(tick)中断一直运行
#define configUSE_QUEUE_SETS 1 //启用队列
#define configUSE_TASK_NOTIFICATIONS 1 //开启任务通知功能,默认开启
#define configUSE_MUTEXES 1 //使用互斥信号量
#define configUSE_RECURSIVE_MUTEXES 1 //使用递归互斥信号量
#define configUSE_COUNTING_SEMAPHORES 1 //为 1 时使用计数信号量
#define configQUEUE_REGISTRY_SIZE 10 //设置可以注册的信号量和消息队列个数
#define configUSE_APPLICATION_TASK_TAG 0
#define configSUPPORT_DYNAMIC_ALLOCATION 1 //支持动态内存申请
#define configUSE_MALLOC_FAILED_HOOK 0 //使用内存申请失败钩子函数
#define configCHECK_FOR_STACK_OVERFLOW 1// 大于 0 时启用堆栈溢出检测功能,如果使用此功能用户必须提供一个栈溢出钩子函数如果使用的话此值可以为 1 或者 2,因为有两种栈溢出检测方法
#define configGENERATE_RUN_TIME_STATS 0 //启用运行时间统计功能
#define configUSE_STATS_FORMATTING_FUNCTIONS 1
#define configUSE_TIMERS 1 //启用软件定时器
#define configTIMER_TASK_PRIORITY (configMAX_PRIORITIES-1) //软件定时器优先级
#define configTIMER_QUEUE_LENGTH 10 //软件定时器队列长度
#define configTIMER_TASK_STACK_DEPTH (configMINIMAL_STACK_SIZE*2) //软件定时器任务堆栈大小
//可选函数配置选项
#define INCLUDE_xTaskGetSchedulerState 1
#define INCLUDE_eTaskGetState 1
#define INCLUDE_xTimerPendFunctionCall 1
//中断服务函数 也可以修改起始文件
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler
#define configUSE_PREEMPTION		1
#define configUSE_IDLE_HOOK			0
#define configUSE_TICK_HOOK			0
#define configCPU_CLOCK_HZ			( ( unsigned long ) 72000000 )	
#define configTICK_RATE_HZ			( ( TickType_t ) 1000 )
#define configMAX_PRIORITIES		( 5 )
#define configMINIMAL_STACK_SIZE	( ( unsigned short ) 128 )
#define configTOTAL_HEAP_SIZE		( ( size_t ) ( 17 * 1024 ) )
#define configMAX_TASK_NAME_LEN		( 16 )
#define configUSE_TRACE_FACILITY	0
#define configUSE_16_BIT_TICKS		0
#define configIDLE_SHOULD_YIELD		1

在这里插入图片描述
然后还需要修改
在这里插入图片描述
将这几个文件注释掉。
然后还需要添加一个钩子函数:

void vApplicationStackOverflowHook(void)
{
	while(1)
	{
	
	}

}

在这里插入图片描述
最后还需要修改一个宏定义,还是在你添加的宏定义里面。
在这里插入图片描述
将1修改为0,因为低功耗模式,你代码下载一次就再下载不进去了,所以开发时候需要给他置为0,等整个项目开发完成,没有问题后再修改为1即可(修补修改无所谓,做低功耗产品就需要注意了)。

至此移植完成!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值