你好,首先感谢你的关注,不过这个kit只是一个封装成消息队列的框架而已,算不上RTOS。。。
对于集成BLE的问题,我这里简要的讲下,希望能对小伙伴们有帮助。不过最终集成还是需要你们自己了解Nordic的那部分代码,最好是弄懂了官方的一个简单的例子,比如心率仪。
BLE的SoftDevice是通过软中断的方式与应用程序通信的,当BLE的程序在后台运行的时候,会产生各种事件,例如蓝牙收到数据、蓝牙断开等,这些事件发生后都会自动调用 SWI2_IRQHandler 这个中断函数(注意只是告诉应用层有事件发生,具体的是什么事件要通过其他函数读取)。当这个函数被自动调用的时候,应用层可以通过sd_evt_get 和 sd_ble_evt_get这两个函数去获取SOC和BLE的事件,并解析、处理。
我的框架中已经对这一块进行了封装,把SWI2_IRQHandler被调用与一个消息APP_MSG_SOFTDEVICE_EVENT做了对应。当该中断函数被调用的时候,会往event_loop中加入APP_MSG_SOFTDEVICE_EVENT这个消息,主线程轮询event_loop后会相应调用handleSoftDeviceEvent,在这里去调用sd_evt_get和sd_ble_evt_get,然后处理SOV和BLE的各种事件。到这一块以后其实就可以使用官方的代码了。我的建议是封装一个统一处理BLE事件的函数,例如叫 BLE_HandleEvents(ble_evt_t *event),放在整个BLE模块对外的.h文件中,然后在app.c的handleSoftDeviceEvent函数中调用。
进一步优化:
但是BLE的应用层代码仍然十分复杂。例如现在有个蓝牙断开的事件,按照上面的流程处理,最后会发现在一个嵌套了多层的子函数中才发现这是一个蓝牙断开的事件;又或者是收到了一个蓝牙数据包,最后解析出来是一个自定义的命令,那么要解析出这个结果应该比蓝牙断开还要多一层的逻辑。假如我们希望在这些事件发生的时候分别去做一些工作,直接在这些子函数中处理会对框架造成很大破坏。
解决的方法就是把这些事件继续封装成Message并在发生的时候放入event_loop中,然后对应的在app.c中添加handle函数进行统一处理。
最后祝好运 :) |