打印
[研电赛技术支持]

GD32F450移植FreeRTOS

[复制链接]
1818|35
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zljiu|  楼主 | 2024-2-4 16:17 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
一、下载源码
选择 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_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);
}

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

                            版权声明:本文为博主原创文章,遵循 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 | 只看该作者
任何型号芯片的移植都可以这样操作吧

使用特权

评论回复
5
晓伍| | 2024-3-4 21:18 | 只看该作者
如果是从其他厂商的代码移植过来就要复杂一点 把

使用特权

评论回复
6
磨砂| | 2024-3-4 21:50 | 只看该作者
代码的变动并不大 关键在设置上

使用特权

评论回复
7
木木guainv| | 2024-3-4 22:22 | 只看该作者
freertos的版本和软件版本需要进行匹配吗

使用特权

评论回复
8
eefas| | 2024-3-6 07:09 | 只看该作者
在FreeRTOS中,应避免使用阻塞式的延迟函数,如delay_ms()或vTaskDelay(),因为这些函数会阻止任务切换,可能导致系统崩溃。取而代之,可以使用FreeRTOS提供的非阻塞延时函数,如vTaskDelayUntil()。

使用特权

评论回复
9
juliestephen| | 2024-3-6 08:13 | 只看该作者
根据 GD32F450 的硬件特性,实现或修改 FreeRTOS 的端口层代码,包括任务切换、上下文保存与恢复等。

使用特权

评论回复
10
yangxiaor520| | 2024-3-6 08:15 | 只看该作者
现在已经切换到RTTread了。

使用特权

评论回复
11
mattlincoln| | 2024-3-7 13:09 | 只看该作者
在移植FreeRTOS到GD32F450时,需要关注可用的硬件资源,如RAM、Flash等。确保系统有足够的硬件资源来运行FreeRTOS和应用程序。

使用特权

评论回复
12
bestwell| | 2024-3-7 20:51 | 只看该作者
FreeRTOS 官方通常支持 ARM Cortex-M 系列的微控制器,因此可能需要一些定制工作来适应 GD32F450 的具体硬件特性。

使用特权

评论回复
13
maudlu| | 2024-3-7 22:49 | 只看该作者
在GD32F450中,外设驱动通常使用寄存器级操作或HAL库。在移植FreeRTOS时,需要编写或修改相应的外设驱动程序,以支持FreeRTOS任务间的通信和数据交换。

使用特权

评论回复
14
lzmm| | 2024-3-8 21:13 | 只看该作者
参考FreeRTOS的官方文档和GD32F450的数据手册

使用特权

评论回复
15
kkzz| | 2024-3-9 21:17 | 只看该作者
根据应用需求,合理配置队列、信号量、互斥锁等各种RTOS对象

使用特权

评论回复
16
gygp| | 2024-3-10 22:15 | 只看该作者
根据GD32F450的GPIO、USART、SPI、I2C等外设的特点,修改或编写对应的驱动程序以适应FreeRTOS环境下的并发访问和互斥控制。

使用特权

评论回复
17
jtracy3| | 2024-3-11 13:54 | 只看该作者
GD32F450通常使用C语言进行编程,需要配置合适的编译环境,如Keil、IAR或GCC等。在编译环境中,需要正确设置GD32F450的芯片型号和相关参数。

使用特权

评论回复
18
uptown| | 2024-3-11 15:55 | 只看该作者
GD32F450的硬件配置满足FreeRTOS的要求,例如内存分配、中断控制器、时钟系统等。

使用特权

评论回复
19
robertesth| | 2024-3-11 17:46 | 只看该作者
配置GD32F450的系统时钟,以便为FreeRTOS提供精确的时间基准。通常,可以使用内部或外部时钟源,并通过PLL或其他频率分频器实现所需的系统时钟频率。

使用特权

评论回复
20
everyrobin| | 2024-3-11 19:46 | 只看该作者
确保堆的大小足够,以支持任务创建、消息队列、信号量等动态内存分配。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

50

主题

3319

帖子

3

粉丝