xiyaoko2365 发表于 2022-12-31 22:32

GD32F303移植FreeRTOS

GD32F303移植FreeRTOS
一、移植环境
系统:WIN7
MDK:keil v5.26
开发板:GD32F303C-EVAL
固件库:V1.0.2
FreeRTOS版本:V10.4.0
二、复制FreeRTOS到工程文件中
1> FreeRTOS简要介绍
FreeRTSO下载链接:https://www.freertos.org/a00104.html


xiyaoko2365 发表于 2022-12-31 22:33

将下载的文件解压,内容如下:FreeRTOS就是我们需要移植用到的,里面包含了官方移植的demo和内核文件,FreeRTOS-Plus里面包含了一些第三方的组件。

xiyaoko2365 发表于 2022-12-31 22:34

FreeRTOS文件夹内容如下:Demo文件夹下是官方在开发板移植好的demo,可以参考,Source文件夹下就是我们需要移植的内核文件。

xiyaoko2365 发表于 2022-12-31 22:34

Source文件夹内容如下:

xiyaoko2365 发表于 2022-12-31 22:35

在准备好的工程下创建一个FreeRTOS文件夹下,将1>提到的Source文件中所有的内容复制到这个文件夹下:

xiyaoko2365 发表于 2022-12-31 22:36

删除上图中红框中的内容,如下:

xiyaoko2365 发表于 2022-12-31 22:36

在当前目录下新建一个文件夹src,将红框中的内容剪切到src文件夹下,如下图:

xiyaoko2365 发表于 2022-12-31 22:39

进入到portable文件夹下,只保留下图三个文件夹,其余全部删除,如下图:

xiyaoko2365 发表于 2022-12-31 22:40

其中keil文件夹下没有可以用的内容,MemMang下是官方给的5种内存管理的方法,没有好坏之分,都有优缺点,根据需要选一种方式即可。

xiyaoko2365 发表于 2022-12-31 22:41

添加FreeRTOS文件到工程
1> 添加src下的文件到工程

xiyaoko2365 发表于 2022-12-31 22:42

添加portable/MemMang/heap_4文件到工程

xiyaoko2365 发表于 2022-12-31 22:42

添加portable/RVDS/ARM_CM4F/port文件到工程,因为GD32F303内核是Cortex-M4F内核。

xiyaoko2365 发表于 2022-12-31 22:43

xiyaoko2365 发表于 2022-12-31 22:44

添加相应的头文件路径

xiyaoko2365 发表于 2022-12-31 22:45

编译一下,提示如下错误

xiyaoko2365 发表于 2022-12-31 22:46

缺少FreeRTOSConfig.h这个头文件,我们在FreeRTOS源码中复制一个将这个路径下的(FreeRTOS\FreeRTOS\Demo\CORTEX_STM32F103_Keil)FreeRTOSConfig.h文件复制到工程中,并且添加到工程中,如下图:

xiyaoko2365 发表于 2022-12-31 22:47

再次编译,提示如下错误:

xiyaoko2365 发表于 2022-12-31 22:48

其实就是缺少一个宏定义,这里可以在FreeRTOSConfig.h中定义一个

xiyaoko2365 发表于 2022-12-31 22:49

再次编译发现没有错误了。

xiyaoko2365 发表于 2022-12-31 22:49

写一个简单的LED任务测试一下,如下图:#include "gd32f30x.h"
#include "led.h"
#include "systick.h"
#include <stdio.h>

#include "FreeRTOS.h"
#include "task.h"

#define LED1_TASK_PRIO    ( tskIDLE_PRIORITY + 2 )

void LED1_task(void * pvParameters);

int main(void)
{
        /* 设置优先级分组为4,16个优先级全是抢占优先级 */
    nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0);
       
        GW_LedInit(LED1);
        GW_LedInit(LED2);
        xTaskCreate(LED1_task, "LED1", configMINIMAL_STACK_SIZE, NULL, LED1_TASK_PRIO, NULL);
        /* start scheduler */
    vTaskStartScheduler();
    while(1){
    }
}
void LED1_task(void * pvParameters)
{
    for( ;; ){
      /* toggle LED2 each 500ms */
      GW_LedToggle(LED1);
      vTaskDelay(300);
    }
}
页: [1] 2 3 4 5
查看完整版本: GD32F303移植FreeRTOS