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.

[参考译文] CC3220SF:NwpPowerOff 超时

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1644769/cc3220sf-nwppoweroff-timeout

器件型号: CC3220SF

在下面的代码片段中、我们注意到、如果在对的调用周围添加了一点延迟

_SlDrvStartMeasureTimeout、等待 A2N_INT_TRIG 被清除将超时

在我们的例子中、使用 newlib-nano 在_SlDrvStartMeasureTimeout 内引起的额外延迟将触发此延迟

对我来说、条件:!(apps_int_sts_raw & 0x1) 似乎与代码注释所说的相反:“等待 A2N_INT_TRIG 被清除...“

通过使用调试器、我可以认为 A2N_INT_STS_RAW 中的位 0 首先设置为 1、然后在短时间设置为 0 后设置为 0、这意味着循环在超时之前不会中断

您能否确认这是一个错误、以及 while 语句中的条件被反转?

ca07b1ec-3164-43b7-8650-da93f6a36490.png

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

    您好、Erik、

    可以向我发送调试器日志吗? 您能否也将在_SlDrvStartMeasureTimeout 中添加的延迟发送给我您的意思?

    您的 NWP N2A_INT_ACK_TIMEOUT_msec 是否与 3000 不同?

    此致、

    Josh Prushing

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

    你(们)好
    首先、对于 _SlDrvStartMeasureTimeout 中的延迟 、我的意思是、根据使用的 C 库、该函数的执行时间会有所不同。 使用 newlib-nano、从_SlDrvStartMeasureTimeout 调用的 memset 需要更长的时间来执行

    NWP N2A_INT_ACK_TIMEOUT_msec 保持不变并设置为 3000

    它是使用断点进行手动调试
    我在读取   和上图中'while '语句之前的 apps_int_sts_raw 后设置一个断点
    对于标准 C 库、apps_int_sts_raw 位 0 为 1
    对于 newlib-nano、 apps_int_sts_raw 位 0 为 0

    我测试了如何 通过手动将结构成员分配为 0 来交换_SlDrvStartMeasureTimeout 中的 memset、然后 apps_int_sts_raw 位 0 为 1
    这就是为什么我怀疑 memset 执行时间是导致差异的原因

     A2N_INT_STS_RAW 位 0 的 0 和 1 状态意味着什么?
    代码注释是否正确、应该为 0 以指示已准备好进行关断?

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

    您好、Erik、

     A2N_INT_STS_RAW 位 0 的 0 和 1 状态是什么意思?

    0 表示中断仍处于挂起状态、1 表示中断已被确认。 确认中断后、器件准备好关断。

    代码注释是否正确、它应该为 0 以表示已准备好关闭?

    第 359 行中的 A2N_INT_TRIG 设置为 1 表示处理器正在触发到 NWP 的中断。

    a2n_int_sts_raw 在 NWP 清除触发条件之前不会从 0 -> 1 切换。 当进入 while 循环时、apps_int_sts_raw = 0、意味着 0 & 1 = 0、因此这会归结为 while(!0)= while (1)。 因此、循环将重复 、直到 a2n_int_sts_raw 设置为 1、当 A2N_INT_TRIG 设置为 0 时会发生这种情况。  第 383 行上的 A2N_INT_STS_CLR 会将 TRIG 和 RAW 设置为 0。

    通过使用调试器、我可以认为 A2N_INT_STS_RAW 中的位 0 首先设置为 1、然后在短时间后设置为 0、这意味着循环在超时
    之前不会中断

    在哪里可以看到该位设置为 1? 如果此位 设置为 1、则意味着 TRIG 已设置为 0、只要在超时到期之前发生这种情况、就会出现预期的输出。

    通过使用 newlib-nano、从_SlDrvStartMeasureTimeout 调用的 memset 需要更长的时间来执行

    这种更长的执行时间是多少? ns、us、ms、s? 你是如何得出结论的? 我不希望 newlib-nano 对这个时序产生重大影响。  您是否还可以 在 if(_SlDrvIsTimeoutExpired(&SlTimeoutInfo)) 中使用 print 语句显示终端输出、确认 while 循环由于超时而退出?

    此致、

    Josh PRushing

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价 userid=“566998“ url=“~/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1644769/cc3220sf-nwppoweroff-timeout/6349014

    在哪里可以看到该位设置为 1? 如果此位 设置为 1、则意味着 TRIG 已设置为 0、只要在超时到期之前发生这种情况、就会出现预期的输出。

    [/报价]

    我可以通过读取  HWREG(A2N_INT_STS_RAW) 看到它变为 1

    以下是 两种场景

    ----- 场景 1 (newlib nano) -----------
    HWREG(WAKENWP) = WAKENWP_WAKEREQ
    调用_SlDrvStartMeasureTimeout(使用 newlib nano 的 Memset)
    读取 HWREG(A2N_INT_STS_RAW) a2n_INT_STS_RAW 为 0、并且始终不会变为置位、因此 3 秒超时
      
    ----- 情景 2(标准库) ------------
    HWREG(WAKENWP= WAKENWP_WAKEREQ
    调用_SlDrvStartMeasureTimeout(使用标准 lib 的 memset)
    读取 HWREG(A2N_INT_STS_RAW) a2n_INT_STS_RAW  为 1、而以下循环直接退出、这是预期结果。
      

    通过尝试使用 _SlDrvStartMeasureTimeout 中的延迟 (手动将结构成员分配为 0 而不是 memset)、我  还可以使用 newlib nano 设置 a2n_int_sts_raw

    那么、如果我们关注场景 1、为什么  在 3 秒超时之前不设置 a2n_int_sts_raw 呢?

    我忘记提到的一点是、在器件下电上电后启动时似乎没有发生这种情况、当我们使用调试器重新启动应用 MCU 时就会发生这种情况。 我们担心的是、在现场器件上进行软件或看门狗复位时可能会出现相同的行为

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

    您好、Erik、

    您能否通过调试器重新启动来确认两种情况都失败?

    如果是这样, 你可以实现代码在 SW/wd OTA 更新后执行完全重置,或者在启动时使用 ClockP_startup () 强制执行时钟初始化。 调试器复位(与 SW/wd OTA 相同)不会强制完全复位、可以跳过时间戳收集的一些初始化、这会直接影响超时检查。

    另外、请确认您在 SDK 中刷写了最新的服务包。

    此致、

    Josh Prushing

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

    只有第一种情况失败

    我做了一些额外的测试来了解 a2n_int_sts_raw 标志的工作原理、我做了一个类似的设置



    具体思路是   在运行后将 a2n_int_sts_raw 标志状态捕获到 apps_sts_capture_buf 中  

    HWREG(WAKENWP) = WAKENWP_WAKEREQ
    上电/复位时、CPU 在捕获后的断点处停止(如上图中的第 373 行)
    检查缓冲区会显示:

    第一个索引是 HWREG(WAKENWP) = WAKENWP_WAKEREQ 之前的状态;这是 0 且可以理解
    接下来的 5 次迭代它为 1、我理解这意味着 NWP 已清除触发条件
    但从索引 6 及以后、它会被设回 0、这是怎么可能的?
     
    这就解释了 HWREG(WAKENWP) = WAKENWP_WAKEREQ 且进入 while 循环之间的时序的原因
    很重要
    您能解释一下为什么 a2n_int_sts_raw 标志被自身清除吗?  
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Erik、

    我还在研究这个问题、我应该在下周初为您做出回应。

    此致、

    Josh Prushing

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

    您好、Erik、

    仍在这里查看一些细节、但 您能否确认您使用的是 SDK 版本 7.10.00.13? 我在第一个屏幕截图 2.40.00.05 中看到、虽然我认为这只是一行代码尚未从旧 SDK 更新、但我只是想确认您使用的是最新版本。

    我已经确认,在我的侧 newlib nano 不会导致超时错误,所以我很好奇,看看这里是否有一个设置差异,可能导致这个超时你.

    此致、

    Josh Prushing

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

    你(们)好
    是的、我可以确认我们使用的是 SDK 版本 7.10.00.13
    也许您可以重复我上面所做的测试、将 A2N_INT_STS_RAW 捕捉到缓冲区中、然后我们可以进行比较、看看您的标志是否也自动清除?