本文主要讲如何将FreeRTOS+ST3.5库通过MDK-ARM上移植到STM32F103系列的板子上。达到使用FreeRTOS创建任务并调度任务的目的。关于FreeRTOS的更多操作不做过多讨论(暂时我还没有探索太深)。
将中断服务程序的映射放到FreeRTOSConfig.h中,是一个较好的移植方式。避免修改startup_stm32f10x_hd.s文件。保持了st库的完整。
FreeRTOS9.0.0:下载后是一个"FreeRTOSv9.0.0.exe"自解压文件,双击将其解压备用。
下载路径:https://sourceforge.net/projects/freertos/files/FreeRTOS/
MDK-ARM5.24:其他MDK-ARM版本也可以
STM32F10x_StdPeriph_Lib_V3.5.0:下载是一个压缩文件,将其解压备用。
下载路径:http://www.openedv.com/posts/list/6054.htm
如果已有一个干净的工程模板可以跳过该章。
1、新建工程
建立E:\STM32\FreeRTOS_Templet文件夹,文件夹下的目录结构如下:
打开MDK,Project->New uVision Project。将新工程放到Project目录下。工程名称为FreeRTOS_Templet。Device选择STM32F103VE。
2、为工程添加除FreeRTOS外的基本文件
a、App文件夹下建立以下三个文件,先不写内容:
b、STM32F10xLib_V3.5.0文件夹
在解压的\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries下将Libraries内的两个文件夹复制到第一章建立的STM32F10xLib_V3.5.0文件夹下,并在解压的\Project\STM32F10x_StdPeriph_Template文件夹下将看到的“.h”、“.c”文件复制到第一章建立的STM32F10xLib_V3.5.0文件夹下。完成后STM32F10xLib_V3.5.0文件夹下如下所示:
1、增加头文件目录,如下如所示。
2、填写预定于符号,如下图所示。
3、将目录下的文件加入工程管理,如下所示:
4、填写main.c project.c project.h
main.c
/*
*************************************************************
* @file main.c
* @brief
* @author yanghailei
* @date 2018-05-06
* @version V1.00
* @par Copyright (c): yanghailei
* @par History:
*/
#include "project_conf.h"
int main()
{
}
project_conf.c
/*
*************************************************************
* @file project_conf.c
* @brief
* @author yanghailei
* @date 2018-05-06
* @version V1.00
* @par Copyright (c): yanghailei
* @par History:
*/
#include "project_conf.h"
project_conf.h
/*
*************************************************************
* @file project_conf.h
* @brief
* @author yanghailei
* @date 2018-05-06
* @version V1.00
* @par Copyright (c): yanghailei
* @par History:
*/
#ifndef __PROJECT_CONF_H
#define __PROJECT_CONF_H
#include "stm32f10x.h"
#endif
五、添加FreeRTOS到工程
1、提取FreeRTOS文件
将第一章解压的FreeRTOSv9.0.0\FreeRTOS\Source文件夹放到工程目录FreeRTOS下。
将第一章解压的FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil\FreeRTOSConfig.h放到工程目录FreeRTOS下。如下所示:
2、删除多余的FreeRTOS文件
进入工程目录G:\STM32\FreeRTOS_Yang\FreeRTOS\Source\portable。删除其他文件夹。结果如下所示:
3、将工程目录下的文件加入工程,如下所示:
4、修改头文件目录,如下所示:
5、修改main.c,如下所示:
/*
*************************************************************
* @file main.c
* @brief
* @author yanghailei
* @date 2018-05-06
* @version V1.00
* @par Copyright (c): yanghailei
* @par History:
*/
#include "project_conf.h"
void vAppTask1(void *pvParameters)
{
while(1){
vTaskDelay(200);
}
}
void AppTaskCreate(void)
{
xTaskCreate(vAppTask1, "Task1", 50, NULL, 1, NULL);
}
int main()
{
AppTaskCreate();
vTaskStartScheduler();
}
6、修改project_conf.h,在其中增加FreeRTOS的头文件。
/*
*************************************************************
* @file project_conf.h
* @brief
* @author yanghailei
* @date 2018-05-06
* @version V1.00
* @par Copyright (c): yanghailei
* @par History:
*/
#ifndef __PROJECT_CONF_H
#define __PROJECT_CONF_H
#include "stm32f10x.h"
#include "FreeRTOSConfig.h"
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "list.h"
#include "portable.h"
#endif
7、修改FreeRTOSConfig.h文件,在最后增加如下三个宏定义:
8、编译测试
编译后,提示如下三个错误。是由于我们stm32f10x_it.c内已经存在三个函数的定义。将stm32f10x_it.c中的三个函数注释掉即可。
至此可以将程序下载到板子上,测试了。
如果没有STM32板子,我们可以通过软件仿真测试程序是否移植成功。
1、设置MDK为仿真模式,在Debug界面,选择Use Simulator。Dialog DLL及Parameter修改成如下:
2、启动软件仿真
Ctrl+F5启动仿真,在vAppTask1可以看到程序隔段时间便进入。至此可以确认移植成功。