GD32E507移植FreeRTOS
一、准备工作
硬件平台:一块GD32E507Z-EVAL评估板(MCU是GD32E507ZET6)
软件开发环境:KEIL
源码:GD32官方源码(标准库),FreeRTOS源码(FreeRTOSv202107.00)
二、创建工程
由于GD32提供的源码有多份例程,这些例程会共用相同的源码,比如CMSIS里的文件,Utilities里的文件和GD32E50x_standard_peripheral里的文件等。所以最好需要单独创建一个工程,把这些文件复制一份出来,用于这个工程。这里我复制的工程师跑马灯的工程。

其中FreeRTOS是后期移植的,现在暂时可以不管这个文件夹。我们来看看其他文件夹里都有什么东西:
① Application文件夹



② CMSIS文件夹
这个文件夹也是在GD32官方源码中复制过来的:

③ GD32E50x_standard_peripheral文件夹
GD32E50x的标准库函数:


④ Utilities文件夹

复制完成后,添加必须的文件到工程中:

包含头文件路径:

编译看有没有什么错误,并下载到板子上,如果LED可以根据需求运行起来,说明工程创建没问题,接下来就是移植FreeRTOS了。
三、移植FreeRTOS
创建一个FreeRTOS的文件夹,进入文件夹中再创建一个“source”文件夹和一个“portable”文件夹,“source”文件夹中再创建一个“src”文件夹和一个“inc”文件夹。
① 把FreeRTOS源码中的“Source”文件夹中的C文件复制到我们工程中的FreeRTOS->source->src



② 把FreeRTOS源码中的Source目录下的“include”文件夹中的内容全部复制到FreeRTOS->source->inc中:

③ 把FreeRTOS源码中的“Source”目录中的“portable”文件夹整个复制到工程目录中的FreeRTOS目录下:

把一些不重要的文件夹删除,只保留“Keil”、“MemMang”、“RVDS”三个文件夹即可:

然后把一些源文件添加到工程中:

再添加头文件路径:

PS:RVDS文件夹中本来是没有ARM_CM33_NTZ这个文件夹的,这是我从FreeRTOS源码中复制过来的,路径如下图所示:

里面包含的内容如下:

暂时没了解这些文件的作用是什么,打算慢慢在实践的过程中去了解,毕竟总是学习理论知识也是很枯燥的。
接着,我们编译一下,不出意外的话,一定会报错,而且跟“FreeRTOSConfig.h”这个头文件有关系,因为我们移植的时候并没有把它移植过来,所以现在需要去找到这个文件,把它移植过来。因为我们的MCU是Cortex-M33内核的,所以必须找这一款内核的例程来移植。我在官方的例程找到一个:

这个例程的Config文件中就有这么一个头文件:

复制到我们的工程中的某一个inc文件夹中,记得必须包含这个头文件路径,再编译一下,可能会出现很多报错,比如重定义,下面这三个函数在portasm.c中已经有定义,所以把此处的函数屏蔽掉即可。

另外可能还有一些钩子函数的报错,这是FreeRTOSConfig.h中相关的宏定义被设置为非0数值,使能了却没有相应的函数来执行操作,所以把这些宏定义设置为0即可。

可能还有其他的报错,一般都是修改FreeRTOSConfig.h中的宏定义就可以解决了。具体问题需要具体分析。
接下来,开始编写代码:
#include "gd32e50x.h"
#include "systick.h"
#include "FreeRTOSConfig.h"
#include "FreeRTOS.h"
#include "task.h"
#define LED1_ON gpio_bit_set(GPIOG, GPIO_PIN_10)
#define LED1_OFF gpio_bit_reset(GPIOG, GPIO_PIN_10)
#define LED2_ON gpio_bit_set(GPIOG, GPIO_PIN_11)
#define LED2_OFF gpio_bit_reset(GPIOG, GPIO_PIN_11)
#define LED3_ON gpio_bit_set(GPIOG, GPIO_PIN_12)
#define LED3_OFF gpio_bit_reset(GPIOG, GPIO_PIN_12)
#define LED4_ON gpio_bit_set(GPIOG, GPIO_PIN_13)
#define LED4_OFF gpio_bit_reset(GPIOG, GPIO_PIN_13)
#define START_TASK_PRIO 1
#define START_STK_SIZE 120
TaskHandle_t Start_Task_Handler;
#define LED_TASK_PRIO 2
#define LED_STK_SIZE 120
TaskHandle_t LED_Task_Handler;
void start_task(void * parameter);
void led_task(void * parameter);
/*!
\brief main function
\param[in] none
\param[out] none
\retval none
*/
int main(void)
{
systick_config();
/* enable the LEDs clock */
rcu_periph_clock_enable(RCU_GPIOG);
/* configure LEDs GPIO port */
gpio_init(GPIOG, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13);
/* reset LEDs GPIO pin */
gpio_bit_reset(GPIOG, GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13);
xTaskCreate(start_task,"start_task",START_STK_SIZE,NULL,START_TASK_PRIO,&Start_Task_Handler);
vTaskStartScheduler();
while(1){
}
}
void start_task(void * parameter)
{
xTaskCreate(led_task,"led_task",LED_STK_SIZE,NULL,LED_TASK_PRIO,&Start_Task_Handler);
vTaskDelete(NULL);
}
void led_task(void * parameter)
{
while(1)
{
LED1_ON;
vTaskDelay(1000);
LED2_ON;
vTaskDelay(200);
LED3_ON;
vTaskDelay(200);
LED4_ON;
vTaskDelay(200);
LED4_OFF;
vTaskDelay(200);
LED3_OFF;
vTaskDelay(200);
LED2_OFF;
vTaskDelay(200);
LED1_OFF;
vTaskDelay(1000);
}
}
编译后下载到板子上,发现灯变化的速度很慢,经过调试,发现是FreeRTOSConfig.h中有一个宏定义的值小了,

原来定义的是100,LED闪烁的频率很慢,修改为1000后频率正常。

浙公网安备 33010602011771号