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