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.

[参考译文] LAUNCHXL-CC1352R1:任务睡眠和软件中断

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1275366/launchxl-cc1352r1-task-sleep-and-software-interrupt

器件型号:LAUNCHXL-CC1352R1
主题中讨论的其他器件:SysConfigENERGYTRACE

您好

我将 CCS10.2与 TI-RTOS 和 POSIX 配合使用。

我的程序有几个任务...我需要将其中一个任务置于睡眠状态[使用 sleep()或 Task_sleep()],但我想通过发出软件中断(从另一个任务)来唤醒它(即中止睡眠)。

有办法做到这一点吗?

谢谢

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

    大家好、Moshe、

    您可以使用信标(或事件或邮箱)、而不是使用 SLEEP。 您的"睡眠任务"会在该信标上挂起、然后另一个任务可以发布一个信标以唤醒您的睡眠任务。

    部分链接:

    TI RTOS 用户指南: https://dev.ti.com/tirex/explore/node?node=A__AH-lR8uvYApjnRXM4yEbrQ__com.ti.SIMPLELINK_CC13XX_CC26XX_SDK__BSEc4rl__LATEST&placeholder=true

    2. TI RTOS API 说明: https://dev.ti.com/tirex/explore/node?node=A__AHn0Jo.DdI7vNYFZsXC30g__com.ti.SIMPLELINK_CC13XX_CC26XX_SDK__BSEc4rl__LATEST&placeholder=true (为 CC1352R1选择 M4)

    TI RTOS Simplelink 采集实验室: https://dev.ti.com/tirex/explore/node?node=A__AT-CyLFO6oHUzYNR33ZsVw__com.ti.SIMPLELINK_ACADEMY_CC13XX_CC26XX_SDK__AfkT0vQ__LATEST&placeholder=true 

    谢谢、

    M·H

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

    您好,Marie

    是的,我试过了 Event_pend ()/ Event_post ()和 Semaphore_pend ()/ semaphore_post () ...两种方法都把任务放在 slumberland 中,但哪一对减少了最多的功耗?

    此外、一旦所有"我的"任务都在森林中执行、我的理解是、空闲环路会被调用。 此时、CC1352是否处于任何形式的低功耗状态、或者它是否仍以全功率运行且所有外设和无线电均处于活动状态?  

    更新:
    看看电流消耗、我是使用 Event_pend/post 还是 Semaphore_pend/post、电流消耗是 相同 ....对于两种情况,我一直等待,直到一个事件/ SEM 被布置。 因此、我必须得出一个结论:在等待时、MCU 不处于任何低功耗状态、而低功耗完全是一个独立的做法。

    谢谢

    莫什

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

    大家好、Moshe、

    与信标是相同的。 在等待期间、器件进入空闲状态。 如果启用了 STANDBY、器件功率级别将进入 STANDBY、也称为 SLEEP (0.7uA)。  

    如果您使用 SDK 中的示例应用、其中大多数都默认启用待机。 您可以通过打开 SysConfig -> TI drivers -> Power 来检查此情况、并检查使用的电源策略是 PowerCC26XX_standbyPolicy。

    当您说您正在查看电流时:是否连接了调试器? 这将防止器件进入待机状态。 有关测量功耗的更多最佳实践:

    https://www.ti.com/lit/swra478

    谢谢、

    M·H

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

    您好,Marie

    不可以。调试器未连接。。。我通过3.3V 为电路板供电并使用电流探针检查电流消耗(9mA)。

    我将进一步调查为什么我不会睡觉...感谢这种联系-更多的调查。

    此致

    莫什

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

    大家好、Moshe、

    您能否在 CC1352 LaunchPad 上尝试使用 EnergyTrace? 我们这里有一个指南:

    https://dev.ti.com/tirex/content/simplelink_cc13xx_cc26xx_sdk_7_10_01_24/docs/proprietary-rf/proprietary-rf-users-guide/energy-trace/energy-trace.html

    谢谢、

    M·H

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

    您好,Marie

    感谢这个链接。 但是、我不明白 EnergtTrace 如何确定我的电路板使用8mA 而不是1mA 的方式、位置或原因。

    我在 SysConfig 中看到已启用待机策略。

    我执行了一个练习、确保我的4个任务可以安全地保留在它们各自的 Semaphore_pend ()函数中的某个位置、并且传感器控制器还没有启动。 电流消耗仍然保持在8.69mA……然而、我确实注意到(在示波器上)每10ms (左右)在电流使用中就会产生大约1mA 的浪涌。
    放大这个浪涌、我看到它的振铃浪涌持续大约10uS ...关于这个有什么想法吗?

    你有什么建议,我应该尝试确定发生了什么?  
    加油打气
    莫什

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

    大家好、Moshe、

    电能迹线可以提供相当准确的测量值以及随时间变化的电流消耗曲线。  

    您还可以使用 EnergyTrace++来查看何时为哪些电源域供电。 这可能会提示您正在消耗如此大的电流。 (请注意、使用 EnergyTrace++时、器件无法进入待机模式。)

    如果您的器件确实要进入待机状态、则在电容器再充电(再充电峰值)时会出现电涌。 我链接的应用手册中进一步说明了这一点。

    您能否尝试在没有更改的情况下运行其中一个 SDK 示例并测量您的电流消耗? 例如:drivers/empty 或 gpiostandby。 然后、我们可以检查该问题是否特定于您的定制应用。

    谢谢、

    M·H

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

    您好,Marie

    很棒的建议...我运行了 gpiostandby....interestingly、结果是我想要的-即 sub 1mA。
    因此、我将重点介绍该项目与我的项目之间的差异。

    我看到 gpiostandby 中的嘟嘟声,当电流消耗到9mA 时...这似乎每隔600ms 发生一次程序退出睡眠().  

    顺便说一下、我的项目最初是 SDK 5.20中的 rfWsnNode_CC1352R1_LAUNCHXL 项目(我仍在 SDK 5.20中运行它)、我为此进行了修改。

    更新:
    我对启动无线电的代码进行了注释...因此当无线电关闭时、电流消耗下降到了可以容忍的1.1mA。
    因此、当我进入待机 模式时需要关闭无线电、这有点问题、因为这意味着后端服务器无法与程序通信。
    我当时的印象是、袖手旁观等待 Rx 数据包、无线电的 功率级别将是最低的。

    作为进一步更新:
    我正在读取 SWRA486。 从这一点来看 、当我的所有任务都在它们的 Semaphore_pend 函数中时、MCU 根本就没有处于待机模式、因为无线电和 UART 外设仍然打开。 这似乎是由上述经验证实的(尽管仍不清楚什么采取了剩余的0.8mA )。

    加油打气

    莫什

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

    大家好、Moshe、

    好的、那么我们已经确定问题出在软件中(而不是您的电路板或测量过程)。

    我们不再主动支持 EasyLink 和 WSN 示例、但如果您说电流消耗为9 mA、听起来无线电可能持续处于 RX 状态。 仅仅保持空闲状态不会产生如此高的电流消耗。

    谢谢、

    玛丽

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

    您好,Marie

    我研究了如何关闭对讲机...似乎有2个控制设置...

    1) EasyLink_setctrl Link_Ctrl_Async (_45ct, the_rx_timeout );//在 RxTimeout 时间内没有任何内容,无线电将进入空闲状态
    2) EasyLink_setctrl ctrl ( Link_Ctrl_Idle_Time 38t,radio_idle_timeout );//如果在这段时间内无线电空闲,它会断电

    当无线电关闭时,此方法仍然有效-但 Rx 超时太短...
    2 ctrl 参数使用的时间单位似乎存在差异...
    对于"45V Link_Ctrl_Idle_Time 45ct",它会显示需要在 Us 中指定的超时值。 我通过将 RADIO_IDLE_TIMEOUT = 50 * 1000L * 1000将其设置为50倍、然后查看示波器、我可以看到在大约50倍的空闲时间(电流消耗0mA!)后无线电关闭。
    然而,."45_ Link_Ctrl_Async time"我正在丢失,因为它没有显示这是在我们指定的,但在一些其他时间单位。
    例如、我将 TH_RX_TIMEOUT 设置为 30 * 1000L * 1000L、期望30s 的超时、但我看到大约4s 后、Rx 关闭(电流下降)...我也 不知道为什么它使用4s……

    您能不能给我们介绍一下
    (a) 4S 来自何处。
    (B) Link_Ctrl_Async 中预计有哪些时间单位 c11_intaby 时间 t enum 到 be.in。

    谢谢

    莫什

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

    大家好、Moshe、

    您可以在此处找到 EasyLink 的 API 文档:

    https://dev.ti.com/tirex/content/simplelink_cc13xx_cc26xx_sdk_6_10_01_01/docs/proprietary-rf/proprietary-rf-users-guide/proprietary-rf-guide/doxygen/easylink/html/group__EasyLink.html#gga45fe0d888f09a907e8149d39fc83efe4ae1c7787ecd8886983d287dc50c28a6e5

     Link_Ctrl_Async 451_TIME 事件的 定义如下:"从同步 Rx 开始到超时的刻度的相对时间。 值为0表示无超时"。

    谢谢、

    M·H

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

    您好,Marie

    是的、谢谢、我在几个小时前解决了这个问题。

    在事件循环之前、我的 TaskFunction 中的解决方案如下所示...
    EasyLink_init();  
    EasyLink_abort();
    EasyLink_setctrl (EasyLink_Ctrl_async_rx_timeout、EasyLink_ms_to_radiotime (30000UL));
    EasyLink_receiveASYNC (CB、0);

    如果没有 EasyLink_abort(),Rx_TIMEOUT 值(已在 SysConfig 中设置)将无法更改。
    我还发现、 setctrl 中使用的时间单位必须是"无线电时间节拍"、单位不是在任何位置定义的。
    然而...在 setctrl 调用 枚举器 Link_Ctrl_Idle_Timeout 中使用的时间单位必须在"微秒"中!!
    同样,在任何地方都没有明确说明这一点。

    所以现在我所有的问题都解决了...以上是为任何人想知道。

    ps...我还有另一种方法在 EasyLink_receiveAsync()之后设置一个时钟超时,并且在时钟回调中我发现,如果我 在更改 EasyLink_Ctrl_async_rx_timeout 之前调用 EasyLink_abort(),那么新的超时将在 EasyLink_receiveAsync(CB,0)随后调用时生效。

    加油打气

    莫什