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.

[参考译文] AM6442:R5F FreeRTOS CPU 负载测量严重不正确!?

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1609606/am6442-r5f-freertos-cpu-load-measurement-grossly-incorrect

器件型号: AM6442

您好、

我有一个小型应用、主要包含一个 10us 周期 ISR、该 ISR 为通过 GPMC 连接的 FPGA 提供服务。 使用 125MHz ECAP 计数器、我的 ISR(用户部分)需要超过此周期 1250 个周期中的 1000 个周期、即、CPU 加载肯定大于 80%。

我还有一个 1ms 的时钟 ISR

  /*测量 CPU 负载(使用 2 位小数时的百分比、100=1%)*/
  clock1ms_cpuload = TaskP_loadGetTotalCpuLoad ();
  taskP_loadResetAll();

愉快地返回严重错误的 clock1ms_cpuload = 865、表明 CPU 负载为 8.65 %。

CPU 对 GPMC、未缓存的共享存储器和其他外设进行了大量慢速访问。  TaskP_loadGetTotalCpuLoad 是否考虑到这一点?

有任何解释吗?

此致、

Frank

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Frank、
    `TaskP_loadGetTotalCpuLoad ()`函数通过计算 CPU 非空闲的时间百分比来测量基于 FreeRTOS 的应用程序中的总体 CPU 利用率。

     基本公式:
     
    CPU 负载 (%)= 100%-(空闲任务时间/总时间)× 100%
     

    该函数返回一个按`taskP_load_cpu_load_SCALE`(10000) 缩放的值、
    因此:
     **0**= 0.00%的 CPU 使用率
    **5000**= 50.00%的 CPU 使用率  
    **10000**= 100.00%的 CPU 使用率
    GPMC 是慢速外设。 我不确定您连接的存储器类型、是 NAND、NOR 或 PSRAM?

    如果您仍然需要更高的速度、则需要将 DMA 与 GPMC 配合使用。

    您预期的吞吐量是多少?

    当 CPU 尝试访问未缓存的内存时、与访问缓存的内存相比、CPU 需要更多时间。

    此处的 CPU 从未缓存的内存 (IPC) 中读取数据的用例是什么?
    此致、
    Anil.
     
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Swargam、

    感谢您的答复。

    我们使用 16 位 AD 进行多路复用 NOR 访问 FPGA 寄存器、每次访问持续时间约为 70 - 100ns。 我们知道如何加快此速度:a) 优化 FPGA 代码、b) 使用一些突发访问。

    我们还修复了缓存问题:我们现在使用 r5fss0-1 TCMB 而不是 MSRAM 作为共享存储器、用于 CPU 内 核 r5fss0-0 和 r5fss0-1 之间的数据交换:直接适用于与 FPGA 通信的 r5fss0-1 内核(非缓存@ 0x4101 0000)并针对另一个内核缓存@ 0x78x00 0000。 主要对于  r5fss0-0、会大幅加快速度。

    所有这一切都不会解释 IMHO 错误负载测量:我们使用自由运行的 ECAP 计数器 (0x 至 0xFFFF FFFF) 作为 125MHz 时间戳源、并在 ISR 开始和结束时使用时间戳读取此计数器。 我们得到大于 1000 次计数的差异、在 10us 周期内= 1250 次 ECAP 计数意味着 CPU 负载> 1000/1250 = 80%。

    我们还从 FPGA 读取另一个计数器并获得类似的结果。

    TaskP_loadGetTotalCpuLoad() 应该返回大于 8000 的值、而不是 865。

    此致、

    Frank

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

    PS: CycleCounterP_getCount32() 不能用作时间戳,因为它在空闲循环中与 wfi 指令一起停止。