打印
[STM32H7]

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

[复制链接]
40|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

下载源码后,解压打开FreeRTOS源码文件目录结构如下图所示:



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



移植步骤:

①、在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中

使用特权

评论回复
5
范德萨发额|  楼主 | 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 路径。


使用特权

评论回复
6
范德萨发额|  楼主 | 2024-9-29 01:11 | 只看该作者
进入 FreeRTOSv202212.01\FreeRTOS\Source\portable 目录,拷贝MemMang文件到KEIL工程中的FreeRTOS/port路径下。

使用特权

评论回复
7
范德萨发额|  楼主 | 2024-9-29 01:11 | 只看该作者
进入FreeRTOSv202212.01\FreeRTOS\Demo中,选择对应芯片的Demo例程,然后拷贝FreeRTOSConfig.h文件到 FreeRTOS/include 路径中。

使用特权

评论回复
8
范德萨发额|  楼主 | 2024-9-29 01:11 | 只看该作者
本例程选择了STM32F407系列芯片进行移植,其它芯片的移植操作和本例程操作类似。

使用特权

评论回复
9
范德萨发额|  楼主 | 2024-9-29 01:12 | 只看该作者
进入FreeRTOSv202212.01\FreeRTOS\Source\portable\RVDS\ARM_CM4F,拷贝port.c和portmacro.h到 FreeRTOS/port 路径下。



使用特权

评论回复
10
范德萨发额|  楼主 | 2024-9-29 01:12 | 只看该作者
将FreeRTOS代码添加到KEIL裸机工程设备树中。

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

使用特权

评论回复
11
范德萨发额|  楼主 | 2024-9-29 01:13 | 只看该作者
将FreeRTOS代码添加到KEIL裸机工程设备树中。

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

使用特权

评论回复
12
范德萨发额|  楼主 | 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

使用特权

评论回复
13
范德萨发额|  楼主 | 2024-9-29 01:16 | 只看该作者

使用特权

评论回复
14
范德萨发额|  楼主 | 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)

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


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

51

主题

877

帖子

1

粉丝