FreeRTOS移植
1.在RTOS官网下载源码
FreeRTOS™ - FreeRTOS™
2.这里我以我的板子为例stm32f103精英开发板V2 — 正点原子资料下载中心 1.0.0 文档
资料可以从这个链接里面下载
下载完成之后我们按照他们说的移植到内存管理实验上
1.移植FreeRTOS源码
这个是我们准备的基础工程--实验33

在这个实验33的Middlewares里面新建一个叫FreeRTOS的文件夹
移植RTOS源码
在这个文件夹中移植入FreeRTOS-Kernel的代码
移植完成如下图所示

删除portable中的部分文件剩下这三个

通过RVDS来实现软件和硬件的链接
然后在工程里面新建两个分组

在这两个目录下添加我们刚刚在Middlewares中克隆的源码
添加完成如下,因为我们的是M3的内核所以选择就很固定啦

下一步就是要添加头文件路径啦添加下面两个头文件

添加FreeRTOSConfig.h文件
在资料文件中扩展例程移植FreeRTOS中的路径如下
F:\BaiduDownload\【正点原子】精英STM32F103开发板 V2-资料盘(A盘)\4,程序源码\4,程序源码\3,扩展例程\2,FreeRTOS例程\2,FreeRTOS例程\FreeRTOS实验例程2 FreeRTOS移植实验\User
里面的FreeRTOSconfig.h文件
粘贴在这个路径上
F:\BaiduDownload\【正点原子】精英STM32F103开发板 V2-资料盘(A盘)\4,程序源码\4,程序源码\2,标准例程-HAL库版本\2,标准例程-HAL库版本\实验33 内存管理实验\User
2.修改文件源码
1.修改sys.h文件
设置成支持OS

2.修改usart.c文件
删除掉加OSIntEnter()和OSIntExit()两个函数,因为只有使用裸机开发的时候需要使用到这两个函数,添加下面这些代码
void USART_UX_IRQHandler(void){HAL_UART_IRQHandler(&g_uart1_handle); /*调用HAL库中断处理公用函数*/
while(HAL_UART_Receive_IT(&g_uart1_handle,(uint8_t *)g_rx_buffer,RXBUFFERSIZE) != HAL_OK)/*重新开启中断并接收数据*/{/*如果出错会卡死在这里*/}}

将串口1中断服务函数更改为如图所示
并且删除图中所选部分,这部分是于µC/OS使用的,FreeRTOS没有使用这部分

3.修改delay.c文件
大致可分为三个步骤:删除适用于µC/OS但不适用于FreeRTOS的相关代码、添加 FreeRTOS的相关代码、修改部分内容
1.删除适用于µC/OS但不适用于FreeRTOS的相关代码
1.删除3个宏定义
delay_osrunning :用于表示OS当前是否正在运行,以决定是否可以使用相关函数 delay_ostickspersec :用于表示OS设定的时钟节拍,delay_init将根据这个参数来初始化systick delay_osintnesting :用于表示OS中断嵌套级别,因为中断里面不可以调度,delay_ms使用该参数来决定如何运行

2.删除三个函数
delay_osschedlock :用于锁定OS任务调度,禁止调度
delay_osschedunlock :用于解锁OS任务调度,重新开启调度
delay_ostimedly :用于OS延时,可以引起任务调度.

3.在systick_handler函数前面加上这句

4.修改systick_handler函数
void SysTick_Handler(void){HAL_IncTick();/*OS开始跑了,才执行正常的调度处理*/if(xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED){xPortSysTickHandler();}
}
5更改delay_init
void delay_init(uint16_t sysclk){#if SYS_SUPPORT_OSuint32_t reload;#endifSysTick->CTRL=0;HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK_DIV8);g_fac_us=sysclk/8;#if SYS_SUPPORT_OSreload=sysclk/8;/*使用configTICK_RATE_HZ计算重装载值*configTICK_RATE_HZ在FreeRTOSConfig.h中定义*/reload*=1000000/configTICK_RATE_HZ;/*删除不用的g_fac_ms相关代码*/SysTick->CTRL|=1<<1;SysTick->LOAD=reload;SysTick->CTRL|=1<<0;#endif}
6.更改delay_us
void delay_us(uint32_t nus){uint32_t ticks;uint32_t told,tnow,tcnt=0;uint32_t reload=SysTick->LOAD;/*删除适用于μC/OS用于锁定任务调度器的自定义函数*/ticks=nus*g_fac_us;told=SysTick->VAL;while(1){tnow=SysTick->VAL;if(tnow!=told){if(tnow<told){tcnt+=told-tnow;}else{tcnt+=reload-tnow+told;}told=tnow;if(tcnt>=ticks){break;}}}/*删除适用于μC/OS用于解锁任务调度器的自定义函数*/}
7.更改delay_ms
void delay_ms(uint16_t nms){uint32_t i;for(i=0;i<nms;i++){delay_us(1000);}}
8.将#include "os.h"改成
#include"FreeRTOS.h"
#include"task.h"
9.这时我们就完成啦sys下面的配置
4.修改中断配置文件
加入三个宏开关将原来的东西给删除掉
#if (!SYS_SUPPORT_OS)void SVC_Handler(void){}
#endif
#if (!SYS_SUPPORT_OS)voidPendSV_Handler(void){}
#endif
#if(!SYS_SUPPORT_OS)void SysTick_Handler(void){HAL_IncTick();
}
#endif
5.最后要修改的文件FreeRTOSConfig.h里面注:需要编译之后

3.编译发现有问题

是因为我电脑上有两个版本的编译器ARMCC和ARMCLANG
ARMCLANG不会向下兼容导致编译不通过
解决方案在Project → Manage → Project Items... → Folders/Extensions里面

使能我们的ARMCC,然后点击OK不使能ARMCLANG
因为我们使用的STM32F1系列的可能会比较早一点,所以支持比较早的编译器
修改之后出现这个还是出现这个问题
这是为啥呀?
