GD32F303移植FreeRTOS

[复制链接]
5134|81
 楼主| xiyaoko2365 发表于 2022-12-31 22:50 | 显示全部楼层
下载到开发板,发现并没有LED运行,仿真调试发现,MCU进入了硬件中断,如下图:
 楼主| xiyaoko2365 发表于 2022-12-31 22:52 | 显示全部楼层
 楼主| xiyaoko2365 发表于 2022-12-31 22:53 | 显示全部楼层
这里我们仔细看一下,FreeRTOSConfig.h这个文件的配置,源码如下:
 楼主| xiyaoko2365 发表于 2022-12-31 22:54 | 显示全部楼层
  1. #ifndef FREERTOS_CONFIG_H
  2. #define FREERTOS_CONFIG_H

  3. /*-----------------------------------------------------------
  4. * Application specific definitions.
  5. *
  6. * These definitions should be adjusted for your particular hardware and
  7. * application requirements.
  8. *
  9. * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
  10. * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
  11. *
  12. * See http://www.freertos.org/a00110.html
  13. *----------------------------------------------------------*/

  14. #define configUSE_PREEMPTION                1
  15. #define configUSE_IDLE_HOOK                        0
  16. #define configUSE_TICK_HOOK                        0
  17. #define configCPU_CLOCK_HZ                        ( ( unsigned long ) 72000000 )       
  18. #define configTICK_RATE_HZ                        ( ( TickType_t ) 1000 )
  19. #define configMAX_PRIORITIES                ( 5 )
  20. #define configMINIMAL_STACK_SIZE        ( ( unsigned short ) 128 )
  21. #define configTOTAL_HEAP_SIZE                ( ( size_t ) ( 17 * 1024 ) )
  22. #define configMAX_TASK_NAME_LEN                ( 16 )
  23. #define configUSE_TRACE_FACILITY        0
  24. #define configUSE_16_BIT_TICKS                0
  25. #define configIDLE_SHOULD_YIELD                1
 楼主| xiyaoko2365 发表于 2022-12-31 22:55 | 显示全部楼层
由上面代码可以看出,这里系统时钟是需要更改的,configCPU_CLOCK_HZ这个是系统时钟,GD32F303是120Mhz的主频;configTOTAL_HEAP_SIZE设置堆得大小,这里设置了17KB的大小,而在启动代码里,堆设置了1KB,栈的大小也是设置的1KB,***注意:这三者的总和不能超过MCU自身的RAM大小。***如下图:
 楼主| xiyaoko2365 发表于 2022-12-31 22:56 | 显示全部楼层
 楼主| xiyaoko2365 发表于 2022-12-31 22:56 | 显示全部楼层
这里,我们将启动文件里的堆改成0x00000200(0.5KB),configTOTAL_HEAP_SIZE也更改成20KB,更改如下:
 楼主| xiyaoko2365 发表于 2022-12-31 22:57 | 显示全部楼层
  1. #ifndef FREERTOS_CONFIG_H
  2. #define FREERTOS_CONFIG_H

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

  16. #define configUSE_PREEMPTION                1
  17. #define configUSE_IDLE_HOOK                        0
  18. #define configUSE_TICK_HOOK                        0
  19. #define configCPU_CLOCK_HZ                        ( ( unsigned long ) SystemCoreClock )       
  20. #define configTICK_RATE_HZ                        ( ( TickType_t ) 1000 )
  21. #define configMAX_PRIORITIES                ( 5 )
  22. #define configMINIMAL_STACK_SIZE        ( ( unsigned short ) 128 )
  23. #define configTOTAL_HEAP_SIZE                ( ( size_t ) ( 20 * 1024 ) )
  24. #define configMAX_TASK_NAME_LEN                ( 16 )
  25. #define configUSE_TRACE_FACILITY        0
  26. #define configUSE_16_BIT_TICKS                0
  27. #define configIDLE_SHOULD_YIELD                1
 楼主| xiyaoko2365 发表于 2022-12-31 22:58 | 显示全部楼层
接下来编译进行下载,发现依旧会进入硬件中断,这就可能让人很崩溃了,这里需要了解一下FreeRTOS在Cortex内核中如何实现任务切换的机制,这里可以参考SVC & PendSV这篇博客,总的来说,既然想实现任务切换,就需要重新写这两个函数,之后在查看一下内核文件port.c,发现这里已经帮我们写好了,那就简单了,我们将gd32f30x_it.c文件里这两个中断函数给删掉,如下:
 楼主| xiyaoko2365 发表于 2022-12-31 22:58 | 显示全部楼层
 楼主| xiyaoko2365 发表于 2022-12-31 22:59 | 显示全部楼层
这里再次进行仿真下载调试,本以为可以万事大吉了,却还是被显示狠狠打脸了,仿真发现,程序死在了下面的循环中:
 楼主| xiyaoko2365 发表于 2022-12-31 23:00 | 显示全部楼层
 楼主| xiyaoko2365 发表于 2022-12-31 23:01 | 显示全部楼层
如上图,程序死在了SVC_Handler中断这,而我们上一步是把这个函数给删了,因为在上一步操作时,我们分析,内核文件port.c中帮我们重新写了这个函数,我们找到这个对应的函数如下:
2954763b04e8d9308b.png
 楼主| xiyaoko2365 发表于 2022-12-31 23:02 | 显示全部楼层
官方写的这个函数名称和启动文件中的中断入口函数名称不一致,既然如此,只能让这两个函数名联系到一起才行,我们在FreeRTOS.h中添加如下代码:
  1. #define vPortSVCHandler SVC_Handler
  2. #define xPortPendSVHandler PendSV_Handler
 楼主| xiyaoko2365 发表于 2022-12-31 23:02 | 显示全部楼层
这下总应该可以了吧,下载编译,发现灯点亮了,心里那个开心啊,可是下一秒哭的心都有了,创建的任务是灯闪烁,现在灯只是点亮了并没有闪烁。仿真调试,发现如下: 9693663b04efa3351a.png
 楼主| xiyaoko2365 发表于 2022-12-31 23:03 | 显示全部楼层
看到这个现象,心情放松了一下,和之前现象类似,那我们接着去port.c文件去找一下,果真被我找到了:如下:
7442363b04f2779400.png
 楼主| xiyaoko2365 发表于 2022-12-31 23:04 | 显示全部楼层
那仿照之前的操作,在FreeRTOSConfig.h中添加:
  1. #define xPortSysTickHandler SysTick_Handler

 楼主| xiyaoko2365 发表于 2022-12-31 23:06 | 显示全部楼层
LED终于亮了,至此,FreeRTOS最基本的移植完成。
zyb258 发表于 2023-1-6 17:37 | 显示全部楼层
感谢大佬分享
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)函数注释掉吧?否则这个函数就相当于被重复定义,编译会报错。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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