【FreeRTOS】FreeRTOS移植stm32详细步骤介绍
作者:mmseoamin日期:2023-12-14

我在查找FreeRTOS移植的相关教程特别少,所以想非常详细的介绍FreeRTOS移植stm32详细步骤,包括源码的下载,源码介绍,系统移植,代码验证等,每一步都有对应的介绍和解释,希望可以帮助到你们。

【FreeRTOS】FreeRTOS移植stm32详细步骤介绍,在这里插入图片描述,第1张


文章目录

    • 1. FreeRTOS源码的下载
    • 2. FreeRTOS源码介绍
    • 3. FreeRTOS系统移植
    • 4. 系统代码验证

      1. FreeRTOS源码的下载

      官网下载,仓库下载,镜像下载,百度网盘下载,私信我


      1.1 可以直到FreeRTOS官网去下载,【FreeRTOS官网传送门】,但是下载速度很慢,不翻墙的话不建议使用这个方法下载。

      1.1.1 官网页面如下,点击右上角或下方的下载入口

      【FreeRTOS】FreeRTOS移植stm32详细步骤介绍,在这里插入图片描述,第2张


      1.1.2 进入下载页面有两个下载选项,

      • 第一个选项是FreeRTOS 202212.01,下载的数据包包含最新 FreeRTOS 内核、 FreeRTOS-Plus 库 和 AWS IoT 库,以及示例项目
      • 第二个选项是FreeRTOS 202210.01 LTS,数据包包含 FreeRTOS LTS 库,其中包括 FreeRTOS 内核和 IoT 库,但没有示例项目

        一般我们下载第一个就行

        【FreeRTOS】FreeRTOS移植stm32详细步骤介绍,在这里插入图片描述,第3张


        1.2 直接通过仓库下载,【仓库地址传送门】,同样很慢,甚至打不开网页,也不建议使用这种方法。


        1.3 通过国内镜像下载,这种方式下载不受域名影响,是最直接的方式

        【国内镜像传送门】,建议使用


        1.3.1 打开链接页面

        【FreeRTOS】FreeRTOS移植stm32详细步骤介绍,在这里插入图片描述,第4张


        1.3.2 点击下载/克隆,下载成功

        【FreeRTOS】FreeRTOS移植stm32详细步骤介绍,在这里插入图片描述,第5张


        1.4 使用我上传到百度网盘的源码,是在官方网站直接下载的数据包,建议使用,起码比官网和仓库快

        链接:【百度网盘传送门】

        提取码:sqml


        1.5 以上方式都不行的可以直接私信我

        下载好的压缩包解压好的文件呀包含下面的内容:

        【FreeRTOS】FreeRTOS移植stm32详细步骤介绍,在这里插入图片描述,第6张

        压缩包88.3MB,解压文件夹506MB


        2. FreeRTOS源码介绍

        前面的文章已经很详细介绍过了,可以直达前面的文章去了解源码结构,可以更好的帮助你理解移植的原理和FreeRTOS的实现原理。

        博客传送门:【FreeRTOS】详细目录结构和作用

        基本上可以概括为下面一张图:

        【FreeRTOS】FreeRTOS移植stm32详细步骤介绍,在这里插入图片描述,第7张


        3. FreeRTOS系统移植

        3.1 准备好FreeRTOS源码和一个配置好的STM32项目工程,我使用的是之前一个已经成功实现的LED闪烁的工程

        【FreeRTOS】FreeRTOS移植stm32详细步骤介绍,在这里插入图片描述,第8张

        【FreeRTOS】FreeRTOS移植stm32详细步骤介绍,在这里插入图片描述,第9张


        3.2 在项目工程中创建一个FreeRTOS文件夹,里面存放所有的移植文件

        【FreeRTOS】FreeRTOS移植stm32详细步骤介绍,在这里插入图片描述,第10张


        3.3 在刚才创建的FreeRTOS文件夹中,分别新建src、inc、port文件夹:

        • src文件夹用来存放源码
        • inc文件夹用来存放头文件
        • port文件夹用来存放移植平台的相关文件

          【FreeRTOS】FreeRTOS移植stm32详细步骤介绍,在这里插入图片描述,第11张


          3.4 接下来我们将FreeRTOS源码的移植到我们新建的文件夹中

          3.4.1首先我们打开源码中的Soure文件夹中的protable文件夹,找到MemMang文件夹,这个文件夹中都是内存管理文件,我们只用到heap_4.c文件,将其复制到port文件夹中

          【FreeRTOS】FreeRTOS移植stm32详细步骤介绍,在这里插入图片描述,第12张


          3.4.2 接着我们在刚才的portable文件夹中,找到RVDS文件夹,选择里面的ARM_M3中的port.c和portmacro.h两个文件,也复制到我们的工程文件port文件夹中

          【FreeRTOS】FreeRTOS移植stm32详细步骤介绍,在这里插入图片描述,第13张


          3.4.3 回到source文件夹中,将这个文件夹中的.c文件全部复制到工程新建的src文件夹中


          【FreeRTOS】FreeRTOS移植stm32详细步骤介绍,在这里插入图片描述,第14张


          3.4.4 在source文件夹中的include文件夹里全部都是FreeRTOS的头文件,将其添加到工程新建的inc文件夹中

          【FreeRTOS】FreeRTOS移植stm32详细步骤介绍,在这里插入图片描述,第15张


          3.4.5 添加一个配置文件,在FreeRTOS文件夹中的demo文件夹中找到CORTEX_STM32F103_Keil文件夹,复制里面的FreerRTOSConfig.h文件到新建的FreeRTOS文件夹中

          【FreeRTOS】FreeRTOS移植stm32详细步骤介绍,在这里插入图片描述,第16张


          3.5 接着我们添加文件路径,打开keil软件点击魔术棒,进入C/C++,在Include Paths中添加文件路径,将FreeRTO、src、inc、port的路径全部添加进来

          【FreeRTOS】FreeRTOS移植stm32详细步骤介绍,在这里插入图片描述,第17张


          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组中

          【FreeRTOS】FreeRTOS移植stm32详细步骤介绍,在这里插入图片描述,第18张

          【FreeRTOS】FreeRTOS移植stm32详细步骤介绍,在这里插入图片描述,第19张

          【FreeRTOS】FreeRTOS移植stm32详细步骤介绍,在这里插入图片描述,第20张


          3.7 完成中断函数的宏定义,在FreeRTOSConfig.h中,在条件编译中加入

          #define xPortPendSVHandler PendSV_Handler
          #define vPortSVCHandler SVC_Handler
          #define xPortSysTickHandler SysTick_Handler
          

          【FreeRTOS】FreeRTOS移植stm32详细步骤介绍,在这里插入图片描述,第21张


          3.8 注释掉STM库函数中的三个中断空函数

          分别为:

          void SVC_Handler(void);
          void PendSV_Handler(void);
          void SysTick_Handler(void);
          

          【FreeRTOS】FreeRTOS移植stm32详细步骤介绍,在这里插入图片描述,第22张

          至此,系统移植已经全部完成


          4. 系统代码验证

          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,下面也要配置成相应的单片机型号

          【FreeRTOS】FreeRTOS移植stm32详细步骤介绍,在这里插入图片描述,第23张


          4.7.2 点击调试按钮,在上方添加逻辑分析仪

          【FreeRTOS】FreeRTOS移植stm32详细步骤介绍,在这里插入图片描述,第24张


          4.7.3 点击逻辑分析仪的setup,添加信号,我们使用的是stm32f103c8t6,所以信号为PORTC.13,不同的开发板可以查看配置的串口和单片机对应的寄存器,注意需要将信号类型选择为bit

          【FreeRTOS】FreeRTOS移植stm32详细步骤介绍,在这里插入图片描述,第25张


          4.7.4 全速运行可以得到串口准确的波形

          【FreeRTOS】FreeRTOS移植stm32详细步骤介绍,在这里插入图片描述,第26张

          你也可以创建多个任务,查看波形分析任务的执行情况


          项目工程完整代码传送口:

          链接:FreeRTOS示例工程

          提取码:k8uk