[应用相关] STM32H750移植FreeRTOS

[复制链接]
3162|65
 楼主| 自动化陈稳 发表于 2022-2-27 22:20 | 显示全部楼层 |阅读模式
最近淘了一块STM32H750XBH6_ArtPi开发板(就是RT-thread出品),开发者完全可以基于此开发板提供的SDK进行开发(已经完全适配rtthread),但是本人还是想自己移植一下FreeRTOS。

        说干就干,让我们开始吧。

        关于FreeRTOS的资料也是一大堆,本人还是比较习惯于使用官网的资料(考虑到初学者可能刚接触FreeRTOS,对RTOS的概念可能也不太清楚,所以我这边计划后面专门出一个栏目介绍FreeRTOS系列)。


 楼主| 自动化陈稳 发表于 2022-2-27 22:21 | 显示全部楼层
    首先从官网下载FreeRTOS源码并解压如下(我下载的是202107的版本,可能你下载时版本已经更新,不用担心直接用即可)
 楼主| 自动化陈稳 发表于 2022-2-27 22:22 | 显示全部楼层
 楼主| 自动化陈稳 发表于 2022-2-27 22:25 | 显示全部楼层
  我们关注FreeRTOS文件夹即可(FreeRTOS-Plus里面是一些高级功能暂时用不上)

        
 楼主| 自动化陈稳 发表于 2022-2-27 22:26 | 显示全部楼层
 楼主| 自动化陈稳 发表于 2022-2-27 22:27 | 显示全部楼层
   上图中的include目录以及所有的.c文件就是FreeRTOS源代码,然后我们移植的时候需要这些。

        其中,

        croutine.c是协程的实现(基本不用);

        event_group.c是事件组的实现用于线程间、线程与中断间同步;

        list.c是其内部链表的实现;

        queue.c是消息队列的实现用于线程间、线程与中断间同步;其中也实现了二值信号量和计数型信号量;

        stream_buffer.c用于线程间、线程与中断间的数据通信;

        tasks.c就是任务和调度器的实现(很重要)。

        另外我们也需要portable目录下的一些文件,这些文件主要做了不同平台的适配,例如中断时的部分压栈出栈处理(有些寄存器的值是硬件自动进行的),portable文件夹里面内容如下,我们发现基于不同的编译器有对应的实现
 楼主| 自动化陈稳 发表于 2022-2-27 22:28 | 显示全部楼层
 楼主| 自动化陈稳 发表于 2022-2-27 22:29 | 显示全部楼层
其中MemMang里面包含了不同的动态内存分配,根据不同的场景我们需要选择合适的实现。本文我们着重讲解如何在Keil MDK下移植FreeRTOS,故需要Keil目录的内容,但其实RVDS只是Keil的别名,所以我们需要的文件在RVDS目录下。
 楼主| 自动化陈稳 发表于 2022-2-27 22:30 | 显示全部楼层
 楼主| 自动化陈稳 发表于 2022-2-27 22:32 | 显示全部楼层
我们的芯片为STM32H750XBH6,其是CM7内核,故我们需要如下文件
90837621b8b25825af.png
 楼主| 自动化陈稳 发表于 2022-2-27 22:33 | 显示全部楼层
二、准备
        FreeRTOSv202107.00

        Keil MDK V5.34

        STM32CubeMX V6.3.0

三、实战  
        下面我们来创建一个工程,使用STM32CubeMX生成一个Keil MDK工程,在这个工程中我们添加板载的LED的GPIO配置。然后我们创建两个任务(在RTOS的世界里任务可以理解为linux系统上的进程,可以完全独立,也可以相关之间有同步,这个后面我会出FreeRTOS指南来讲解)。

        参考《手把手系列--使用STM32CubeMX生成代码工程》

        为方便学习,这边提供的已经准备好的工程给大家下载。

        我们通过STM32CubeMX生成工程为STM32H750XBH6_FreeRTOS_LED,在其目录下我们添加FreeRTOS文件夹,里面的内容即上面提到的FreeRTOS的源码部分。
15904621b8ba23a15e.png
54327621b8ba87d3a6.png
 楼主| 自动化陈稳 发表于 2022-2-27 22:33 | 显示全部楼层
下面我们打开Keil工程,如下

        
90210621b8bd54ae38.png
 楼主| 自动化陈稳 发表于 2022-2-27 22:35 | 显示全部楼层
我们先直接编译一下
31600621b8c18e7666.png

通过STM32CubeMX生成的工程没有任何问题。那下面我们在工程内加入FreeRTOS

相关内容。
 楼主| 自动化陈稳 发表于 2022-2-27 22:35 | 显示全部楼层
    首先我们需要添加分组FreeRTOS/kernal/src、FreeRTOS/kernal/port、FreeRTOS/heap
58913621b8c4e1ce93.png
 楼主| 自动化陈稳 发表于 2022-2-27 22:36 | 显示全部楼层
我们需要添加头文件路径\
15166621b8c851e1a5.png
 楼主| 自动化陈稳 发表于 2022-2-27 22:37 | 显示全部楼层
这个时候我们直接编译,则会报告如下错误
78642621b8c9ac502d.png
 楼主| 自动化陈稳 发表于 2022-2-27 22:37 | 显示全部楼层
错误信息指明FreeRTOSConfig.h文件不存在。
 楼主| 自动化陈稳 发表于 2022-2-27 22:38 | 显示全部楼层
   由于FreeRTOS是一个可裁剪的OS,那我们在使用时就需要做一些配置,这个文件就是用来配置FreeRTOS的,那FreeRTOS下载包里面肯定有这个配置文件。

        从FreeRTOS源码目录拷贝这个文件到工程目录下并添加到Keil MDK分组中,因为STM32H750属于CM7类型,所以我们直接使用STM32F7系列的也可以。

64483621b8cd50509d.png


13297621b8d09861f4.png
 楼主| 自动化陈稳 发表于 2022-2-27 22:39 | 显示全部楼层
 楼主| 自动化陈稳 发表于 2022-2-27 22:45 | 显示全部楼层
我们再次编译一下,发现还是有问题,如下
49730621b8e8a6ded0.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

106

主题

1380

帖子

1

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