二、FreeRTOS学习笔记-移植
FreeRTOS移植
首先准备一个基础工程,stm32标准库或者HAL库,本实验使用HAL库版本的内存管理实验进行移植
移植步骤:
1
第一步:添加FreeRTOS源码(添加FreeRTOS源码的目的是使嵌入式通过FreeRTOS系统调用MUC寄存器进行相关外设操作)
下图源码可通过www.freertos.org
官网进行下载
也可通过正点原子提供的A盘资料中的 6,软件资料->14,FreeRTOS 学习资料->FreeRTOS 源码
添加好的文件夹如下图所示
其中portable为连接桥梁,内部我们只用到了下面的3个文件,分别是keil(keil软件使用)、RVDS(keil文件需要使用的驱动文件,软件与硬件的连接桥梁)、MemMang(内存管理算法,只用到了heap_4.c)
第二步:在工程分组中添加文件
首先通过MDK软件打开基础工程,然后在基础工程分组下新建两个文件,然后分别将上面添加的FreeRTOS源码按照下图所示添加到两个文件中
其中port.c文件根据自己使用的开发板型号进行添加,我使用的是STM32F4探索者v2,所有我添加ARM_CM4F中的port.c文件
第三步:添加相应的头文件路径
第四步:FreeRTOSConfig.h
文件(是FreeRTOS操作系统的配置文件,功能:进行功能裁剪,有些用不到的功能可以通过本文件中将其宏定义去除掉,以来节省内存资源)添加到FreeRTOS源码中的include文件夹下
FreeRTOSConfig.h文件同样在官方下载的文件中获取,根据开发板不同型号自行选择,下图为我使用的型号的文件路径图
再结合自身需求进行修改,或者直接使用正点原子提供的文件
2
修改SYSTEM文件
修改SYSTEM文件中的sys.c delay.c usart.c
首先sys.h文件中的宏定义改成1表示支持OS,这样就支持OS系统了,但是基础工程之前是针对UCOS进行编写的,所以内存有些不是FreeRTOS使用的,需要修改或删除
usart.c文件中的中断服务函数中的下图两个函数删除,因为这两个函数是在UCOS系统中使用的,FreeRTOS中未使用
删除下图所示头文件引用部分,同样也是UCOS中使用的,FreeRTOS中未使用到,所有删除
delay.c中首先删除下图UCOS使用内存
接下来定义extern void xPortSysTickHandler(void);
然后修改滴答定时器的中断服务函数
void SysTick_Handler(void)
{
HAL_IncTick();
if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//系统已经运行
{
xPortSysTickHandler();
}
}
接下来就修改delay_init()函数,修改了一个宏定义,删除了一行无用代码
这里就体现了F1和F4开发板的FreeRTOSConfig.h文件的差异之处了,及由于滴答定时器时钟不同,而FreeRTOS的时钟频率是由滴答定时器决定的所以对这个宏定义就有所不同
删除delay_osschedlock();//阻止OS调度,防止打断us延时
delay_osschedunlock(); //恢复OS调度
结果如下图所示
void delay_ms(u16 nms)函数改成下图所示
<
void delay_ms(u16 nms)
{
u32 i;
for(i = 0;i<nms;i++)
{
delay_us(1000);
}
}
接下来修改头文件,删除UCOS使用的头文件,添加FreeRTOS使用的头文件
3
修改中断相关文件 修改Systick中断(用于提供时钟节拍)、SVS中断、PendSV中断(任务切换相关中断)
将与FreeRTOS中定义重复的HAL库中的三个中断服务函数注释掉(注释掉,但是HAL库需要使用,所有在stm32f4xx_it.c中引用头文件进行三个中断函数的调用)
通过条件编译注释掉这三个函数
下面宏定义的4U改成4
添加应用程序:验证移植是否成功
https://blog.csdn.net/weixin_45360072/article/details/139279327?spm=1001.2014.3001.5502