查看: 4175|回复: 2

[原创] LPC54628 Freertos

[复制链接]
  • TA的每日心情
    无聊
    2021-12-29 19:06
  • 签到天数: 47 天

    连续签到: 1 天

    [LV.5]常住居民I

    49

    主题

    188

    帖子

    21

    金牌会员

    Rank: 6Rank: 6

    积分
    1392
    最后登录
    2025-3-4
    发表于 2020-2-26 20:52:22 | 显示全部楼层 |阅读模式
    (一)Freertos
    Freertos是目前使用最广泛的免费开源实时操作系统,但是之所以选择它而非其他比如RTT这种强大的货色或者μC/OS-II这类最广为使用的货色,主要原因还是因为mcuxpresso带着个包!
    Freertos在V10版本之后前面就带了个帽子,Amazo Freertos,我一开始以为是贝佐斯跟NXP有什么PY,为啥要NXP在Freertos加上Amazo的IOT组件,后来偶然发现……世界首富把Freertos买了……果然土豪解决问题的方法就是不一样。

    开发环境准备,库软件包下载地址:
    http://mcuxpresso.nxp.com/en/welcome
    记得勾上带了Amazo 的
    Freertos,,着个Amazo Freertos版本是10.0.1



    (二)移植


    开发环境:MCUXpresso IDE V11.1.0
    软件包:2.7.0
    开发板:官方LPC54628开发板

    移植只需要修改下FreertosConfig.h,直接生成的配置工程也可以直接用,但有个小地方需要修改下,见(四)
    此外还需要在时钟里面配置下systick的时钟使能

    (三)实验


    只需要启动下调度器就行了。
    下面我用freertos的软件时钟做个小demo:
    1. SystemCoreClockUpdate();
    2.     TimerHandle_t SwTimerHandle = NULL;
    3.     SwTimerHandle = xTimerCreate("SwTimer",          /* Text name. */
    4.                     SW_TIMER_PERIOD_MS, /* Timer period. */
    5.                         pdTRUE,             /* Enable auto reload. */
    6.                         0,                  /* ID is not used. */
    7.                         SwTimerCallback);   /* The callback function. */
    8.     xTimerStart(SwTimerHandle, 0);
    9.     vTaskStartScheduler();
    复制代码
    声明下:
    1. #define SW_TIMER_PERIOD_MS (1000 / portTICK_PERIOD_MS)
    2. static void SwTimerCallback(TimerHandle_t xTimer);
    复制代码

    为了看先效果,我让灯闪烁起来,初始化添加:
    1. BOARD_InitLEDsPins();
    2.     LED1_INIT(0);
    复制代码

    软件定时器回调函数:
    1. static void SwTimerCallback(TimerHandle_t xTimer)
    2. {
    3.         LED1_TOGGLE();
    4. }
    复制代码

    (四)排错


    初始化时在port.c的341行卡住了:
    1. #ifdef configPRIO_BITS
    2.                 {
    3.                         /* Check the FreeRTOS configuration that defines the number of
    4.                         priority bits matches the number of priority bits actually queried
    5.                         from the hardware. */
    6.                         configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS );
    7.                 }
    8.                 #endif
    复制代码

    这个宏定义 configASSERT 转化后如下:
    1. if((( ( ( uint8_t ) 7 ) - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS) == 0) {vPortRaiseBASEPRI(); for (;;);}
    复制代码

    即优先级相关配置不符合要求则死在该循环内。

    但是DEBUG后,读到ulMaxPRIGROUPValue的值为4,__NVIC_PRIO_BITS也是3,我甚至还把Freertos_config里面的
    1. #ifdef __NVIC_PRIO_BITS
    2. /* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */
    3. #define configPRIO_BITS __NVIC_PRIO_BITS
    4. #else
    5. #define configPRIO_BITS 4 /* 15 priority levels */
    6. #endif
    复制代码

    修改为:
    1. #ifdef __NVIC_PRIO_BITS
    2. /* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */
    3. #define configPRIO_BITS 3        
    4. #else
    5. #define configPRIO_BITS 4 /* 15 priority levels */
    6. #endif
    复制代码

    可以看到我IDE里面高亮的部分:
    capture_20200226204758906_WPS图片.jpg



    __NVIC_PRIO_BITS 直接定义为3,判断结果理应为true,但无论如何仿真都死在这个函数内。

    我不信邪于是跑了波模版工程,,模板工程就是直接把__NVIC_PRIO_BITS 直接定义为3,DEBUG事后,读到 ulMaxPRIGROUPValue 的值也为4,但竟然离奇地跑过去了!


    这个问题困扰了我很久,最后才发现,IDE高亮把我坑了!,实际上头文件要包含了lpc54628.h才会有定义__NVIC_PRIO_BITS,真正有效的是下面那个,只需要把下面的4改为3,就能跑过去,灯亮起来啦!


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

    使用道具 举报

  • TA的每日心情
    无聊
    2021-12-29 19:06
  • 签到天数: 47 天

    连续签到: 1 天

    [LV.5]常住居民I

    49

    主题

    188

    帖子

    21

    金牌会员

    Rank: 6Rank: 6

    积分
    1392
    最后登录
    2025-3-4
     楼主| 发表于 2020-2-26 20:59:22 | 显示全部楼层
    NXP的图像界面配置和组价实在太好用了,像EMWIN、RTOS这种大块头的玩意都能简单配置出来,而且还保留这个框架原汁原味的函数。ST那边虽然比NXP早了一步,但过分强调不同RTOS之间的移植方便性,把函数封装得奇奇怪怪的,反而一点都不好用。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-8-8 16:43
  • 签到天数: 1504 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    97

    主题

    4692

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    10093
    最后登录
    2025-8-8
    发表于 2020-2-28 09:30:08 | 显示全部楼层
    同意楼主的看法。
    我现在也是先使用官方的方案进行测试与原型开发。
    之后,就使用原生的RTOS在迭代时将其替换掉。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-8-21 17:49 , Processed in 0.087080 second(s), 22 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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