关于CH579 BLE库的问题

使用测试了一段时间CH579这个芯片,发现功能真的很强大,再上个RTthread内核,开发起来简直舒服,但是运行中发现一个问题,就是要兼顾TMOS自身的事件机制,因为TMOS和蓝牙协议栈是不开源的,所以就没办法将实时内核的事件机制和TMOS本身融合起来,导致必须有一个线程一直调用TMOS_SystemProcess()函数,并且不能加延时,加了延时后就会导致蓝牙无法连接,这样就只能将所有的任务运行在同优先级时间片调度模式下,然后还得保证其他任务的时间片尽可能的短,因为无法得知TMOS本身处理消息需要的实时性,但是实际情况是大多是事件TMOS内核都是在空运行,只有蓝牙事件来了才会处理,导致大量的处理器时间被浪费。

所以可不可以请WCH团队开放一个TMOS内核的消息机制的回调接口,可以通过这个接口触发一个其他内核的消息机制去启动TMOS_SystemProcess(),这样就可以用一个高优先级线程和消息来释放出空闲处理能力同时也能保证TMOS内核的实时性。如果不试用第三方内核可以直接在回调接口中调用TMOS_SystemProcess()函数,保证无实时内核情况下的版本兼容性

想要实现空闲的时候也可以去处理一些事件,可以添加宏定义HAL_SLEEP=TRUE,打开睡眠,在没有任务的时候会调用这个函数CH57X_LowPower( u32 time ),这个函数的输入参数time是下一个唤醒时刻的时间点,在这个时间点之前你可以去执行自己的代码。


感谢感谢,这个方法好,我刚测试了下完全可行,目前测试结果好像确实比我之前用的时间片轮转连接要稳定,之前不定时就会断连接。有个小问题,就是WAKE_UP_RTC_MAX_TIME这个参数写的是时钟稳定时间,是不是就是系统如果小于这个时间就不进入这个sleep函数呢?我现在不执行低功耗模式,也就不存在时钟稳定时间,我是不是可以把这个参数设置为0?原本设置的是45,这个45也够一个1ms延时了,能轮转一些其他任务去了j_0059.gif


j_0070.gif原来中心设备设置这个低功耗不起作用的么,不会仅低功耗函数啊~~


如果你不想做低功耗,直接不睡就行了,那个参数也就没必要改了,处理好自己想处理的事情后,直接return退出去,如果你处理事情的时间比较长,就需要去查rtc中断标志,产生中断退出去就行,中心设备也是可以低功耗的啊,你添加全局宏试试。


嗯,设备端我就是按照你说的这个说法做的,把参数传进来的参数转换成时间然后挂起线程,让出处理器处理其他事物,非常好用,但是中心设备就不行了,打开sleep宏后,扫描时不会进入sleep回调函数,只有在与设备建立连接时会进入一下,然后就再也不进了,是我哪里没配置对还是中心设备的机制就是这样的


后来解决了吗?我也是用rtthread也想用蓝牙,非常不稳定,


你在使用蓝牙不稳定,可能是任务发生了阻塞,导致了蓝牙本身的任务得不到及时处理而出现断开的现象。

基于此,上述已经给出了答案。你如果想要处理自己的任务,可以开启宏定义HAL_SLEEP = 1,然后在CH57X_LowPower函数里处理自己的事情,处理完之后return退出就可以。

上述所提到主机只进入一次低功耗的函数,我们进行尝试是没问题,主从连接成功之后是持续进入的。这里你检查一下供电,建议使用USB进行供电。这里的参数也进行一下修改。

1.png


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