【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()函数,如下图:
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占用,或者换个占用资源少的系统,或者干脆时间片轮询搞起来,不用系统一样跑得飞起。
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