[研电赛技术支持] GD32E23xx FreeRTOS移植

[复制链接]
 楼主| tpgf 发表于 2025-3-7 12:11 | 显示全部楼层 |阅读模式
概述
        本文主要描述了GD32E230移植FreeRTOS的简要步骤。移植描述过程中,忽略了Keil软件的部分使用技巧。默认读者熟练使用Keil软件。本文的描述是基于OpenMCU_FreeRTOS这个工程,该工程已经下载放好了移植GD32E230 FreeRTOS的所有文件

        OpenMCU_FreeRTOS工程的愿景主要有:

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

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

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

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

9256667ca71dc5ab85.png

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

6159367ca71d8a903a.png

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

4001867ca71d4a5bd7.png

创建完成后的效果:

9180267ca71d1506fc.png

4、下载FreeRTOS源码

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

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

9036967ca71ccbd31c.png

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

2693167ca71c83d0de.png

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

642767ca71c3d46ac.png

注:

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

8、Application分组添加c文件

8141367ca71bd218a2.png

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

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

139767ca71b5e23af.png

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

OpenMCU_FreeRTOS\arch\GD32\GD32E23x\GD32E23x_BSP\Source

8159667ca71b1c0c7a.png

11、添加启动文件startup_gd32e23x.s

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

3544667ca71ad81701.png

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

OpenMCU_FreeRTOS\kernel

8151567ca71a940965.png

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

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

1543867ca71a40733c.png

需要关注的文件路径:

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、所有分组添加完后如下图所示:

7940867ca719f205fd.png

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

添加完成后,如下所示:

3106267ca7197d84db.png

16、编译器选项设置

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

388867ca7193767df.png

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

删除SVC_Handler, PendSV_Handler SysTick_Handler 等函数定义

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

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

4467067ca718e2bf9f.png

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

2096567ca7189f077a.png

19、编译输出

3370267ca718465413.png

工程连接
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倍)。

评论

请教一下这个12K的堆栈空间哪篇文档有提到过呢  发表于 2025-3-24 08:36
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、时钟管理、中断控制器等。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2350

主题

17466

帖子

21

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