Linux 定时器同步问题
问题背景:系统进行电池性能测试时,未能满足24h供能。
现象:进入低功耗的系统被A进程持续唤醒。
分析:模块A使用CLOCK_BOOTTIME且写了wake_lock,BSP使用的CLOCK_BOOTTIME_ALARM,唤醒了BSP且wake_lock被占用导致系统无法立即休眠。
根本原因:定时器不同步。
解决方案:
现有条件:BSP定时发出UTC时间戳,各进程可订阅,BSP会定时唤醒系统,各进程进行工作。
-
A:进程停止写wake_lock。
缺点: 存在进程A工作时被系统休眠情况,影响业务。
-
B:订阅BSP的UTC,回调进行时间同步,同时写wake_lock保证不被打断,工作完写wake_unlock。
缺点:代码改动量大(之前使用的公共库不能继续使用,修改库将影响其他进程使用)
最后选择方案B,并选择add Class代替修改。
新建TimeA类,原Time改继承这个TimeA,对旧代码仅需要新增回调,修改原始继承。