TMOS实现长延时,并且不影响蓝牙功能

WCH的这套TMOS系统确实有局限性,没能做成抢占式的调度方式,文档又说明无法在中断中实现,尤其是调用第三方库时,遇上耗时的程序时,只能改库程序加入调度函数,太影响程序架构了,本来蓝牙通讯应该放到后台管理,tmos这个系统偏偏给放到前台来了,TMOS_SystemProcess()这个函数满天飞。


看了楼主的代码,这个最低优先级中断调用Tmos_SystemProcess的方法确实很巧妙,解决了主循环和耗时程序中调度蓝牙程序的尴尬局面,不用添加调度函数了,程序架构更完整了,不过有一点不是很明白,这个RTC的中断周期在哪里设置,Tmos需要至少625us调度一次,在程序中没发现设置RTC的中断周期,还请楼主指点一下。


image.png

如上图所示,RTC中断周期是在这里设置的,RTC中断设置的时间刚好是下次TMOS需要调用的时间。

也就是说RTC中断在TMOS不需要调用的时候是不会进中断的。


另外,附件的Demo使用的SDK比较老,可能会存在一些问题。建议使用官方最新SDK修改。


大概理解了,是不是每次Tmos_SystemProcess()完成调度后,会调用CH58x_LowPower函数,重新设置下次的RTC触发时间并清中断标志位,等待下次RTC中断,这个函数的time参数由Tmos根据调度周期自动设置,是这个意思吧。之前有个项目就是刷屏和读写flash的耗时操作,为了保持蓝牙连接,只能采用最笨的方法,在过程中隔几行代码就加入Tmos_SystemProcess()。


是的


有一个疑问。我在蓝牙初始化后不马上广播rtc中断就没在运行了。您这边有尝试过吗。我开启广播需要

 RTC_SetTignTime(RTC_GetCycle32k() + 10);

才会开始广播


这样的用法倒是不会导致蓝牙无法使用,不过影响到蓝牙建立连接的速度了,特别慢,很影响使用体验,修改广播间隔也不管用


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