[STM32H7] STM32移植FreeRTOS经验详细教程_stm32移植rtos

[复制链接]
2653|14
 楼主| 范德萨发额 发表于 2024-9-29 01:08 | 显示全部楼层 |阅读模式
1406666f837f5e4b5a.png
下载源码后,解压打开FreeRTOS源码文件目录结构如下图所示:

5317966f83800f0dde.png

FreeRTOS移植

FreeRTOS文件夹下,有 Demo和Source文件夹是移植过程中需要使用的,FreeRTOS文件夹下面的其它文件夹及文件可忽略。

RTOS代码的核心包含在三个文件中:tasks.c、queue.c、list.c。这三个文件位于FreeRTOS/Source目录。在该目录下还包含三个可选的文件:timers.c、event_groups.c、croutine.c、stream buffer.c,分别实现软件定时、事件组、协程功能和流式缓冲区。
 楼主| 范德萨发额 发表于 2024-9-29 01:10 | 显示全部楼层
FreeRTOS官方移植参考说明:Microcontrollers and compiler tool chains supported by FreeRTOS


8617766f838866dc7f.png
移植步骤:

①、在KEIL工程主目录下创建FreeRTOS文件夹,然后在FreeRTOS中依次创建include、port、src文件夹,如下图所示。

 楼主| 范德萨发额 发表于 2024-9-29 01:10 | 显示全部楼层
 楼主| 范德萨发额 发表于 2024-9-29 01:10 | 显示全部楼层
进入下载的FreeRTOSv202212.01源码文件中,将FreeRTOSv202212.01\FreeRTOS\Source\include 的文件拷贝到KEIL工程的FreeRTOS/include中

8493066f8389814138.png
 楼主| 范德萨发额 发表于 2024-9-29 01:11 | 显示全部楼层
进入FreeRTOSv202212.01\FreeRTOS\Source 目录,将 croutine.c、event groups.c、list.c、 queue.c、stream buffer.c、tasks.c、timers.c拷贝到KEIL工程的 FreeRTOS/src 路径。

5779266f838ab48ff2.png
 楼主| 范德萨发额 发表于 2024-9-29 01:11 | 显示全部楼层
进入 FreeRTOSv202212.01\FreeRTOS\Source\portable 目录,拷贝MemMang文件到KEIL工程中的FreeRTOS/port路径下。 3111966f838bc873d8.png
 楼主| 范德萨发额 发表于 2024-9-29 01:11 | 显示全部楼层
进入FreeRTOSv202212.01\FreeRTOS\Demo中,选择对应芯片的Demo例程,然后拷贝FreeRTOSConfig.h文件到 FreeRTOS/include 路径中。
 楼主| 范德萨发额 发表于 2024-9-29 01:11 | 显示全部楼层
本例程选择了STM32F407系列芯片进行移植,其它芯片的移植操作和本例程操作类似。

7465566f838d0b4f7b.png
 楼主| 范德萨发额 发表于 2024-9-29 01:12 | 显示全部楼层
进入FreeRTOSv202212.01\FreeRTOS\Source\portable\RVDS\ARM_CM4F,拷贝port.c和portmacro.h到 FreeRTOS/port 路径下。

4753166f838ddb2488.png

 楼主| 范德萨发额 发表于 2024-9-29 01:12 | 显示全部楼层
将FreeRTOS代码添加到KEIL裸机工程设备树中。

heap_x.c内存分配文件根据需要,只能加入一个!

4775866f8390063ec0.png
 楼主| 范德萨发额 发表于 2024-9-29 01:13 | 显示全部楼层
将FreeRTOS代码添加到KEIL裸机工程设备树中。

heap_x.c内存分配文件根据需要,只能加入一个!
5427066f83943e02b3.png
2535666f83948ad8f1.png
 楼主| 范德萨发额 发表于 2024-9-29 01:16 | 显示全部楼层
、打开FreeRTOSConfig.h文件,因MDK默认使用armcc编译器,需在FreeRTOSConfig.h文件中添加defined(_CC_ARM),避免源码找不到SystemCoreClock,详细添加如下:

/* Ensure stdint is only used by the compiler, and not the assembler. */
#if defined(__ICCARM__)||defined(__CC_ARM)||defined(__GNU__)
        #include <stdint.h>
        extern uint32_t SystemCoreClock;//系统时钟值168000000,在system_stm32f4xx.c中定义
#endif
 楼主| 范德萨发额 发表于 2024-9-29 01:16 | 显示全部楼层
 楼主| 范德萨发额 发表于 2024-9-29 01:16 | 显示全部楼层
编译运行FreeRTOS
测试FreeRTOS源代码
#include "stm32f4xx.h"
#include "FreeRTOS/FreeRTOS.h"
#include "FreeRTOS/task.h"
#include <stdio.h>
#include "usart.h"

TaskHandle_t app_task1_handle = NULL;
TaskHandle_t app_task2_handle = NULL;
void app_task1(void* pvParameters);
void app_task2(void* pvParameters);

int main(void)
{
        NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );
        //SysTick_Config(SystemCoreClock/configTICK_RATE_HZ);        //开启导致硬件错误中断
        USART1_Init(115200);
        printf("starting...\r\n");
        /* 创建app_task1任务 */
        xTaskCreate((TaskFunction_t )app_task1,                  /* 任务入口函数 */
                          (const char*    )"app_task1",                        /* 任务名字 */
                          (uint16_t       )512,                                  /* 任务栈大小 */
                          (void*          )NULL,                                /* 任务入口函数参数 */
                          (UBaseType_t    )2,                                         /* 任务的优先级 */
                          (TaskHandle_t*  )&app_task1_handle);        /* 任务控制块指针 */
       
        /* 创建app_task2任务 */                  
        xTaskCreate((TaskFunction_t )app_task2,                  /* 任务入口函数 */
                          (const char*    )"app_task2",                        /* 任务名字 */
                          (uint16_t       )512,                                  /* 任务栈大小 */
                          (void*          )NULL,                                /* 任务入口函数参数 */
                          (UBaseType_t    )2,                                         /* 任务的优先级 */
                          (TaskHandle_t*  )&app_task2_handle);        /* 任务控制块指针 */
        /* 开启任务调度 */
        vTaskStartScheduler();
}

void app_task1(void* pvParameters)
{
        int cnt = 0;
        for(;;)
        {
                printf("app_task1 is running %d...\r\n", cnt);
                vTaskDelay(1000);
                cnt++;
        }
}

void app_task2(void* pvParameters)
{
        int cnt = 0;
        for(;;)
## 最后

**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。**

**因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**

![img]()

![img](https://img-blog.csdnimg.cn/img_convert/955cbdb19d54f920e2d00503c720f9a5.jpeg)

![img]()

![img]()

![img]()

![img]()

![]()



**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**

[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!


联网开发知识点,真正体系化!**

[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!


4y1b3 发表于 2024-9-29 22:13 来自手机 | 显示全部楼层
FreeRTOS文件夹下面的其它文件夹及文件可忽略
您需要登录后才可以回帖 登录 | 注册

本版积分规则

71

主题

1022

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部