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.

[参考译文] CC2530:OSAL_systemClock 计时器偏移问题

Guru**** 2460850 points
Other Parts Discussed in Thread: CC2530, Z-STACK, SIMPLELINK-CC13XX-CC26XX-SDK

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

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/1249863/cc2530-osal_systemclock-timer-offset-issue

器件型号:CC2530
Thread 中讨论的其他器件: Z-STACKSIMPLELINK-CC13XX-CC26XX-SDK

您好!

我们在 CC2530 ZStack 上运行照明应用、使用示波器计时器实现我们的许多功能。

最近观察到、 osal_systemClock 在不重新启动的情况下、在长时间的操作中偏移了大约90分钟。 因此、用于设置事件的所有其他计时器也会偏移90分钟。 从而导致服务中断

例如:如果计时器必须在3小时后到期、假设计时器在上午12:00到期、则计时器 将在晚上10:30到期、当我们检查 osal_systemClock 时、计时器将偏移90分钟。

我们对代码进行了评估、了解我们不会干扰或更改 任何位置的 osal_systemClock。

想知道为什么会发生这种情况?

谢谢

SDB@23

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

    这可能是32K 晶体的时钟漂移所致。 如果需要准确的时间、可能需要创建与协调器/集中器的时间同步、这可以获得更准确的时间信息。

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

    谢谢 Yikai Chen、

    时钟漂移有什么特殊原因吗?

    考虑到时钟漂移始终存在、您建议的是一种应急解决方案。

    我去过论坛,没有找到更多关于这个主题的帖子,也没有找到很多关于时钟漂移的帖子。 因此、我假设它是罕见的发生事件。

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

    尊敬的 Suhrith:

    所有外部晶体都存在一定的漂移、尽管 CC2530正常运行的最大允许容差限值为+/-40PPM、但这也会因电路板设计和环境而异。  有关建议、请参阅 SWRA372。  因此,如 YK 所建议的那样,与外部来源的时间同步是保持一致参考的最佳方法。

    此致、
    瑞安

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

    谢谢 Ryan。

    我承认您和 YD 提出的解决方案。

    根据您的第一条陈述、我知道漂移的幅度非常小 (应该可以忽略不计)、 但是偏移/漂移是否会发生 90分钟(5400秒) 在短时间内,由于任何情况?

    此外、这种情况偶尔/随机发生在每个节点上、我只是想消除软件对这个问题的影响。

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

    你跑了多长时间才能达到90分钟漂移? 我建议您打印通过定期时间事件的时间、以检查随着时间的推移实际发生了多少时间漂移。

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

    我们已经观察到、当大多数节点运行超过30天时、我们将运行多个测试以及您建议的测试、以获得问题的确切规格。 在我们获得明确结果时将会更新。

    目前、我可以通过假设的情况来解释该问题:

    假设节点在6月1日上午12:00通电、然后持续运行到7月5日上午12:00。  

    7月5日凌晨12:00、我希望读取时 osal_system_clock 应该会返回(35天 X 24小时 X 3600秒 x 1000毫秒= 3024000000毫秒)

    7月5日凌晨12:05、 osal_system_clock 会瞬间跳过90分钟- 此问题 即( 3024000000毫秒+(90 + 5分钟 x 60000毫秒)= 3、02,970,000 毫秒)  

    当我  在上午12:10读取 osal_system_clock 值时、读数现在将 3、03、00,000 而不是 3,024,600,000 (约等于 54,000毫秒= 90分钟)

    这是为了解释 失调电压/漂移不会随着时间的推移而累积、它会立即发生

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

    如何从项目中的 OSAL 系统时钟获取值(我假定为 osal_GetSystemClock 或 osal_getClock)?  您是否能够通过 osal_setClock 操作快速重现问题或缓解问题?  如有可能、请提供代码片段。   

    此致、
    瑞安

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

    我们将使用  osal_GetSystemClock  

    尝试快速重现问题以提供更多见解。 将检查通过 osal_setClock 操作来减轻这种影响的可能性。

    ReadWriteAttrCB 中 read 属性的代码片段

    案例 ATTR_UPPER:

    {

    交换机(操作系统)

    {

    案例 ZCL_Oper_read:{

    uint32 temp = osal_GetSystemClock ();

    OSAL_memcpy (pValue、&temp、4);}

    案例 ZCL_OPER_LEN:

    *PLEN=4;

    中断;

    默认值:

    中断;

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

    调查 temp 值是否曾错误地复制到 pValue 也可能有用。

    此致、
    瑞安

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

    OSAL_GetSystemClock 已在应用程序的其他部分中 用于计算和计算,我们注意到 OSAL_GetSystemClock 值 由于问题无处不在而受到影响

    因此、我们可以排除 错误的 pValue 副本

    此致、

    苏里特

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

    我建议您创建一个周期性的定时器事件来打印 osal_GetSystemClock()的结果,以跟踪 CC2530中随时间推移发生的情况。

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

    大家好、我来自同一个团队、正在处理与 Suhrith 相同的项目、目的是澄清和更新我们面临的问题。

    简而言之、这就是我们的规范所做的工作。

    • 一个重新加载计时器 定时器_R 测试一次。 我们将此事件称为 心跳事件
    • 心跳事件 将从 osal_GetSystemClock()发送经过的时间(以秒为单位)/1000 - someConstant.
    • 我们不会在代码中的任何位置操作 osal 时钟。

    我们面临的这一问题。

    • 大多数情况下是有效的(如99%)、即、它在5分钟后每发送一次正确的值。 即每 心跳事件
    • 但很少发送90分钟左右的跳跃值(不显示增量300秒、而是显示增量约5485秒)
    • 由于发生跳转会影响检测信号时间、还有一个较长的计时器(最多24小时计时器)、它也会跳转90分钟、并且事件在90分钟前被触发。

    我们的日志文件如下所示

    12-07 16:18:25  Heartbeat from node 0xXYZ time=3129
    12-07 16:23:25  Heartbeat from node 0xXYZ time=3429
    12-07 16:25:43  Heartbeat from node 0xXYZ time=8914
    
    • 在这里、您可以看到16:18~16:23、差异正好为预期的5分钟。 此外、时间值也正确。
    • 但之后您可以看到心跳事件在2分钟前发生、即它应该在16:28:25 (16:23:25 - 16:28:25 = 300s)、但它发生在16:25:43 - 16:23:25 = 138s、并且时间值也跳过了8914-3429 = 5485s = 91m。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您使用的是哪个 Z-Stack 版本、因此会出现此类问题?

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

    尊敬的 Akash:

    请 在此期间打印 osal_GetSystemClock 的原始值、这样我们就可以了解是否涉及到溢出问题。  如果您使用 TI EVM 通过默认 Z-Stack 示例确认了此问题、也会有所帮助。  您还可以将您的硬件提交到 SIMPLELINK-2-4GHz-design-reviews 以供进一步审查。  鉴于传统 CC253X Z-Stack 解决方案越来越受 SIMPLELINK-CC13XX-CC26XX-SDK 支持、我建议您通过将问题引入应用(即与上次保存的值进行比较)来缓解该问题、并考虑在未来产品中使用 CC26X2XX 型号。

    此致、
    瑞安