GD32F303RCT6 FreeRTOS的移植
1、在Application的Makefile中增加freertos的编译选项,如下:
ENABLE_FREERTOS = yes
ifeq ($(ENABLE_FREERTOS), yes)
APPLICATION_FLAGS += \
-DENABLE_FREERTOS
endif
2、Application目录下增加FreeRtos目录,将下载的FreeRTOS源码中的如下文件拷贝到FreeRtos目录。
3、 删除portable下无用的文件跟目录。因为我们的编译环境为gcc,所以只保留gcc目录以及MemMang目录即可。
如下:
4、删减gcc跟Memmang目录:MemMang只保留heap4.c,而GCC目录只保留ARM_CM4F目录即可。如下:
5、Application增加FreeRtos文件的编译。
ifeq ($(ENABLE_FREERTOS), yes)
C_DIRS += FreeRTOS/include
C_DIRS += FreeRTOS/portable/GCC/ARM_CM4F
C_DIRS += FreeRTOS/portable/MemMang
endif
ifeq ($(ENABLE_FREERTOS), yes)
C_INCS += FreeRTOS/include
C_INCS += FreeRTOS/portable/GCC/ARM_CM4F
C_INCS += FreeRTOS/portable/MemMang
endif
6、在工程根目录下编译后报错如下:
提示缺少FreeRTOSConfig.h,这是FreeRTOS的一个配置文件,我们从copy一个出来放在FreeRtos/include目录下。
7、继续编译。报错如下:
SystemCoreClock这个变量是system_gd32f30x.c中定义的,所以在FreeRTOS中使用的话,要extern进来。修改
FreeRTOSConfig.h如下
8、继续编译,报错如下:
Makefile增加FPU FLOAT-ABI 的编译选项,如下:
9、继续编译,报错如下:
提示SVC_Handler PendSV_Handler重重复定义,那么我们屏蔽掉gd32f30x_it.c中的两个函数的定义。
修改如下:
10、继续编译报错如下:
屏蔽掉config文件关于钩子函数的选项,修改如下:
另外,这里改小一点。
11、继续编译无报错。
12、systick函数的处理。gd 提供的systick初始化就采用了中断的方式,也是1ms中断一次,正好可以给FreeRTOS提供节拍。
所以我们修改gd32f30x_it.c如下:
13、继续编译无报错。
14、写个例子试一下吧。
main.c
#define LED1_TASK_PRIO ( tskIDLE_PRIORITY + 2 )
#define LED2_TASK_PRIO ( tskIDLE_PRIORITY + 3 )
void LED1_task(void * pvParameters);
void LED2_task(void * pvParameters);
void LED1_task(void * pvParameters)
{
for( ;; ){
gpio_bit_set(GPIOB, GPIO_PIN_4);
vTaskDelay(1000);
}
}
void LED2_task(void * pvParameters)
{
for( ;; ){
gpio_bit_reset(GPIOB, GPIO_PIN_4);
vTaskDelay(500);
}
}
xTaskCreate(LED1_task, "LED1", configMINIMAL_STACK_SIZE, NULL, LED1_TASK_PRIO, NULL);
xTaskCreate(LED2_task, "LED2", configMINIMAL_STACK_SIZE, NULL, LED2_TASK_PRIO, NULL);
/* start scheduler */
vTaskStartScheduler();
15、编译后灯开始闪烁,说明freertos已经正常运行,至此,移植完成。
16、代码路径:https://gitee.com/xiaoguo-tec_0/gd32-iap-code.git