小虎 · 2022年04月02日

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

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文件夹很大,也没什么用,可以直接删掉;
 title=

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

2.2 工程配置修改

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

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

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

2.3 代码修改

a)void SVC\_Handler(void)和void PendSV\_Handler(void)屏蔽掉,并修改SysTick_Handler()函数,如下图:
 title=
image.png

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占用,或者换个占用资源少的系统,或者干脆时间片轮询搞起来,不用系统一样跑得飞起。
image.png

3、问题总结

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

 title=
解决方法:将工程后缀名.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。
 title=

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

推荐阅读
关注数
10711
内容数
187
中国高性能通用微控制器领域的领跑者兆易创新GD系列芯片技术专栏。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息