GD32F450移植FreeRTOS

GD32F450移植FreeRTOS

  • 一、下载源码
  • 二、提取文件
  • 三、向工程中添加FreeRTOS
  • 四、导入文件路径
  • 五、完善移植
  • 六、创建任务

一、下载源码

选择 FreeRTOS 的最新版本:下载FreeRTOS

二、提取文件

  1. 创建文件夹如图所示:
    GD32F450移植FreeRTOS_第1张图片
  2. 将以下的源码文件拷贝到其中

1)在“FreeRTOSv10.0.1\FreeRTOS\Source”目录下找到所有的‘.c 文件’,拷贝到新建的 src 文件夹下

2)在“FreeRTOSv10.0.1\FreeRTOS\Source\portable”目录下找到“MemMang”文件夹与“RVDS”文件夹,将它们拷贝到新建的port 文件夹下

3)在“FreeRTOSv10.0.1\ FreeRTOS\Source”目录下找到“include”文件夹,将它直接拷贝到新建的 FreeRTOS 文件夹中

三、向工程中添加FreeRTOS

  1. 创立如图文件夹:FreeRTOS/src、FreeRTOS/port
    GD32F450移植FreeRTOS_第2张图片
  2. 向工程FreeRTOS/src中添加文件GD32F450移植FreeRTOS_第3张图片
  3. 向工程FreeRTOS/port中添加文件

添加heap_4.c文件,具体路径:【FreeRTOS】->【portable】->【MemMang】-> heap_4.c

添加port.c文件,具体路径:【FreeRTOS】->【portable】->【RVDS】->【ARM_CM4F】-> port.c
GD32F450移植FreeRTOS_第4张图片

  1. 找到FreeRTOSv10.0.1\FreeRTOS\Demo\CORTEX_M4F_STM32F407ZG-SK文件下的FreeRTOSConfig.h

GD32F450移植FreeRTOS_第5张图片
拷贝 FreeRTOSConfig.h 文件到 我们新建的文件夹FreeRTOSv10.0.1\include下,如图
GD32F450移植FreeRTOS_第6张图片

四、导入文件路径

GD32F450移植FreeRTOS_第7张图片

五、完善移植

  1. 编译报错(1): 找不到FreeRTOS.h
    在源码FreeRTOSv202104.00\FreeRTOSv202104.00\FreeRTOS\Demo文件夹中找到对应芯片工程的FreeRTOSConfig.h,比如STM32F407就需要找到并添加到工程的FREERTOS/include目录下。

  2. 编译报错(2):SystemCoreClock未定义将FreeRTOSConfig.h中的条件编译

#ifdef __ICCARM__

改为

#if defined(__ICCARM__)||defined(__CC_ARM)||defined(__GNU__)
  1. 编译报错(3): 提示port.o与stm32f4xx_it.o有重复定义
    注释掉stm32f4xx_it.c中的SVC_Handler(),PendSV_Handler(),SysTick_Handler()即可。
  2. 编译报错(4):提示4个hook函数未定义
    修改FreeRTOSConfig.h中的HOOK宏的值为0。
#define configUSE_IDLE_HOOK             0
#define configUSE_TICK_HOOK             0
#define configCHECK_FOR_STACK_OVERFLOW  0
#define configUSE_MALLOC_FAILED_HOOK    0

六、创建任务

/*全局变量*/
static TaskHandle_t AppTaskCreate_Handle = NULL;
static TaskHandle_t LED1_Task_Handle = NULL;
static TaskHandle_t LED2_Task_Handle = NULL;

/**
 * @brief 黄灯闪烁
 *
 */
void led1_task(void *pra)
{
    while (1) {
        bsp_yellow_led_on();
        vTaskDelay(500);
        bsp_alarm_led_off();
        vTaskDelay(500);
    }
}

/**
 * @brief 绿灯闪烁
 *
 * @param  pra              --
 */
void led2_task(void *pra)
{
    while (1) {
        change_battery_led_alarm();
        vTaskDelay(1000);
        change_battery_led_charged();
        vTaskDelay(1000);
    }
}


/**
 * @brief 任务创建
 *
 */
static void AppTaskCreate(void)
{
    BaseType_t xReturn = pdPASS;
    taskENTER_CRITICAL(); // 进入临界区
    /* 报警灯任务 */
    xReturn = xTaskCreate((TaskFunction_t)flink,
                          (const char *)"flink_Task",
                          (uint16_t)512,
                          (void *)NULL,
                          (UBaseType_t)2,
                          (TaskHandle_t *)&LED1_Task_Handle);

    /* LED2 任务 */
    xReturn = xTaskCreate((TaskFunction_t)LED2_Task,
                          (const char *)"LED2_Task",
                          (uint16_t)512,
                          (void *)NULL,
                          (UBaseType_t)3,
                          (TaskHandle_t *)&LED2_Task_Handle);

    vTaskDelete(AppTaskCreate_Handle); // 任务调度
    taskEXIT_CRITICAL();               // 退出临界区
}

/* 主函数 */
int main()
{
    HardWare_Init();
    BaseType_t xReturn = pdPASS;
    /* 创建任务AppTaskCreate*/
    xReturn = xTaskCreate((TaskFunction_t)AppTaskCreate,
                          (const char *)"AppTaskCreate",
                          (uint16_t)512,
                          (void *)NULL,
                          (UBaseType_t)1,
                          (TaskHandle_t *)&AppTaskCreate_Handle);

    if (pdPASS == xReturn)
        vTaskStartScheduler();
    else
        return -1;

    while (1);
}

你可能感兴趣的:(单片机)