CH582m跑蓝牙mesh的时候,进入睡眠后唤醒发现TMOS的任务都停掉了

使用CH582m,蓝牙mesh中,配网完成就进入睡眠模式 LowPower_Sleep(RB_PWR_RAM30K | RB_PWR_RAM2K);

设置唤醒源为GPIO唤醒,唤醒后发现程序就没有进入事件处理函数。睡眠之前又没有把任务停掉,为什么唤醒后任务都停了呢?

您好,如果需要TMOS系统自动根据事件唤醒,不支持自行调用LowPower_Sleep函数进行休眠。如果需要低功耗节点与朋友节点交互,请参考adv_vendor_low_power工程。如果不需要低功耗节点功能,仅需要低功耗,可以将HAL_SLEEP置位,但不推荐这样使用,易导致丢包及网络信息不同步而无法通信。


意思是跑TMOS的程序是不支持自己调用LowPower_Sleep函数的吗


您好,您对于低功耗的需求是什么样的,用的哪个代码调试的呢,您提供的信息越多越能帮助我们判断。一般除了低功耗节点,其他节点都要求是常供电的。

如果使用的是低功耗节点,在配网后,使能低功耗功能前,就手动调用LowPower_Sleep进入休眠是可以的,GPIO唤醒的话更推荐shutdown,功耗更低,且唤醒后复位,TMOS系统重新分配事件启用事件,一般不会有影响。

TMOS系统安排的事件执行时间是24小时内的基于32K晶振的一个绝对值,如果任务启用后没有停掉,GPIO唤醒后错过事件执行的绝对时间会有异常,所以说如果需要TMOS系统自动根据事件唤醒(即启用HAL_SLEEP),就不支持手动调用LowPower_Sleep函数进行休眠。



使用的是?adv_vendor 代码进行调试的;想要实现的功能是,节点配网完成后进入低功耗休眠,每天设定一个固定的时间唤醒起来把数据发送给指定节点后又进入休眠。唤醒的时间可能只有一两分钟。而且整个mesh网络中只用一个设备是用来接收数据的,其他的全部节点都是需要长时间休眠的。低功耗节点又要和朋友节点一起使用,所以没法使用低功耗节点。

我看LowPower_Sleep模式的描述是,唤醒后程序会继续运行。但是现在我调用LowPower_Sleep进入休眠唤醒后所有的任务都没有跑了,又得重新初始化才可以运行。用shutdown的话,唤醒后都复位了,上一次的数据就又被初始化掉了。


您好,“每天设定一个固定的时间唤醒起来把数据发送给指定节点后又进入休眠,唤醒的时间可能只有一两分钟。”,这个功能可以用低功耗节点实现,也可以用adv_vendor实现,推荐是用低功耗功能+朋友功能的组合实现,能保证网络信息的同步。如果是用adv_vendor+手动管理低功耗实现,注意网络中的IV值更新会改变安全广播消息中的数值,一天唤醒一次,一次至少持续扫描广播包10s,以接收包含IV信息的广播。

“调用LowPower_Sleep进入休眠唤醒后所有的任务都没有跑了,又得重新初始化才可以运行。”,手动调用LowPower_Sleep会打乱TMOS系统的运行,可以在手动调用LowPower_Sleep前调用tmos_stop_task关闭所有TMOS事件,唤醒后再次启用事件,或者重新初始化。如果不使用ShutDown仅仅是为了避免变量数据的丢失,可以将变量存放在指定RAM地址,保持RAM供电的情况下,复位不会重置变量数值,见下篇博客。

关于MounRiver编译器配置的若干问题 - JayWell - 博客园 (cnblogs.com)


只有登录才能回复,可以选择微信账号登录