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.

[参考译文] AM62A7:请咨询问题。 R5F 内核的 CPU 频率为800MHz。 为什么执行以下代码需要16到18微秒? 从理论上讲、它不会花费这么长的时间。

Guru**** 2396165 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1488291/am62a7-consult-a-question-the-cpu-frequency-of-the-r5f-core-is-800mhz-why-does-the-following-code-take-16-to-18-microseconds-to-execute-it-shouldn-t-take-this-long-theoretically

器件型号:AM62A7

工具与软件:

请咨询相关问题。 R5F 内核的 CPU 频率为800MHz。 为什么执行以下代码需要16到18微秒? 它从理论上讲不应花费这么长的时间。
补充资料:
使用 K3conf 将 R5F 内核频率读取为800MHz。
`re G.txt`文件保存执行`ccs_register_dump.gel` scrip之后 获得的时钟相关寄存器值
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我们的主题领域专家今天不在办公室。 对该线程的响应将被延迟。

    感谢您的耐心。

    此致、

    Tushar

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

    您好、

    您能否确认在 Debug Build 或 Release Build 中完成了上述测试用例?

    如果测试是在调试模式下完成的、请在 Release Build ?

    此致、

    Anil。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Anil、您好!
    上述测试用例在 Release 构建中完成。
    此致
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Rudao、

    我分析了这个问题、以下是我的观察结果:

    1. vTaskSuspendAll()期间的中断处理:

     如果在内核执行 vTaskSuspendAll()时发生中断、CPU 将首先处理中断、然后返回到完成 vTaskSuspendAll()。

    该 ISR 执行时间可能会给测量带来意外延迟。

    您能否确认您的系统中是否出现此情况?

    2.内存延迟:

    如果您的代码从 DDR 运行、较高的存储器访问延迟会导致执行时间延长。

    您能否确认、上述应用程序在 DDR 或 MSRAM 内存上运行?

    3.延迟是否会导致问题?  

    观察到的16–18 µs 执行时间是否会影响应用程序的实时行为?

    4.建议的调试步骤:

    •在调用 vTaskSuspendAll()之前禁用所有中断、然后再次测量执行时间以排除 ISR 干扰。

    •单独分析每个 API (vTaskSuspendAll()、__disable_IRQ()、xTaskResumeAll()以确定哪个函数产生最大延迟。

    此致、

    Anil。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Anil、您好!
    1. 我不确定是否在测量期间触发了中断、但可以这样做。
    2. 上述应用程序在 DDR 中运行。
    3. SuspendAllInterrupts()/ResumeAllInterrupts()函数是我自己的实现、旨在为 CAN 任务提供临界区保护。 添加这些函数后、CAN 消息周期始终显示10ms 的延迟、例如、100ms 的周期性消息将变为110ms。 禁用这些功能后、延迟问题消失。 CAN 任务每10ms 运行一次、并且SuspendAllInterrupts()/ResumeAllInterrupts()大约每10ms 执行24次、在100ms 内总共执行480次(10 * 24 * 2)。
    4. 打电话后HwiP_disable(),我进行了进一步的测试与以下结果:
      • vTaskSuspendAll:740ns.
      • HwiP_disableInt: 1–2µs
      • xTaskResumeAll: 8–9µs
        先前的测试是使用1MHz 采样频率执行的、而当前结果使用100MHz 的最大采样频率。 由于工具有限、可能会有一些测量误差。
    此致
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Anil、您好!
    修改链接器脚本以将.text 和.data 段映射到 MSRAM 后、前面提到的 CAN 消息周期延迟问题不再发生。
    此致
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Rudao、

    我真的不明白为什么24次检查10毫秒任务中的关键部分。

    是否不可能保护全局临界区(1次)而不是24次检查临界区?

    该 CAN 消息在 CAN 10毫秒任务中发送、并且 在中断模式中发送 CAN 消息?

    我怀疑这种延迟是由于频繁禁用中断,这是延迟 CAN 消息发送.

    此致、

    Anil。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Anil、您好!
    SuspendAllInterrupts 是 CAN 协议栈提供的方法、需要由用户实现。 CAN 消息在中断模式下不会发送、但在轮询模式下会发送。 如前所述、在将文本段和数据段的链接从 DDR1更改为 MSRAM 后、CAN 消息不再出现延迟。 因此问题已经解决。 原因应该是存储器延迟。

    此致
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    因此问题已得到解决。 这应该是由于内存延迟造成的。[/QUOT]

    感谢您的确认。

    此致

    Ashwani