This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AM263P4-Q1:无 RTOS 中的 CPU 负载计算

Guru**** 2394295 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1498088/am263p4-q1-cpu-load-calculation-in-no-rtos

器件型号:AM263P4-Q1

工具/软件:

您好:

我有一个内核、它使用 ePWM 中断以及其他中断和 ISR 来运行控制循环。

我想测量空闲状态(即不在 ISR 或任何其他代码中)花费的时间以计算 CPU 负载。

其思路是使用 WFI 测量不间断时间、如下所示:

/* Record when uC goes to idle using a free run timer. */
wfi_ticks_start = CycleCounterP_getCount32();

/* Wait here until an interrupt occurs. WFI: Wait-For-Interrupt. */
CSL_armR5SetWFIMode();

/* If here, an interrupt has occurred. */
wfi_ticks_end = CycleCounterP_getCount32();
        
wfi_ticks = wfi_ticks_end - wfi_ticks_start;

但是、wfi_ticks 的值太小、不能合理。 我怀疑在低功耗模式(WFI)下、循环计数器也停止为  CycleCounterP_getCount32 ()提供低返回值。

 当执行 WFI 时、CycleCounterP_getCount32 ()的时钟源是否停止?

谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Kier

    我在 GPIO_INPUT_INTERRUPT 示例上测试 WFI API、当时没有等待我按按钮。

    因此、我在 Hello World 示例上测试了 API、因此我知道没有配置中断。 但是、我的程序没有等待任何中断、这就是为什么 CPU 周期看起来如此之低。

    我也使用 CCS 分析对此进行了验证、似乎程序并没有真正在等待中断。

    您是否能够在您的程序中验证 CSL_armR5SetWFIMode () API 的工作,否则我会与开发团队讨论以找出错误!

    此致、
    阿克什特

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Akshit、

    在等待确认上述问题时、我继续实施了 SYSCFG 计时器(RTI5)、并使用了自由运行的计数器。 我的想法是外设不受 WFI 的影响。 我现在正在获得合理的结果、因此在我的例子中、WFI 似乎有效、它也似乎证明循环计数器在 WFI 期间不会计数。

    我不知道它是否有用、但在某些处理器上、您可能需要禁用中断:

    HwiP_disable(); \
    CSL_armR5SetWFIMode(); \
    HwiP_enable();

    这里的说明是: https://stackoverflow.com/questions/23305953/why-do-we-need-to-disable-interrupt-before-wfi-in-arm-linux-cpu-idle

    话虽如此、禁用/使能中断在我的情况下似乎没有任何区别!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Kier

    多亏了这些信息、我很高兴您能找到一种使用 RTI 计数器对空闲时间进行基准测试的方法。

    我将提交一个错误并调查 CycleCounter P 在 WFI 期间不工作的原因。

    让我回到你的身边!

    此致、
    阿克什特

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Akshit、

    我将提交一个错误并调查 CycleCounter P 在 WFI 期间无法正常工作的原因。

    我不确定这本身就是一个错误。

    但我的初始问题的答案是什么:WFI 模式下的循环计数器是否会增加? 请确认或不确认。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Kier:

    WFI 模式下周期计数器是否会增加? 请确认或不确认。

    在 WFI 模式下、右循环计数器不会增加

    CycleCounterP_getCount32 ()是在 PmuP_armv7r_asm.S 中实现的

    /* FUNCTION DEF: uint32_t CycleCounterP_getCount32(void) */
            .global CycleCounterP_getCount32
            .type CycleCounterP_getCount32,%function
            .section ".text.pmu","ax",%progbits
            .arm
            .align 2
    CycleCounterP_getCount32:
            MRC     p15, #0, r0, c9, c13, 0  // read PMCCNTR
            bx      LR

    如上所示、该 API 读取 PMCCNTR 以获取当前时钟计数。

    PMCCNTR (CycleCounterP_getCount32 ()读取)的时钟源是处理器内核时钟。

    执行 WFI 时、处理器内核进入低功耗状态。 在该状态下、是 内核时钟通常是选通(停止) 以节省功耗。 由于 PMCCNTR 会对内核时钟周期进行计数、因此它也会在内核时钟被选通时停止递增。

    为了正确测量 WFI 中花费的时间、您需要一个计时器、即使 CPU 内核时钟停止也能继续运行。 这通常意味着使用 外设计时器 (例如 SYSCFG 计时器(RTI) 使用中)、由系统时钟或在 WFI 期间保持运行状态的辅助时钟源计时

    此致、
    阿克什特

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    很好的答案。 谢谢!