tpgf 发表于 2025-3-7 12:11

GD32E23xx FreeRTOS移植

概述
      本文主要描述了GD32E230移植FreeRTOS的简要步骤。移植描述过程中,忽略了Keil软件的部分使用技巧。默认读者熟练使用Keil软件。本文的描述是基于OpenMCU_FreeRTOS这个工程,该工程已经下载放好了移植GD32E230 FreeRTOS的所有文件

      OpenMCU_FreeRTOS工程的愿景主要有:

      1.、能移植支持主流mcu的freeRTOS

      2、深入分析FreeRTOS代码和第三方库代码,让嵌入式学习变得非常容易;

      3、集成一些嵌入式产品中常用的第三方库文件,并且该工程会开发做一些产品原型,所有的技术方案,就像它的名字一样,全部开源。

移植步骤
1、keil创建GD32E230的工程



注意:一定要选中RTE中CMSIS中的CORE部分



2、工程创建完毕后,在keil中建立分组管理,如下所示:



创建完成后的效果:



4、下载FreeRTOS源码

      本文在描述过程中,所有的源码都是基于OpenMCU_FreeRTOS工程。文章的最后部分,有该工程的链接。

5、在刚才新创建的keil GD32E230工程目录下创建Appication文件夹和Utilities文件夹



6、将如下文件拷贝到Application文件夹下面.



7、将如下文件拷贝到Utilities文件下下面



注:

      拷贝的文件都来自于OpenMCU_RTOS工程;读者可以通过文章最后的连接,获得工程源码。

8、Application分组添加c文件



9、CMSIS添加system_gd32e23x.c C文件,文件存放的路径为:

OpenMCU_FreeRTOS\arch\GD32\GD32E23x\CMSIS\GD\GD32E23x\Source\



10、添加GD32E23x BSP驱动文件,文件路径为:

OpenMCU_FreeRTOS\arch\GD32\GD32E23x\GD32E23x_BSP\Source



11、添加启动文件startup_gd32e23x.s

文件路径:OpenMCU_FreeRTOS\arch\GD32\GD32E23x\CMSIS\GD\GD32E23x\Source\ARM\startup_gd32e23x.s



12、添加freeRTOS内核C文件,文件路径为:

OpenMCU_FreeRTOS\kernel



13、添加内核移植中的与GD32E230相关的代码

      由于GD23E230基于Cortex-M23架构,这部分代码跟Cortex-M4和Corex-M0的架构的移植不同,有安全和非安全的区别,我们基于非安全并且不开启ARM TrustZone特性进行讲解描述;



需要关注的文件路径:

port.c文件:OpenMCU_FreeRTOS\kernel\portable\ARMv8M\non_secure

portasm.c: OpenMCU_FreeRTOS\kernel\portable\ARMv8M\non_secure\portable\GCC\ARM_CM23_NTZ

heap_4.c: OpenMCU_FreeRTOS\kernel\portable\MemMang

FreeRTOSConfig.h: GD32E230\Application

14、所有分组添加完后如下图所示:



15、添加编译时的头文件路径

1、Application

2、OpenMCU_FreeRTOS\arch\GD32\GD32E23x\CMSIS\GD\GD32E23x\Include

3、OpenMCU_FreeRTOS\arch\GD32\GD32E23x\CMSIS

4、OpenMCU_FreeRTOS\arch\GD32\GD32E23x\GD32E23x_BSP\Include

5、Utilities

6、OpenMCU_FreeRTOS\kernel\include

7、OpenMCU_FreeRTOS\kernel\portable\ARMv8M\non_secure

8、OpenMCU_FreeRTOS\kernel\portable\ARMv8M\non_secure\portable\GCC\ARM_CM23_NTZ

添加完成后,如下所示:



16、编译器选项设置

加入GD32E230定义和修改编译警告级别



17、修改gd32e23x_it.c文件中的如下函数定义

删除SVC_Handler, PendSV_Handler SysTick_Handler 等函数定义

18、修改FreeRTOSConfig.h文件,将堆内存修改为5KB

