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.

[参考译文] CC2674R10:各种计时器源翻转

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

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/1460088/cc2674r10-various-timer-source-rollovers

器件型号:CC2674R10

工具与软件:

我与一位客户合作使用此设备时遇到一个奇怪的问题、该问题在重置后持续运行12小时左右时出现。 实质上、该器件不会进入睡眠状态、而且似乎存在待机禁止。 如果问题的重现性很高、但他们正在努力确定根本原因。 客户同意这可能是应用特定的问题、不太可能是 TI 平台软件的问题。 我们想要查看各种基于时间的翻转来源、看看如果存在任何相关性、这是否会给我们提供一些线索。

我不认为有关联,但我希望有人检查我的工作。 他们使用的是 FreeRTOS + OpenThread + BLE。 SDK 版本是7.10.02.23。 它们的 FreeRTOS 节拍率为10kHz (100us)。

无线电计时器

  • 32位、固定4MHz 速率
  • (((2^32)/(4 * 1000 * 1000))/ 60 =~17.9分钟翻转周期

FreeRTOS

  • 32位、固定10kHz 速率
  • (((2^32)/(10 * 1000))/(60 * 60 * 24)=~4.97天翻转期

RTC (被用作待机模式中的唤醒定时器)

我对这部分不是很清楚。 该文档说它是一个"70位自由运行计数器"、但我只看到一个32位"亚秒"和32位"秒"组件。 最高仅累加64位。 假设它在2^32秒后回滚。

  • (2^32)/(60 * 60 * 24 * 365)=~136年翻转期

但是、我认为我们需要查看信道事件的翻转情况。 我认为待机唤醒计时器使用 RTC 通道0事件(在无滴答空闲模式下)。 这似乎使用16位表示秒、16位表示亚秒。 这将近似计算翻转时间、以便:

  • (2^16)/(60 * 60)=~18.2小时翻转周期

总之、我想问:

  1. 我是否应该注意他们的任何潜在计时器滚动?
  2. 我在已经确定的三个翻转源上的数学是否正确?
    1. 我对 RTC 的评估是否正确特别感兴趣、因为这是来源和 TRM 中最难理解的。

当然、欢迎您提出任何有关根本原因调查的其他想法。

谢谢!

Stuart

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

    尊敬的 Stuart:

    我会通知对讲机驱动程序专家帮助回答您的滚动问题。  该问题是否要求发生射频活动、或者无论堆栈活动如何、问题是否会在12小时后发生?  您是否能够在此期间进入调试会话并收集 AON_RTC 寄存器?  如果您可以  在本地将 RFCC26X2_MODE式.c 添加到项目中、并查看通过 AONRTCCurrent64BitValueGet 获取的 RTC 时间戳以及 RF_getCurrentTime 的返回值、也会很有帮助。  客户是否直接在其应用程序中调用任何 RTC API?   

    此致、
    Ryan

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

    以下是一些初始反馈:

    • 如果客户在认为应该处于待机状态时未进入待机状态、这可能是由于待机限制的设置/释放周期不一致。 这是可以在运行时读取的东西 PowerCC26X2_MODUL.constraintCount[2]是他们应该检查的内容。 我们只能在该计数器达到零时进入待机状态。

    • TI 驱动程序不使用1ms 以外的 FreeRTOS 节拍率测试或验证其软件。 在100us 时、我们可能会导致为 FreeRTOS 节拍函数提供服务的大量开销。 这可能对当前问题没有影响、但值得一看的是他们是否可以将该值更改为1ms、看看它是否产生了影响(假设在他们的应用中执行此操作很简单)。

    • 除非客户主动使用第二个 RTC 通道、否则 RTC 不会直接向客户暴露。 否则、他们将通过 ClockP 模块访问 RTC、该模块仅将时间保持在32位10us 系统时钟周期。 因此、ClockP 翻转发生在之后 2^32 * 10us * 1s/1000000us * 1m/60s * 1h/60m = 11.93h

      看起来这可能是罪魁祸首。 或者至少 ClockP 翻转发生在11.93小时后,这意味着它涉及. CC2674X 的 ClockP 实现使用 kernel/FreeRTOS/DPL/ClockPCC26X2_FreeRTOS.c 和 kernel/FreeRTOS/DPL/TimerPCC26XX_freertos.c 它几乎是旧 TI-RTOS 时钟实现的直接副本。

      静态 ClockP_ClockP_MODULE Module_State 保持时钟的状态。 您应该能够使用常见的静态变量读取技巧在 CCS 中访问该代码。 或者只需对 SDK 中所更改的代码进行重新编译、以删除该静态变量。

    希望这对您有所帮助、
    Ryan

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

    Ryan、

    这些建议非常有用。 我已经与客户简要讨论了这些问题、明天我们有时间进行更深入的调查。

    如果客户在认为应该处于待机状态时未进入待机状态、这可能是由于待机限制的设置/释放周期不一致。 这是可以在运行时读取的东西 PowerCC26X2_MODUL.constraintCount[2]是他们应该检查的内容。 我们只能在该计数器达到零时进入待机状态。

    是的、我同意。 我们认为很可能存在积极的限制。 我们还认为它可能与某个 UART 相关。 我们使用入口和出口挂钩对 UART 驱动程序约束进行了检测、其结果使我们怀疑这个外设驱动程序是卡滞约束的来源。 当然、仍然可能是应用程序级逻辑的问题、这正是我们所怀疑的情况。

    TI 驱动程序不使用1ms 以外的 FreeRTOS 节拍率测试或验证其软件。 在100us 时、我们可能会导致为 FreeRTOS 节拍函数提供服务的大量开销。 这可能对当前问题没有影响、但值得查看他们是否可以将其更改为1ms 并查看它是否产生了影响(假设在他们的应用中执行此操作很简单)。

    规格。 我们知道这一点。 有一个潜在的路径可将节拍率降至1kHz。 目前、我们认为这不太可能是根本原因、但会继续加以考虑。

    除非客户主动使用第二个 RTC 通道、否则客户不会直接接触 RTC。 否则、他们将通过 ClockP 模块访问 RTC、该模块仅将时间保持在32位10us 系统时钟周期。 因此、ClockP 翻转发生在之后 2^32 * 10us * 1s/1000000us * 1m/60s * 1h/60m = 11.93h [报价]

    我认为这是最有趣的。 我浏览了适用于 CC2674R10器件的 ClockP 驱动程序。 我同意翻转数学。 大多数客户应用计时器使用情况实际上直接发生在 FreeRTOS 计时器 API (SysTicks、而不是 ClockP)上、这就是你需要10kHz 节拍率的原因。 不过、我想通过 OpenThread API 进行的任何计划都可以在 POSIX 计时器之上移植、而这个计时器又可以在 ClockP 计时器之上。 我们将确认此架构。 此外、客户正在使用 TI 驱动程序(这些驱动程序使用幕后的 ClockP 计时器)、包括具有其"超时"API 的 UART 驱动程序。

    我们现在主要集中精力在这里。

    看起来这可能是罪魁祸首。 或者至少 ClockP 翻转发生在11.93小时后,这意味着它涉及. CC2674X 的 ClockP 实现使用 kernel/FreeRTOS/DPL/ClockPCC26X2_FreeRTOS.c 和 kernel/FreeRTOS/DPL/TimerPCC26XX_freertos.c 它几乎是旧的 TI-RTOS 时钟实现的直接副本。

    同意。

    静态 ClockP_ClockP_MODULE Module_State 保持时钟的状态。 您应该能够使用常见的静态变量读取技巧在 CCS 中访问该代码。 或者直接使用 SDK 中修改的代码进行重新编译以删除静态变量。[/QUOT]

    同意。 我们也可以考虑这里使用一些仪器、因为在不无意中导致复位的情况下、很难将其与目标保持连接~12小时、或连接到已运行~12小时的目标。

    谢谢!

    Stuart

    [/quote]
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价 userid="111013" url="~/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/1460088/cc2674r10-various-timer-source-rollovers/5608093 #5608093"]然而、我认为通过 OpenThread API 计划的任何内容都是在 POSIX 计时器的基础上移植的、该计时器又是在 ClockP 计时器的基础上移植的。

    根据我对 source/ti/posix/freertos/timer.c 的审查、POSIX 计时器似乎是在 FreeRTOS 计时器的基础上实现的。 因此、我认为这些不是 ClockP 实施相关任何翻转问题的可能原因。

    这实际上根据 FreeRTOS 上 POSIX 计时器的局限性进行跟踪、因为在技术上它们不支持 SIGEV_SIGNAL、仅支持 SIGEV_THREAD、因为 FreeRTOS 计时器始终在任务(线程)上下文中运行。

    谢谢!

    Stuart

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

    与客户坐下来查看这些可能的计时器翻转源后、我们将可能的候选范围缩小到 ClockP 计时器、该计时器在 UART2驱动程序中用于超时读取。 事实证明、客户 设置了以下事件序列:

    1. 调用"阻塞"UART 读取。
      1. 结果、在引擎盖下、实际上是使用 ClockP 最长时间超时(11.93小时)读取的
    2. 异步但稍后通过从应用处理电源管理的另一个线程禁用 UART RX、从而消除低功耗抑制。
    3. 12小时后、返回阻塞式 UART 读取(最大超时周期)。 另一个"阻塞"UART 读取的调用是进行的。
      1. 这导致在引擎盖下、通过低功耗有效抑制重新启用 RX。
    4. 异步电源管理线程不知道返回了 UART 读取并重新布防、因此稍后不会禁用 RX 并消除低功耗抑制。

    客户已 将其应用程序逻辑修改为这种现在已知的行为、并确认问题已解决。

    谢谢!

    Stuart