一、下载FreeRTOS源码
官网:FreeRTOS官网
下载第一个带有示例的
二、在自己stm32工程代码中建立FreeRTOS文件夹,在此文件夹下建立port、src两个子文件夹,(include文件夹到时候在源码直接拷贝过来)
include:存放FreeRTOS源码头文件
src:存放相关源码
port:存放内存管理,平台,内核相关代码
三、移植FreeRTOS代码到自己工程目录
- 打开 FreeRTOS V9.0.0 源码,在“FreeRTOSv9.0.0\FreeRTOS\Source”目录下找到 所有的‘.c 文件’,将它们拷贝到我们新建的 src 文件夹中
- 打开 FreeRTOS V9.0.0 源码,在“FreeRTOSv9.0.0\FreeRTOS\Source\portable”目录下找到“MemMang”文件夹与“RVDS”文件夹,将它们拷贝到我们新建的 port 文件夹中
- 打开 FreeRTOS V9.0.0 源码,在“FreeRTOSv9.0.0\ FreeRTOS\Source”目录下找到 “include”文件夹,它是我们需要用到 FreeRTOS 的一些头文件,将它直接拷贝 到我们新建的 FreeRTOS 文件夹中
- 打开 FreeRTOSv9.0.0 源码,在“FreeRTOSv9.0.0\FreeRTOS\Demo”文件夹下面找到 “ CORTEX_STM32F103_Keil ” 这 个 文 件 夹 , 双 击 打 开 , 在 其 根 目 录 下 找 到 这 个 “FreeRTOSConfig.h”文件,然后拷贝到我们工程的 user 文件夹下即可
四、在keil中配置
1.新建FreeRTOS/src和FreeRTOS/port分组,将源代码添加到工程,如下图
2.配置头文件路径
3.修改 FreeRTOSConfig.h
(1).修改与对应开发板的头文件 , 如果是使用 STM32F1 的开发板,则包含 F1 的头文件#include "stm32f10x.h",同理是 使用了其它系列的开发板,则包含与开发板对应的头文件即可
(2).定义两个宏
- #define xPortPendSVHandler PendSV_Handler
- #define vPortSVCHandler SVC_Handler
注意:需要根据自己开发板的实际情况修改系统总的堆大小,修改下面这个宏
#define configTOTAL_HEAP_SIZE ((size_t)(15*1024))
4.修改 stm32f10x_it.c
(1).包含#include "FreeRTOS.h"头文件
(2).注释PendSV_Handler()与 SVC_Handler()这两个函数
(3).修改中断服务函数
//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 */
}
注意:如果发生下面报错,则将#include "FreeRTOSConfig.h"头文件中的
#define INCLUDE_xTaskGetSchedulerState 1 注释即可
至此移植完成