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.

[参考译文] AM2432:CCS 调试会导致时序问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1406078/am2432-ccs-debugging-causes-timing-problems

器件型号:AM2432
主题中讨论的其他器件:SysConfig

工具与软件:

尊敬的专家:

我有一个用于 AM243X R5F 的软件工程  

  • CCS 12.6.0.00008  
  • TI Clang 3.2.1 LTS
  • 工业通信 SDK 9.1.0.03
  • SysConfig 1.19.0
  • Blackhawk XDS-560v2调试器

该软件使用两个内核、每个 FreeRTOS 均在运行、一些硬实时中断(IRQ 和 FIQ)会中断系统。 我们还通过 DebugP_LOG 使用到 UART 的调试输出

SysConfig 内核#1: 启用 UART 日志和 启用共享内存日志读取器

SysConfig 内核#2:启用共享存储器日志写入器

我发现硬实时任务(IRQ 和 FIQ)未定期运行、这会导致系统出现时序故障。 仅当我从 CCS Debugging 中运行软件、且"Debug Outputs"处于活动状态时、才会发生这种情况。 如果软件从闪存运行(但仍然可以看到 UART 的调试输出)、问题就会消失。 如果我删除对 DebugP_LOG 的所有调用、该问题也会消失。

在 DebugP_log 的情况下、调试会话为什么会停止系统?

BR

