zljiu 发表于 2024-2-4 16:17

GD32F450移植FreeRTOS

一、下载源码
选择 FreeRTOS 的最新版本:下载FreeRTOS

二、提取文件
创建文件夹如图所示:

将以下的源码文件拷贝到其中
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
创立如图文件夹:FreeRTOS/src、FreeRTOS/port



向工程FreeRTOS/src中添加文件
向工程FreeRTOS/port中添加文件
添加heap_4.c文件,具体路径:【FreeRTOS】->【portable】->【MemMang】-> heap_4.c

添加port.c文件,具体路径:【FreeRTOS】->【portable】->【RVDS】->【ARM_CM4F】-> port.c


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

拷贝 FreeRTOSConfig.h 文件到 我们新建的文件夹FreeRTOSv10.0.1\include下,如图


四、导入文件路径


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

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

#ifdef __ICCARM__


改为

#if defined(__ICCARM__)||defined(__CC_ARM)||defined(__GNU__)


编译报错(3): 提示port.o与stm32f4xx_it.o有重复定义
注释掉stm32f4xx_it.c中的SVC_Handler(),PendSV_Handler(),SysTick_Handler()即可。
编译报错(4):提示4个hook函数未定义
修改FreeRTOSConfig.h中的HOOK宏的值为0。
#define configUSE_IDLE_HOOK             0
#define configUSE_TICK_HOOK             0
#define configCHECK_FOR_STACK_OVERFLOW0
#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 绿灯闪烁
*
* @parampra            --
*/
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);
}

————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/m0_66338176/article/details/134314216

tpgf 发表于 2024-3-4 11:21

不同的工程 都可以引用这个位置的文件吧

观海 发表于 2024-3-4 20:14

所有版本的freertos都可以这样移植吗

八层楼 发表于 2024-3-4 20:46

任何型号芯片的移植都可以这样操作吧

晓伍 发表于 2024-3-4 21:18

如果是从其他厂商的代码移植过来就要复杂一点 把

磨砂 发表于 2024-3-4 21:50

代码的变动并不大 关键在设置上

木木guainv 发表于 2024-3-4 22:22

freertos的版本和软件版本需要进行匹配吗

eefas 发表于 2024-3-6 07:09

在FreeRTOS中,应避免使用阻塞式的延迟函数,如delay_ms()或vTaskDelay(),因为这些函数会阻止任务切换,可能导致系统崩溃。取而代之,可以使用FreeRTOS提供的非阻塞延时函数,如vTaskDelayUntil()。

juliestephen 发表于 2024-3-6 08:13

根据 GD32F450 的硬件特性,实现或修改 FreeRTOS 的端口层代码,包括任务切换、上下文保存与恢复等。

yangxiaor520 发表于 2024-3-6 08:15

现在已经切换到RTTread了。

mattlincoln 发表于 2024-3-7 13:09

在移植FreeRTOS到GD32F450时,需要关注可用的硬件资源,如RAM、Flash等。确保系统有足够的硬件资源来运行FreeRTOS和应用程序。

bestwell 发表于 2024-3-7 20:51

FreeRTOS 官方通常支持 ARM Cortex-M 系列的微控制器,因此可能需要一些定制工作来适应 GD32F450 的具体硬件特性。

maudlu 发表于 2024-3-7 22:49

在GD32F450中,外设驱动通常使用寄存器级操作或HAL库。在移植FreeRTOS时,需要编写或修改相应的外设驱动程序,以支持FreeRTOS任务间的通信和数据交换。

lzmm 发表于 2024-3-8 21:13

参考FreeRTOS的官方文档和GD32F450的数据手册

kkzz 发表于 2024-3-9 21:17

根据应用需求,合理配置队列、信号量、互斥锁等各种RTOS对象

gygp 发表于 2024-3-10 22:15

根据GD32F450的GPIO、USART、SPI、I2C等外设的特点,修改或编写对应的驱动程序以适应FreeRTOS环境下的并发访问和互斥控制。

jtracy3 发表于 2024-3-11 13:54

GD32F450通常使用C语言进行编程,需要配置合适的编译环境,如Keil、IAR或GCC等。在编译环境中,需要正确设置GD32F450的芯片型号和相关参数。

uptown 发表于 2024-3-11 15:55

GD32F450的硬件配置满足FreeRTOS的要求,例如内存分配、中断控制器、时钟系统等。

robertesth 发表于 2024-3-11 17:46

配置GD32F450的系统时钟,以便为FreeRTOS提供精确的时间基准。通常,可以使用内部或外部时钟源,并通过PLL或其他频率分频器实现所需的系统时钟频率。

everyrobin 发表于 2024-3-11 19:46

确保堆的大小足够,以支持任务创建、消息队列、信号量等动态内存分配。
页: [1] 2 3
查看完整版本: GD32F450移植FreeRTOS