> 文档中心 > 【GD32F310开发板试用】FreeRTOS移植及过程中的问题总结

【GD32F310开发板试用】FreeRTOS移植及过程中的问题总结


首发极术社区。如对兆易创新GD32F310 MCU感兴趣,欢迎添加微信 aijishu2020 加入GD32技术讨论群。

1、背景介绍

非常高兴获得兆易创新GD32F310开发板试用的机会,昨天收到开发板后简单看了一下资料就上电开始搞了,完成了DEMO例程运行和FreeRTOS的移植,我也是第一次移植该系统,参考了社区中大佬发的移植文章,与之不同的是我的移植是尽量不改变例程和RTOS目录结构,也尽量少的修改代码内容,这样相对来说对新手同学更友好更容易上手;其次,我也将使用开发板和移植RTOS过程中遇到的问题总结了一下,以便大家遇到这些问题时可以快速解决,节省时间;

2、FreeRTOS移植

2.1 移植准备

a)在开发板上能跑起来的基础工程,比如LED点灯的例程,确保开发环境正常,烧录程序正常;

b)英文路径下新建一个Code目录(名字随便取,不要有中文),将GD32310K_START_Demo_Suites文件夹拷贝一份放到该目录下,进入GD32310K_START_Demo_Suites件夹,保留Project下的01_GPIO_Running_LED工程,其他工程删除(本次移植以LED点灯为例,也可以用其他工程);

c)将GD32F3x0_Firmware_Library文件夹拷贝一份到Code目录;

d)下载FreeRTOS文件(点击前往),选择文件夹中的FreeRTOS文件夹拷贝放到GD32310K_START_Demo_Suites文件夹中,其中Demo文件夹很大,也没什么用,可以直接删掉;

e)至此所有文件已就绪,目录结构如下图所示

2.2 工程配置修改

a)新建文件夹FreeRTOS并将RTOS文件添加进去,如下图所示

b)增加头文件包含路径,如下图所示

c)增加FreeRTOSConfig.h文件,并包含到工程文件中,可以参考例程中的此文件,我就直接借用了大佬发的那个了(后面有链接);

2.3 代码修改

a)void SVC_Handler(void)和void PendSV_Handler(void)屏蔽掉,并修改SysTick_Handler()函数,如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FARfUPBS-1649640356629)(/img/bVbt08)]

b)main函数修改如下:

#include "gd32f3x0.h"#include "gd32f310k_start.h"#include "systick.h"#include "FreeRTOS.h"#include "task.h"#include "portmacro.h"#define START_TASK_PRIO 1#define START_STK_SIZE  128  TaskHandle_t StartTask_Handler;void start_task(void *pvParameters);#define TASK1_TASK_PRIO 2#define TASK1_STK_SIZE  128  TaskHandle_t Task1Task_Handler;void task1_task(void *pvParameters);/*!    \brief      main function    \param[in]  none    \param[out] none    \retval     none*/int main(void){      nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0);    systick_config();    /* enable the LED GPIO clock */    rcu_periph_clock_enable(RCU_GPIOA);    /* configure led GPIO port */     gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_8);    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8); gpio_bit_reset(GPIOA, GPIO_PIN_8);    xTaskCreate((TaskFunction_t )start_task,      (const char*    )"start_task",   (uint16_t)START_STK_SIZE, (void*   )NULL,      (UBaseType_t    )START_TASK_PRIO, (TaskHandle_t*  )&StartTask_Handler);  vTaskStartScheduler();     while(1);}void start_task(void *pvParameters){    taskENTER_CRITICAL();     xTaskCreate((TaskFunction_t )task1_task, (const char*    )"task1_task",      (uint16_t)TASK1_STK_SIZE,   (void*   )NULL,      (UBaseType_t    )TASK1_TASK_PRIO,   (TaskHandle_t*  )&Task1Task_Handler);  vTaskDelete(StartTask_Handler);taskEXIT_CRITICAL();     }void task1_task(void *pvParameters){    while(1)    { /* turn on led */ gpio_bit_write(GPIOA, GPIO_PIN_8, SET); vTaskDelay(200);  /* turn off led */ gpio_bit_write(GPIOA, GPIO_PIN_8, RESET); vTaskDelay(200);    }}

c)至此代码修改完成,可以编译下载运行了,完整工程已上传gitee(链接),效果图就不上传了,就是一颗灯按200ms周期闪烁,没啥好看的。比较尴尬的是编译出来RAM空间已用7.66K,总共就8K,后面还咋玩儿…所以下一步打算看看FreeRTOS能否减小RAM占用,或者换个占用资源少的系统,或者干脆时间片轮询搞起来,不用系统一样跑得飞起。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-txaRJ1BC-1649640356629)(/img/bVbtZV)]

3、问题总结

3.1 安装pack包后仍然提示找不到pack包,提示错误

解决方法:将工程后缀名.uvproj修改为.uvprojx,看网上说keil4建立的工程用keil5打开就可能出现此问题

3.2 编译报错:#error This port can only be used when the project options are configured to enable hardware floating point support.

解决方法:将Floating Point Hardware选择为Single Precision。等等,你的这个地方是不是没有这个选项,是一块空白,那就遇到跟我一样的情况了,这时候你只需要选中Device标签,选中任意另一款芯片,点击确定,然后再选回K8就有了(就这个搞了我半个多小时,到处查资料,没想到最后被我一顿乱点解决);注意,这个地方还有个问题,完成以上步骤后虽然编译通过,但是烧录不了代码了,后来发现Debug标签中仿真器不是CMSIS-DAP Debugger了,这个可能是刚刚的改动带来的,记得改成CMSIS-DAP Debugger。

3.3 编译报错:\output\Project.axf: Error: L6200E: Symbol PendSV_Handler multiply defined (by port.o and gd32f3x0_it.o).

解决方法:这里就将gd32f3x0_it.c文件中的PendSV_Handler屏蔽掉就好了,还有另一个SVC_Handler也屏蔽掉。

4、参考文章

https://aijishu.com/a/1060000000314175

5、完整工程

https://gitee.com/cdxiaohu/gd32-f310_-free-rtos.git