由于整个GD32E230系列的SRAM配置如下如所示:



因此,将FreeRTOS的堆内存调整为5KB(程序本身加载也占用内存,调整过大,会导致程序链接编译错误)



19、编译输出



工程连接
yanl1229/OpenMCU_FreeRTOS
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/yanl1229/article/details/146032558

beacherblack 发表于 2025-3-19 10:52

下载FreeRTOS的最新版本,并确保源码的完整性。

janewood 发表于 2025-3-19 11:44

使用调试工具对移植后的FreeRTOS进行调试,确保所有任务能够正确运行,且没有发生资源冲突或死锁等问题。

abotomson 发表于 2025-3-19 13:19

FreeRTOSConfig.h:这是FreeRTOS的核心配置文件

yeates333 发表于 2025-3-19 16:23

了解并遵循FreeRTOS关于中断处理的最佳实践,例如尽量缩短ISR内的处理逻辑,复杂的处理应该通过发布事件给任务的方式来完成。

lzbf 发表于 2025-3-20 08:58

GD32E23xx的Cortex-M0+内核及其相关架构特性,如中断向量表、系统定时器、堆栈指针等寄存器的设置和使用方式。

sheflynn 发表于 2025-3-20 11:29

正确配置Cortex-M0+内核的中断优先级分组

iyoum 发表于 2025-3-20 13:24

SysTick是FreeRTOS默认的时基中断,需在启动时配置其重载值以实现精确的时间切片。

mnynt121 发表于 2025-3-20 15:09

在调用vTaskStartScheduler()前完成所有必要的硬件初始化工作,比如时钟配置、外设初始化等。

febgxu 发表于 2025-3-20 16:52

为每个任务分配合理的优先级,避免优先级反转等问题。同时,要注意FreeRTOS中的任务优先级与传统的操作系统优先级可能存在差异,需要进行适当的转换和调整。

FranklinUNK 发表于 2025-3-20 21:53

有没有配置好的工程啊?

lzmm 发表于 2025-3-21 14:39

为每个任务分配足够的堆栈空间(GD32E23xx最大堆栈约12KB)。建议根据任务复杂度预留余量(如空闲任务堆栈设为configMINIMAL_STACK_SIZE的2倍)。

hilahope 发表于 2025-3-21 16:23

将耗时操作(如数据处理)移至任务层,ISR仅触发事件。

louliana 发表于 2025-3-21 18:28

检查堆栈分配是否足够,或任务函数参数传递错误。

mattlincoln 发表于 2025-3-21 21:15

对于资源受限的应用,注意优化内存使用,避免不必要的大块内存分配。

bestwell 发表于 2025-3-21 23:01

在移植过程中,可能需要修改或屏蔽某些中断函数,如SVC_Handler、PendSV_Handler、SysTick_Handler等,以避免与FreeRTOS的调度机制发生冲突。

bestwell 发表于 2025-3-22 17:44

将FreeRTOS移植到GD32E23xx系列微控制器上时,需要注意工程创建、文件添加与路径设置、编译器选项设置、中断函数处理、FreeRTOS配置、任务与调度器、硬件平台配置以及调试与验证等关键点。

51xlf 发表于 2025-3-22 17:59

正确设置了中断向量表以及异常处理程序,特别是PendSV和SysTick中断服务例程(ISR),它们对FreeRTOS的任务调度至关重要。

jackcat 发表于 2025-3-22 18:12

修改FreeRTOSConfig.h文件,根据GD32E230的硬件资源和应用需求,配置合适的堆内存大小、任务优先级、任务堆栈大小等参数。
特别注意,由于GD32E230系列的SRAM配置有限,因此需要将FreeRTOS的堆内存调整为合适的值,以避免程序链接编译错误。

alvpeg 发表于 2025-3-22 18:31

GD32E23xx系列微控制器支持FreeRTOS所需的硬件特性,如足够的RAM、ROM、时钟管理、中断控制器等。
页: [1] 2
查看完整版本: GD32E23xx FreeRTOS移植