查看: 997|回复: 2

[原创] 【LPC845-BRK板卡试用申请】(三)FreeRTOS 移植适配

[复制链接]
  • TA的每日心情
    奋斗
    昨天 13:25
  • 签到天数: 594 天

    [LV.9]以坛为家II

    51

    主题

    2221

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    7054
    最后登录
    2024-4-26
    发表于 2023-4-5 14:57:17 | 显示全部楼层 |阅读模式
    本帖最后由 andeyqi 于 2023-4-8 20:34 编辑

    从NXP 官网下载的SDK 包是没找到RTOS 的示例程序,之前已经习惯于了使用RTOS 开发的方式,所以决定移植个FreeRTOS系统至LPC845-BRK 开发板,FreeRTOS的移植适配网上的教程也比较多,理论上只要把FreeRTOS 的系统文件,内存管理,架构相关适配文件,及FreeRTOS 的配置文件适配好基本就完成了移植适配,从官网下载最新的FreeRTOS源码(FreeRTOSv202212.01)开始我们的主题。

    1.FreeRTOS 代码提取


    1.1 操作系统相关的文件
    1. FreeRTOS\Source\
    2. |-- croutine.c
    3. |-- event_groups.c
    4. |-- list.c
    5. |-- queue.c
    6. |-- readme.txt
    7. |-- stream_buffer.c
    8. |-- tasks.c
    9. `-- timers.c
    10. |-- include
    11. |   |-- FreeRTOS.h
    12. |   |-- StackMacros.h
    13. |   |-- atomic.h
    14. |   |-- croutine.h
    15. |   |-- deprecated_definitions.h
    16. |   |-- event_groups.h
    17. |   |-- list.h
    18. |   |-- message_buffer.h
    19. |   |-- mpu_prototypes.h
    20. |   |-- mpu_wrappers.h
    21. |   |-- portable.h
    22. |   |-- projdefs.h
    23. |   |-- queue.h
    24. |   |-- semphr.h
    25. |   |-- stack_macros.h
    26. |   |-- stdint.readme
    27. |   |-- stream_buffer.h
    28. |   |-- task.h
    29. |   `-- timers.h
    复制代码

    1.2 内存管理相关文件
    1. D:\FREERTOSV202212.01\FREERTOS\SOURCE\PORTABLE\MEMMANG
    2.     heap_1.c
    3.     heap_2.c
    4.     heap_3.c
    5.     heap_4.c
    6.     heap_5.c
    7.     ReadMe.url
    复制代码
    FreeRTOS 支持了5种内存管理的方式,我们使用的是方式4,将heap_4.c 文件加入编译即可。

    1.3 M0 架构依赖的架构相关文件

    本次使用的开发环境MCUXpresso IDE  内部使用的工具链是gcc,我们选取M0 下的GCC相关的适配文件。
    1. D:\FREERTOSV202212.01\FREERTOS\SOURCE\PORTABLE\GCC\ARM_CM0
    2.     port.c
    3.     portmacro.h
    复制代码



    1.4 FreeRTOS 配置文件
    配置文件选取DEMO目录下和LPC845 同架构的CORTEX_M0_LPC1114_LPCXPRESSO 的 FreeRTOSConfig.h 文件使用。

    1. D:\FREERTOSV202212.01\FREERTOS\DEMO\CORTEX_M0_LPC1114_LPCXPRESSO\RTOSDEMO\SOURCE
    2.     cr_startup_lpc11.c
    3.     FreeRTOSConfig.h
    4.     IntQueueTimer.c
    5.     IntQueueTimer.h
    6.     main-blinky.c
    7.     main-full.c
    8.     main.c
    9.     RegTest.c
    复制代码


    将上述文件整理下只保留我们需要的加入工程编译,目录结构如下,编译过程中根据编译器的编译提示将源码路径下的.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


    1. D:\WORK\LPC845_WORKSPACE\LPC845BRK\LPC845BREAKOUT_HELLO_WORLD\FREERTOSV202212.01
    2. │   FreeRTOSConfig.h

    3. └───Source
    4.     │   croutine.c
    5.     │   event_groups.c
    6.     │   list.c
    7.     │   queue.c
    8.     │   stream_buffer.c
    9.     │   tasks.c
    10.     │   timers.c
    11.     │
    12.     ├───include
    13.     │       atomic.h
    14.     │       croutine.h
    15.     │       deprecated_definitions.h
    16.     │       event_groups.h
    17.     │       FreeRTOS.h
    18.     │       list.h
    19.     │       message_buffer.h
    20.     │       mpu_prototypes.h
    21.     │       mpu_wrappers.h
    22.     │       portable.h
    23.     │       projdefs.h
    24.     │       queue.h
    25.     │       semphr.h
    26.     │       StackMacros.h
    27.     │       stack_macros.h
    28.     │       stdint.readme
    29.     │       stream_buffer.h
    30.     │       task.h
    31.     │       timers.h
    32.     │
    33.     └───portable
    34.         ├───GCC
    35.         │   └───ARM_CM0
    36.         │           port.c
    37.         │           portmacro.h
    38.         │
    39.         └───MemMang
    40.                 heap_1.c
    41.                 heap_2.c
    42.                 heap_3.c
    43.                 heap_4.c
    44.                 heap_5.c
    45.                 ReadMe.url
    复制代码

    2.下载验证

    为了验证系统功能是否正常,我们创建两个任务周期打印log,来验证系统调度是否正常,添加如下代码段;


    #define START_TASK_PRIO        2
    #define START_STK_SIZE         128
            TaskHandle_t StartTask_Handler;
            void start_task(void *pvParameters);
            
    #define TASK1_TASK_PRIO        2
    #define TASK1_STK_SIZE         128
            TaskHandle_t Task1Task_Handler;
            void start_task1(void *pvParameters);
            
    #define SHELL_TASK_PRIO        2
    #define SHELL_STK_SIZE         256
            TaskHandle_t ShellTask_Handler;


    void start_task(void *pvParameters)
    {
            while(1)
            {
                    PRINTF("task1 .\r\n");
                    vTaskDelay(500);
            }
    }
            
            
    void start_task1(void *pvParameters)
    {
            while(1)
            {
                    PRINTF("task2 .\r\n");
                    vTaskDelay(1000);
            }
    }

    main()
    {
       xTaskCreate((TaskFunction_t )start_task,
                    (const char*    )"task1",
                    (uint16_t       )START_STK_SIZE,
                    (void*          )NULL,
                    (UBaseType_t    )START_TASK_PRIO,
                    (TaskHandle_t*  )&StartTask_Handler);

        xTaskCreate((TaskFunction_t )start_task1,
                    (const char*    )"task2",
                    (uint16_t       )TASK1_STK_SIZE,
                    (void*          )NULL,
                    (UBaseType_t    )TASK1_TASK_PRIO,
                    (TaskHandle_t*  )&Task1Task_Handler);

        xTaskCreate((TaskFunction_t )littleshell_main_entry,
                    (const char*    )"shell",
                    (uint16_t       )SHELL_STK_SIZE,
                    (void*          )NULL,
                    (UBaseType_t    )SHELL_TASK_PRIO,
                    (TaskHandle_t*  )&Task1Task_Handler);
        vTaskStartScheduler();

    }

    同时把之前的shell(【LPC845-BRK板卡试用申请】(二)shell 移植适配)也作为个任务启动。

    运行后log 如下:
    1. [2023-04-05 13:10:07.239] #
    2. [2023-04-05 13:10:07.385] #
    3. [2023-04-05 13:10:07.552] #task1 .
    4. [2023-04-05 13:10:08.099] task1 .
    5. [2023-04-05 13:10:08.102] task2 .
    6. [2023-04-05 13:10:08.596] task1 .
    7. [2023-04-05 13:10:09.092] task1 .
    8. [2023-04-05 13:10:09.099] task2 .
    复制代码
    从log 看 两个task1 log 之间的间隔为500ms ,task2 log 之间时间间隔为1000ms, 和预期的设计是保持一致的,shell 也可以正常响应,说明系统的任务调度已经正常调度了。
    MCUXpress IDE 的RTOS 插件是支持FreeRTOS,debug 时能看到当前的任务信息及堆栈使用率信息,可以用于帮助我们评估任务栈分配的是否合理。
    freertos_plug.png

    =================代码如下=================



    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-10 22:38
  • 签到天数: 1335 天

    [LV.10]以坛为家III

    88

    主题

    4292

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    9049
    最后登录
    2024-4-13
    发表于 2023-4-6 10:02:56 | 显示全部楼层
    截止到当前,楼主的基础实验环境算是搭建完毕了吧!
    厉害~~
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 13:25
  • 签到天数: 594 天

    [LV.9]以坛为家II

    51

    主题

    2221

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    7054
    最后登录
    2024-4-26
     楼主| 发表于 2023-4-6 10:28:57 | 显示全部楼层
    jobszheng5 发表于 2023-4-6 10:02
    截止到当前,楼主的基础实验环境算是搭建完毕了吧!
    厉害~~

    嗯嗯  算是吧
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-26 13:06 , Processed in 0.129692 second(s), 22 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表