Alexander

 调试配置为:



















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

    您好、 Alexander、

    实际上,当你使用 DebugP_LOG 时,这个 API 用于在 UART 寄存器上写入数据。

    因此、在向 UART 寄存器写入数据之前、所有中断都将被禁用。 写操作完成后停止。 它启用所有中断。 因此、您可能会延迟中断。 但是、FIQ 通常不起作用。由于 FIQ 是最高优先级、而不是 IRQ、因此在 MCU+SDK 中、在所有关键部分中、我们仅禁用 IRQ、而不禁用 FIQ。 因此、FIQ 基本上不起作用。

    请分享有关哪些外设配置为 IRQ 或 FIQ 的详细信息?

    根据上面的注释、内核2中未启用 DEBUG_LOG。

    因此、我假设这些问题属于核心问题1?  

    请确认。

    您是否在两个内核中使用了相同的 UART?

    您是否在应用中使用 IPC?

    是否也在内核2中使用调试日志?

    如果软件是从闪存运行的、则问题就消失了

    该版本是哪个版本还是调试版本?

    此致、

    Anil。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [quote userid="83664" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1406078/am2432-ccs-debugging-causes-timing-problems 为什么调试会话在发生 DebugP_log 时停止系统?

    您是否 无意中启用了"在任何调试器访问之前停止目标"? 某些方面来实现的。

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

    否、此项目已禁用。 .

    (如果我知道调试设置所在的文件、我会将其附加...)

    谢谢和 BR

    Alexander

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

    进一步深入探究,问题并不取决于 DebugP_log()。 有时会出现错误、有时不会出现错误、但仅在使用调试器时才会出现。 因此、 我们必须查看整个调试环境。

    BR

    Alexander

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

    Anil、您好!

    来自内核2的调试消息通过 共享存储器日志写入器、共享存储器日志读取器传输到 UART。 这实际上在工作。

    我同意问题最有可能出现在核心1上。 因此、更多信息是有关内核1的。

    我们有三个作为 FIQ 实现的 ePWM 中断。 一个软件中断 Hwip_post ()被作为 IRQ 触发。 以及 SysConfig 的大量模块:时钟、MPU、ePWM、GPIO、MCAN、 QSPI、调试 UART、ETHPHY、FLASH

    我已验证当我 HWIP_DISABLE ()一段较长的时间后我不能产生影响。

    我不理解 IPC -如果你是说的斜坑( )、我已经在调试代码中删除了它们。

    我将使用程序的"Debug"构建用于调试和闪存。 SDK 库在不同版本中随意使用:


    ${INHERITED_LIBRARIES}
    ${sysconfig_tool_libraries}进行配置
    ${COM_TI_MOTOR_CONTROL_SDK_AM243X_libraries}进行编程
    freertos.am243x.r5f.ti-arm-clang.release.lib
    drivers.am243x.r5f.ti-arm-clang.release.lib
    enet-Cpsw.am243x.r5f.ti-arm-clang.Debug.lib
    lwip-freertos.am243x.r5f.ti-arm-clang.Debug.lib
    lwip-contrib-freertos.am243x.r5f.ti-arm-clang.Debug.lib
    lwipif-cpsw-freertos.am243x.r5f.ti-arm-clang.Debug.lib
    board.am243x.r5f.ti-arm-clang.Debug.lib
    libc.a
    libsysbm.a

    BR

    Alexander

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

    您好、Alexander、

    根据上述注释、您已确认该问题不是由 Debug_LOGP 和调试器连接引起的。

    [报价用户 id="479799" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1406078/am2432-ccs-debugging-causes-timing-problems/5384911 #5384911"]

    您是否 无意中启用了"在任何调试器访问之前停止目标"? 某些方面来实现的。

    [报价]

    请检查除上述配置之外的任何其他调试配置。 我不熟悉上述调试器。

    如果您仍面临此问题、需要我们的帮助、我可以将其重新分配给合适的专家。

    此致、

    Anil。

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

    尊敬的 Anil:

    以下是我在 CCS 项目中针对第一个内核进行的调试器设置。 我找不到任何可疑的东西。 有什么想法我应该改变什么?

    BR

    Alexander

    e2e.ti.com/.../Debugger-settings.zip

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

    您好、 Alexander、

    禁用以下选项的节拍并在调试器连接后检查中断时序。

    我们在 MCU+SDK 级别中不使用 XDS 560V2调试器。

    同时、我可以在内部与其他团队成员一起查看这些调试器设置。

    此致、

    Anil。

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

    Anil、您好!

    我删除了第一个和第二个内核中的两个项目、但问题仍然存在。 抱歉混淆了  "在任何调试器访问之前停止目标"。

    我接下来可以尝试什么?

    BR
    Alexander

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

    您好、Alexander、

    在内部、我需要检查调试器设置并更新状态。

    此致、

    Anil。

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

    您好、Alexander、

    我正在使用 XDS 110调试器,并捕获 XDS 调试器设置的图像供您参考。

    我看着他们。 您的设置和我的设置看起来是相同的,有些是不同的。

    我认为这种改变不会造成问题。 但是、您可以尝试选择我的设置并查看结果。

    同时,您能否确认您如何确认 IRQ 和 FIQ 未在特定时间触发。

    它是基于 GPIO 还是基于任何计时器?

    如果它是基于计时器、那么您使用哪个计时器进行性能分析?

    我希望在调试过程中不要停止 调试器和配置 IRQ 的..如果您停止调试器,这也会影响 IQR/FIQ 配置。

    请确认。

    此致、

    Anil。

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

    Anil、您好!

    在随附的图像中、黄色是 PWM 输出、D0、D2是 GPIO、指示内核1上的两个 FIQ 中断、D3、D4是 GPIO、指示内 核2上的两个 FIQ 中断。 下面是上面的放大图。 PWM 将不断闪烁、但中断会被阻止大约300ms。

    我使用 Spectrum Digital XDS200调试器进行了测试、结果是相同的。

    否、我不手动停止内核。

    性能评测呢? 我可以在哪里打开和 关闭它?

    BR
    Alexander

     

     

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

    Anil、您好!

    我能够跟踪该问题、 从后台任务调用 std::time (NULL)。 如果我剪掉这个、我将无法再重现错误。

    这是如何干扰调试器的?

    BR
    Alexander

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

    您好、Alexander、

    您能否分享完整的 API std :: time (NULL)和文件详细信息?

    我可以检查一下、然后返回。

    此致、

    Anil。

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

    Anil、您好!

    我不明白您的问题。 关键指令是

    如果( )

      debugVariable = std::time (NULL);
    }

    该指令在 debugVariable 中返回时间值、但会导致时序问题。 std :: time ()是 C++编译器 API 中的标准函数。 如果我可以配置此函数、请给我一点提示。

    BR

    Alexander  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价 userid="83664" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1406078/am2432-ccs-debugging-causes-timing-problems/5393670 #5393670"]

    Anil、您好!

    我不明白您的问题。 关键指令是

    如果( )

      debugVariable = std::time (NULL);
    }

    该指令在 debugVariable 中返回时间值、但会导致时序问题。 std :: time ()是 C++编译器 API 中的标准函数。 如果我可以配置此函数、请给我一点提示。

    [报价]

    您好、Alexander、

    我们不会在 MCU+SDK 中使用上述 API 来获取时间值。

    为了获取当前时间值、我们需要 根据需要启用计时器、并采用我们在 MCU+SDK 中采用的相同方法从同一计时器获取时间戳。

    实际上、有一个 GTC 计时器是64位的。 因此、您可以在应用中使用该变量、并在需要时读取时间值。

    所有 API 均可用于读取 GTC 时间值。

    uint64_t GTC_getCount64 (空)

    要启用 GTC、请在系统 cfg 文件中启用 GTC 外围设备。

    此致、

    Anil。

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

    Anil、您好!

    要获取当前时间值、我们需要 随时启用计时器并从同一计时器获取时间戳、所需方法与我们在 MCU+SDK 中采用的方法相同。

    谢谢您的提示。 我将和我的同事讨论这一点、

    如果挖掘到 API 源代码中,则看起来 std :: time()实际上在调用主机以获取实时值...  

    ccs1260\ccs\tools\compiler\ti-cgt-armllvm_3.2.1.LTS \lib\arm\time.c src
    ccs1260\ccs\tools\compiler\ti-cgt-armllvm_3.2.1.LTS \lib\hosttime.c src

    BR
    Alexander

x 出现错误。请重试或与管理员联系。