FreeRTOS学习篇一:STM32F103C8T6下的移植与基于Keil、IAR开发环境
0.资源
2023-9-12 更新,分享资源文件:
STM32F103C8标准库的源文件,FreeRTOS V9.0.0版本源文件,标准库提取文件(IAR、Keil下),FreeRTOS提取文件(IAR、Keil下):
链接:https://pan.baidu.com/s/1X0tO9DeLZ7tJTpsvtgz-Qw?pwd=3333
提取码:3333
1.源码下载
FreeRTOS的源代码托管网址:FreeRTOS Real Time Kernel (RTOS) - Browse /FreeRTOS at SourceForge.net
进入到源代码托管网站,找到需要的版本进行下载 —— 下载V9.0.0版本,即下载FreeRTOSv9.0.0.zip
文件。
V10版本相比于V9就是加入了一些物联网相关的组件,内核基本不变。
2.文件结构
解压下载好的FreeRTOSv9.0.0.zip
文件后的目录结构如下:
进入FreeRTOS目录,重点关注里面的Demo目录、Source目录:
- Demo目录:FreeRTOS 官方为各个单片机平台移植好的工程代码,一些评估板的完整的工程文件等,里面包含了不同开发平台、不同芯片的工程文件,可以参考这些文件来进行移植、开发。
- Source目录:里面存放着内核源代码,要移植的文件就在这里面。
Source目录:
portable目录里,主要了解这几个目录即可:Keil、IAR和RVDS。
其它参考资料:
- Keil目录和RVDS目录:两个目录内的文件是一样的,都是Keil下用的,因此官方只将文件放在了RVDS目录里。RVDS 目录里包含了各种处理器相关的文件目录,根据目录名称可以指定是哪个内核(STM32的M0、M3、M4等内核)的支持文件,里面提供了 cortex-m0、m3、m4 和 m7 等内核的单片机的接口文件。RVDS目录里的文件就是用来将FreeRTOS和MCU联系起来的接口文件。
- IAR目录,IAR下的cortex-m0、m3、m4 和 m7 等内核的单片机的接口文件。
- MemMang目录: 存放的是跟内存管理相关的,总共有五个 heap 文件以及一个 readme 说明文件,这五个 heap 文件在移植的时候必须使用一个,因为 FreeRTOS 在创建内核对象的时候使用的是动态分配内存,而这些动态内存分配的函数则在这几个文件里面实现,不同的分配算法会导致不同的效率与结果。(初学,选用heap_4.c即可)
FreeRTOS 是一个软件,单片机是一个硬件,FreeRTOS 要想运行在一个单片机上面,它们就必须关联在一起,如何关联?还是得通过写代码来关联,这部分关联的文件叫接口文件,通常由汇编和 C 联合编写。这些接口文件都是跟硬件密切相关的,不同的硬件接口文件是不一样的,但都大同小异。编写这些接口文件的过程我们就叫移植,移植的过程通常由 FreeRTOS 和 mcu 原厂的人来负责,移植好的这些接口文件就放在 RVDS 这个文件夹的目录下。FreeRTOS 为我们提供了 cortex-m0、m3、m4 和 m7 等内核的单片机的接口文件,只要 是使用了这些内核的 mcu 都可以使用里面的接口文件。
这里使用FreeRTOS,准确来说是使用官方的移植,而不是移植FreeRTOS到xxxMCU。
关于RVDS目录,以里面的ARM_CM3目录为例,里面只有“port.c”与“portmacro.h”两个文件:
- port.c:里面的内容是由 FreeRTOS 官方的技术人员为 Cortex-M3 内核的处理器写的接口文件,里面核心的上下文切换代码是由汇编语言编写而成。
- portmacro.h: 则是 port.c 文件对应的头文件,主要是一些数据类型和宏定义。
3.提取FreeRTOS的源码
百度百科:软件工程中,程序往往被视为有生命的机体,将源代码从一种环境下放到另一种环境下运行也可以称为移植。
将FreeRTOS移植到STM32F103C8T6下运行,需要提取的文件有以下三部分:
- 一:include目录里的和Source目录下的直接子文件、portable目录中MemMang目录里的文件(通常使用里面的
heap_4.c
)。 - 二:根据需要从portable的IAR、RVDS目录中提取文件。
- 三:提取配置文件 —— FreeRTOSConfig.h文件,这时需要用到那个Demo里的文件了。
portable的IAR、RVDS目录及配置文件说明:
1、Keil下进行开发,就选择portable目录中RVDS目录下的文件。
2、在IAR下进行开发,就选择portable目录中的IAR目录下的文件。
3、提取 FreeRTOSConfig.h
配置文件:点进去后就能找到FreeRTOSConfig.h
文件了,如下图
提取=============>:
提取完成 —— Keil下:(我将源码放到了src文件夹里)
提取完成 —— IAR下:
基于STM32F103C8T6下的FreeRTOS源文件提取到这里就结束了。可以分别创建两个文件夹,一个用于存放在Keil下使用的(FreeRTOS_Keil
),一个用于存放在IAR下使用的(FreeRTOS_IAR
)。
4.提取STM32F1标准库
1、STM32F1固件库下载:STM32标准外设软件库 - 意法半导体STMicroelectronics,下载3.5.0版本。
2、解压 —— STM32F10x_StdPeriph_Lib_V3.5.0
,关注Libraries和Project就可以了:
3、提取:
①先创建三个文件夹 —— Start
、StdLibrary
、User
,用于存放提取出来的文件。
②提取外设库文件,即Libraries目录中STM32F10x_StdPeriph_Driver文件夹里inc和src文件夹里的所有文件,将它们都复制出来放到新建的StdLibrary
里即可:
③提取核心支持文件,即Libraries目录中CMSIS目录里的一些文件,在CMSIS目录中这几个目录里:
Libraries\CMSIS\CM3\CoreSupport
:这里面的core_cm3.c
和core_cm3.h
,复制到Start目录。Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup
:这里是启动文件,在Keil下就使用arm目录里的启动文件,在IAR开发的话就使用iar目录里的文件;STM32F103C8T6,选择里面的startup_stm32f10x_md.s
,复制到Start目录。
Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x
:将这里的stm32f10x.h、system_stm32f10x.c、system_stm32f10x.h复制出来放到Start里。- 最终Start目录里的文件:
④User文件夹,复制Project\STM32F10x_StdPeriph_Template
中以下文件进去(红框内的,system_stm32f10x.c已经放到Start里了,不要再添加这个到User里):
⑤如果在IAR下进行开发,除了第③步要使用iar目录里的启动文件外,还要Project\STM32F10x_StdPeriph_Template\EWARM
中的以下文件:(创建一个Config目录来放置该文件)
提取完毕。
5.Keil下移植
1、将提取后的基于Keil平台的FreeRTOS文件、标准库文件都放进一个3.free-rtos_Keil
目录里,再创建一个Hardware目录,用于放置自己创建的源代码文件,3.free-rtos_Keil
目录内的目录如下:
2、打开Keil,点击Project → New μVision Project来新建Keil工程,工程保存目录为3.free-rtos_Keil
目录,型号选择STM32F103C8,点击完成后弹出的一个包安装管理界面直接关闭即可。
3、项目里创建好组:
4、往组里添加好文件:
5、项目的C/C++编译设置:
①添加头文件包含路径:
点击
Project ===> Options for Target ...
,选中C/C++
后找到Include Paths
,然后点击Include Paths
那行末尾的...
按钮,然后在打开的页面中点击第一个New
按钮后再点击出现的...
按钮并选中工程目录下的Start目录,OKOK,添加完成。示意图如下:(点这个图标也是打开Options for Target ...
)
②添加宏USE_STDPERIPH_DRIVER
:
6、项目的Debug设置:
7、要修改一些文件:
①修改FreeRTOS配置文件,也就是在那个FreeRTOSConfig.h文件里更改:
/* 修改`FreeRTOSConfig.h`,在末尾的`#endif`前添加以下内容即可: */
#define xPortPendSVHandler PendSV_Handler
#define vPortSVCHandler SVC_Handler
#define xPortSysTickHandler SysTick_Handler
②修改User组里的stm32f10x_it.c
文件,将下面的内容注释掉:
/* 在stm32f10x_it.c文件中找到以下三个函数并注释掉即可 */
void SVC_Handler(void)
{
}
void PendSV_Handler(void)
{
}
void SysTick_Handler(void)
{
}
8、打开main.c,删除里面的所有代码,更改为以下代码用于测试:
#include "stm32f10x.h" // Device header
#include "FreeRTOS.h"
#include "task.h"
#include "portmacro.h"
/* 初始化GPIO口 */
static void led_init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
/* 定义一个任务句柄 */
static TaskHandle_t led_task_handle = NULL;
/* 声明一个任务 */
static void led_task(void* arg);
int main(void)
{
led_init();
/* 创建任务 */
xTaskCreate(led_task, "led_task", 512, NULL, 2, &led_task_handle);
/* 启动FreeRTOS的调度器 */
vTaskStartScheduler();
while(1);
}
/* 任务的实现 */
static void led_task(void* arg)
{
while(1){
GPIO_SetBits(GPIOC, GPIO_Pin_13);
vTaskDelay(500); // 相对延时
GPIO_ResetBits(GPIOC, GPIO_Pin_13);
vTaskDelay(500);
}
}
9、编译,烧录进STM32F103C8T6核心板:
10、最终现象:那个绿色的灯一闪一闪地亮(亮—灭—亮—灭-…)
6.IAR下移植
懒得整理了,不常用这个。有需要的就来催我一下…
2023-10-11 填坑
https://blog.csdn.net/weixin_45647341/article/details/133776481
IAR下移植FreeRTOS到STM32F103C8T6-CSDN博客
END
整理了一下笔记分享出来,希望可以帮助到首次接触FreeRTOS的小伙伴。