查看: 1795|回复: 0

在ARM Cortex-M平台上实现FreeRTOS性能监视器

[复制链接]
  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3301

    主题

    6548

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32040
    最后登录
    2024-4-28
    发表于 2020-2-19 11:32:55 | 显示全部楼层 |阅读模式
    在ARM Cortex-M平台上实现FreeRTOS性能监视器




    当我们使用类似FreeRTOS的实时操作系统RTOS时,总会要出现一个疑问:每个任务需要运行多长时间?基于Eclipse开发环境的MCUXpresso IDE具有很好的视图,准确显示了此类信息:
    60.png
    FreeRTOS运行时信息

    为了使FreeRTOS显示非常有用的信息,开发人员必须提供一些帮助,以便RTOS可以收集此信息。本文说明如何在ARM Cortex-M上完成此操作。


    前提概要


    前一段时间,我从 Processor Expert的角度讨论了FreeRTOS的性能和运行时分析。本篇文章是关于使用“本地” FreeRTOS和恩智浦MCUXpresso SDK,但是相同的原理将适用于Cortex-M处理器和微控制器的所有其他环境。至于FreeRTOS端口,我使用的是点击中的端口,因为该端口已经存在所有需要的钩子。GitHub上提供了本文中使用的所有文件和源代码。




    运行原理


    操作系统使用计数器来计算任务执行时间。因此,在任务上下文切换时间,此计数器用于确定该任务使用的时间。重要的一点是,这段时间不是绝对的(例如37毫秒),而是一些“滴答”(例如241个滴答)。 RTOS知道总体上使用了多少“滴答”。 RTOS知道系统中有多少个任务,因此它可以显示每个任务花费了总时间的百分比。另一个要注意的是,时间包括在中断中花费的时间。

    这是估计任务执行时间的非常简单但仍然有效的方法,通常就是您所需要的。它可以以非常简单的方式实现:使用一个使计数器递增的计时器和一个用于读取计数器值的函数。

    要打开性能测量,我必须启用两个FreeRTOS配置设置:
    1. <font size="3" face="微软雅黑">#define configUSE_TRACE_FACILITY 1 /* 1: include additional structure members and functions to assist with execution visualization and tracing, 0: no runtime stats/trace */
    2. #define configGENERATE_RUN_TIME_STATS 1 /* 1: generate runtime stati</font>
    复制代码
    要配置计时器以及读取计数器,需要使用两个宏来实现函数名称:
    1. <font size="3" face="微软雅黑">#define configGET_RUNTIMER_COUNTER_VALUE_FROM_ISR   AppGetRuntimeCounterValueFromISR
    2. #define configCONFIGURE_TIMER_FOR_RUNTIME_STATS     AppConfigureTimerForRuntimeStats</font>
    复制代码
    使用Tick Counter计数器


    计算任务执行时间的一种非常简单的方法是使用FreeRTOS自带的滴答计数器。可以使用以下代码启用
    1. <font size="3" face="微软雅黑">#define configGENERATE_RUN_TIME_STATS_USE_TICKS     (1)</font>
    复制代码
    但是,这种方式仅在任务执行时间超过RTOS滴答周期时才能测量任务执行时间。对于更快的任务,此方法没有用。根据Nyquist-Shannon采样定理,我最好使用更快的2倍(更好:更快10倍)的测量频率。

    使用Cortex-M周期计数器


    实现该计数器的另一种方法是使用Cortex-M周期计数器,该计数器已在许多设备上实现,并给出了很好的结果。好处是:无需中断或额外的计时器。


    以下是实现的一种方法:
    1. <font size="3" face="微软雅黑">static uint32_t prevCycleCounter, cycleCntCounter = 0;

    2. void AppConfigureTimerForRuntimeStats(void) {
    3.   cycleCntCounter = 0;
    4.   McuArmTools_InitCycleCounter();
    5.   prevCycleCounter = McuArmTools_GetCycleCounter();
    6. }

    7. uint32_t AppGetRuntimeCounterValueFromISR(void) {
    8.   uint32_t newCntr, diff;

    9.   newCntr = McuArmTools_GetCycleCounter();
    10.   diff = newCntr-prevCycleCounter;
    11.   prevCycleCounter = newCntr;
    12.   cycleCntCounter += diff>>12; /* scale down the counter */
    13.   return cycleCntCounter;
    14. }</font>
    复制代码
    使用定期定时器中断


    标准方法是使用定期中断计时器(Periodic Timer Interrupt),该计时器使计数器递增。对于1 kHz滴答计时器,建议的频率是FreeRTOS滴答计时器频率的10倍,本文中是10 kHz(100 us):
    1. <font size="3" face="微软雅黑">static uint32_t perfCounter = 0;

    2. #define PIT_BASEADDR       PIT
    3. #define PIT_SOURCE_CLOCK   CLOCK_GetFreq(kCLOCK_BusClk)
    4. #define PIT_CHANNEL        kPIT_Chnl_0
    5. #define PIT_HANDLER        PIT0_IRQHandler
    6. #define PIT_IRQ_ID         PIT0_IRQn

    7. void PIT_HANDLER(void) {
    8.   PIT_ClearStatusFlags(PIT_BASEADDR, PIT_CHANNEL, kPIT_TimerFlag);
    9.   perfCounter++;
    10.   __DSB();
    11. }

    12. void AppConfigureTimerForRuntimeStats(void) {
    13.   pit_config_t config;

    14.   PIT_GetDefaultConfig(&config);
    15.   config.enableRunInDebug = false;
    16.   PIT_Init(PIT_BASEADDR, &config);
    17.   PIT_SetTimerPeriod(PIT_BASEADDR, PIT_CHANNEL, USEC_TO_COUNT(100U, PIT_SOURCE_CLOCK));
    18.   PIT_EnableInterrupts(PIT_BASEADDR, PIT_CHANNEL, kPIT_TimerInterruptEnable);
    19.   NVIC_SetPriority(PIT_IRQ_ID, 0);
    20.   EnableIRQ(PIT_IRQ_ID);
    21.   PIT_StartTimer(PIT_BASEADDR, PIT_CHANNEL);
    22. }

    23. uint32_t AppGetRuntimeCounterValueFromISR(void) {
    24.   return perfCounter;
    25. }</font>
    复制代码

    总结
    FreeRTOS包含一项功能,可以测量相对于系统中其他任务的任务执行时间。 我需要提供的是计时器或某种计数器的初始化例程,以及获取计数器值的方法。 如果您对检查FreeRTOS计时的其他方式感兴趣,请查看Percepio Tracealyzer或Segger SystemView。1






    作者:阿哲             文章出处:点击

    签到签到
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-4-28 21:53 , Processed in 0.110206 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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