我在查找FreeRTOS移植的相关教程特别少,所以想非常详细的介绍FreeRTOS移植stm32详细步骤,包括源码的下载,源码介绍,系统移植,代码验证等,每一步都有对应的介绍和解释,希望可以帮助到你们。
官网下载,仓库下载,镜像下载,百度网盘下载,私信我
1.1 可以直到FreeRTOS官网去下载,【FreeRTOS官网传送门】,但是下载速度很慢,不翻墙的话不建议使用这个方法下载。
1.1.1 官网页面如下,点击右上角或下方的下载入口
1.1.2 进入下载页面有两个下载选项,
一般我们下载第一个就行
1.2 直接通过仓库下载,【仓库地址传送门】,同样很慢,甚至打不开网页,也不建议使用这种方法。
1.3 通过国内镜像下载,这种方式下载不受域名影响,是最直接的方式
【国内镜像传送门】,建议使用
1.3.1 打开链接页面
1.3.2 点击下载/克隆,下载成功
1.4 使用我上传到百度网盘的源码,是在官方网站直接下载的数据包,建议使用,起码比官网和仓库快
链接:【百度网盘传送门】
提取码:sqml
1.5 以上方式都不行的可以直接私信我
下载好的压缩包解压好的文件呀包含下面的内容:
压缩包88.3MB,解压文件夹506MB
前面的文章已经很详细介绍过了,可以直达前面的文章去了解源码结构,可以更好的帮助你理解移植的原理和FreeRTOS的实现原理。
博客传送门:【FreeRTOS】详细目录结构和作用
基本上可以概括为下面一张图:
3.1 准备好FreeRTOS源码和一个配置好的STM32项目工程,我使用的是之前一个已经成功实现的LED闪烁的工程
3.2 在项目工程中创建一个FreeRTOS文件夹,里面存放所有的移植文件
3.3 在刚才创建的FreeRTOS文件夹中,分别新建src、inc、port文件夹:
3.4 接下来我们将FreeRTOS源码的移植到我们新建的文件夹中
3.4.1首先我们打开源码中的Soure文件夹中的protable文件夹,找到MemMang文件夹,这个文件夹中都是内存管理文件,我们只用到heap_4.c文件,将其复制到port文件夹中
3.4.2 接着我们在刚才的portable文件夹中,找到RVDS文件夹,选择里面的ARM_M3中的port.c和portmacro.h两个文件,也复制到我们的工程文件port文件夹中
3.4.3 回到source文件夹中,将这个文件夹中的.c文件全部复制到工程新建的src文件夹中
3.4.4 在source文件夹中的include文件夹里全部都是FreeRTOS的头文件,将其添加到工程新建的inc文件夹中
3.4.5 添加一个配置文件,在FreeRTOS文件夹中的demo文件夹中找到CORTEX_STM32F103_Keil文件夹,复制里面的FreerRTOSConfig.h文件到新建的FreeRTOS文件夹中
3.5 接着我们添加文件路径,打开keil软件点击魔术棒,进入C/C++,在Include Paths中添加文件路径,将FreeRTO、src、inc、port的路径全部添加进来
3.6 新建组将文件全部添加到工程中,点击魔术棒旁边的三个格子的图标,选择新建组,我们分别新建FreeRTOS_src、FreeRTOS_inc、FreeRTOS_port三个组,将工程文件夹src中的所有.c文件添加到FreeRTOS_src中,将工程文件夹inc中的所有.h文件添加到FreeRTOS_inc中(不包括.readme),将工程文件夹port中的文件(heap_4.c、port.c添加到FreeRTOS_port中,还有配置文件FreeRTOSConfig.h添加到FreeRTOS_inc组中
3.7 完成中断函数的宏定义,在FreeRTOSConfig.h中,在条件编译中加入
#define xPortPendSVHandler PendSV_Handler #define vPortSVCHandler SVC_Handler #define xPortSysTickHandler SysTick_Handler
3.8 注释掉STM库函数中的三个中断空函数
分别为:
void SVC_Handler(void); void PendSV_Handler(void); void SysTick_Handler(void);
至此,系统移植已经全部完成
4.1 首先在main文件中添加头文件FreeRTOS.h和task.h
#include "stm32f10x.h" // Device header #include "Delay.h" #include "FreeRTOS.H" #include "task.h"
4.2 我们直接使用LED灯闪烁的代码进行验证,先创建一个任务函数
static void task1(void *arg) { while(1) { GPIO_ResetBits(GPIOC, GPIO_Pin_13); vTaskDelay(500); GPIO_SetBits(GPIOC, GPIO_Pin_13); vTaskDelay(500); } }
4.3 在主函数中创建一个任务并开启任务调度器
xTaskCreate(task1,"task1",512,NULL,2,&task1Handler); vTaskStartScheduler();
4.4 当然要使用LED肯定要初始化串口,我们以GPIOC中的GPIO_Pin_13为例
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);
4.5 main文件中的全部代码为
#include "stm32f10x.h" // Device header #include "Delay.h" #include "FreeRTOS.H" #include "task.h" TaskHandle_t task1Handler; static void task1(void *arg) { while(1) { GPIO_ResetBits(GPIOC, GPIO_Pin_13); vTaskDelay(500); GPIO_SetBits(GPIOC, GPIO_Pin_13); vTaskDelay(500); } } int main(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); xTaskCreate(task1,"task1",512,NULL,2,&task1Handler); vTaskStartScheduler(); }
FreeRTOS常用函数传送口:【FreeRTOS】常用函数总结
4.6 完成编译后可以烧录到开发板上进行验证
4.7 或者使用keil自带的调试器进行调试
4.7.1 首先在魔术棒中找到debug选项,选择use simulate,下面也要配置成相应的单片机型号
4.7.2 点击调试按钮,在上方添加逻辑分析仪
4.7.3 点击逻辑分析仪的setup,添加信号,我们使用的是stm32f103c8t6,所以信号为PORTC.13,不同的开发板可以查看配置的串口和单片机对应的寄存器,注意需要将信号类型选择为bit
4.7.4 全速运行可以得到串口准确的波形
你也可以创建多个任务,查看波形分析任务的执行情况
项目工程完整代码传送口:
链接:FreeRTOS示例工程
提取码:k8uk