打印

GD32F303移植FreeRTOS

[复制链接]
楼主: xiyaoko2365
手机看帖
扫描二维码
随时随地手机跟帖
21
xiyaoko2365|  楼主 | 2022-12-31 22:50 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
下载到开发板,发现并没有LED运行,仿真调试发现,MCU进入了硬件中断,如下图:

使用特权

评论回复
22
xiyaoko2365|  楼主 | 2022-12-31 22:52 | 只看该作者

使用特权

评论回复
23
xiyaoko2365|  楼主 | 2022-12-31 22:53 | 只看该作者
这里我们仔细看一下,FreeRTOSConfig.h这个文件的配置,源码如下:

使用特权

评论回复
24
xiyaoko2365|  楼主 | 2022-12-31 22:54 | 只看该作者
#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H

/*-----------------------------------------------------------
* Application specific definitions.
*
* These definitions should be adjusted for your particular hardware and
* application requirements.
*
* THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
* FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
*
* See http://www.freertos.org/a00110.html
*----------------------------------------------------------*/

#define configUSE_PREEMPTION                1
#define configUSE_IDLE_HOOK                        0
#define configUSE_TICK_HOOK                        0
#define configCPU_CLOCK_HZ                        ( ( unsigned long ) 72000000 )       
#define configTICK_RATE_HZ                        ( ( TickType_t ) 1000 )
#define configMAX_PRIORITIES                ( 5 )
#define configMINIMAL_STACK_SIZE        ( ( unsigned short ) 128 )
#define configTOTAL_HEAP_SIZE                ( ( size_t ) ( 17 * 1024 ) )
#define configMAX_TASK_NAME_LEN                ( 16 )
#define configUSE_TRACE_FACILITY        0
#define configUSE_16_BIT_TICKS                0
#define configIDLE_SHOULD_YIELD                1

使用特权

评论回复
25
xiyaoko2365|  楼主 | 2022-12-31 22:55 | 只看该作者
由上面代码可以看出,这里系统时钟是需要更改的,configCPU_CLOCK_HZ这个是系统时钟,GD32F303是120Mhz的主频;configTOTAL_HEAP_SIZE设置堆得大小,这里设置了17KB的大小,而在启动代码里,堆设置了1KB,栈的大小也是设置的1KB,***注意:这三者的总和不能超过MCU自身的RAM大小。***如下图:

使用特权

评论回复
26
xiyaoko2365|  楼主 | 2022-12-31 22:56 | 只看该作者

使用特权

评论回复
27
xiyaoko2365|  楼主 | 2022-12-31 22:56 | 只看该作者
这里,我们将启动文件里的堆改成0x00000200(0.5KB),configTOTAL_HEAP_SIZE也更改成20KB,更改如下:

使用特权

评论回复
28
xiyaoko2365|  楼主 | 2022-12-31 22:57 | 只看该作者
#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H

#include "gd32f30x.h"
/*-----------------------------------------------------------
* Application specific definitions.
*
* These definitions should be adjusted for your particular hardware and
* application requirements.
*
* THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
* FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
*
* See http://www.freertos.org/a00110.html
*----------------------------------------------------------*/
extern uint32_t SystemCoreClock;

#define configUSE_PREEMPTION                1
#define configUSE_IDLE_HOOK                        0
#define configUSE_TICK_HOOK                        0
#define configCPU_CLOCK_HZ                        ( ( unsigned long ) SystemCoreClock )       
#define configTICK_RATE_HZ                        ( ( TickType_t ) 1000 )
#define configMAX_PRIORITIES                ( 5 )
#define configMINIMAL_STACK_SIZE        ( ( unsigned short ) 128 )
#define configTOTAL_HEAP_SIZE                ( ( size_t ) ( 20 * 1024 ) )
#define configMAX_TASK_NAME_LEN                ( 16 )
#define configUSE_TRACE_FACILITY        0
#define configUSE_16_BIT_TICKS                0
#define configIDLE_SHOULD_YIELD                1

使用特权

评论回复
29
xiyaoko2365|  楼主 | 2022-12-31 22:58 | 只看该作者
接下来编译进行下载,发现依旧会进入硬件中断,这就可能让人很崩溃了,这里需要了解一下FreeRTOS在Cortex内核中如何实现任务切换的机制,这里可以参考SVC & PendSV这篇博客,总的来说,既然想实现任务切换,就需要重新写这两个函数,之后在查看一下内核文件port.c,发现这里已经帮我们写好了,那就简单了,我们将gd32f30x_it.c文件里这两个中断函数给删掉,如下:

使用特权

评论回复
30
xiyaoko2365|  楼主 | 2022-12-31 22:58 | 只看该作者

使用特权

评论回复
31
xiyaoko2365|  楼主 | 2022-12-31 22:59 | 只看该作者
这里再次进行仿真下载调试,本以为可以万事大吉了,却还是被显示狠狠打脸了,仿真发现,程序死在了下面的循环中:

使用特权

评论回复
32
xiyaoko2365|  楼主 | 2022-12-31 23:00 | 只看该作者

使用特权

评论回复
33
xiyaoko2365|  楼主 | 2022-12-31 23:01 | 只看该作者
如上图,程序死在了SVC_Handler中断这,而我们上一步是把这个函数给删了,因为在上一步操作时,我们分析,内核文件port.c中帮我们重新写了这个函数,我们找到这个对应的函数如下:

使用特权

评论回复
34
xiyaoko2365|  楼主 | 2022-12-31 23:02 | 只看该作者
官方写的这个函数名称和启动文件中的中断入口函数名称不一致,既然如此,只能让这两个函数名联系到一起才行,我们在FreeRTOS.h中添加如下代码:
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler

使用特权

评论回复
35
xiyaoko2365|  楼主 | 2022-12-31 23:02 | 只看该作者
这下总应该可以了吧,下载编译,发现灯点亮了,心里那个开心啊,可是下一秒哭的心都有了,创建的任务是灯闪烁,现在灯只是点亮了并没有闪烁。仿真调试,发现如下:

使用特权

评论回复
36
xiyaoko2365|  楼主 | 2022-12-31 23:03 | 只看该作者
看到这个现象,心情放松了一下,和之前现象类似,那我们接着去port.c文件去找一下,果真被我找到了:如下:

使用特权

评论回复
37
xiyaoko2365|  楼主 | 2022-12-31 23:04 | 只看该作者
那仿照之前的操作,在FreeRTOSConfig.h中添加:
#define xPortSysTickHandler SysTick_Handler

使用特权

评论回复
38
xiyaoko2365|  楼主 | 2022-12-31 23:06 | 只看该作者
LED终于亮了,至此,FreeRTOS最基本的移植完成。

使用特权

评论回复
39
zyb258| | 2023-1-6 17:37 | 只看该作者
感谢大佬分享

使用特权

评论回复
40
caoenq| | 2023-1-11 16:00 | 只看该作者
xiyaoko2365 发表于 2022-12-31 23:04
那仿照之前的操作,在FreeRTOSConfig.h中添加:

大佬你好:最后这一点儿,你在FreeRTOSConfig.h中添加了一个宏定义“#define xPortSysTickHandler SysTick_Handler”,同时还得把gd32f30x_it.c文件里的void SysTick_Handler(void)函数注释掉吧?否则这个函数就相当于被重复定义,编译会报错。

使用特权

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

本版积分规则