电子产业一站式赋能平台

PCB联盟网

搜索
查看: 31|回复: 0
收起左侧

沁恒BLE的TMOS架构

[复制链接]
匿名  发表于 2025-1-7 17:14:00 |阅读模式
TOMS官方文件就介绍了TMOS的两个功能,可能相比较nordic动辄几M的空间来说,沁恒的资源比较紧张,所以实现的方式也进行了简化。一,任务调度

上面是官方TMOS的介绍,了解过RTOS的小伙伴应该了解,任务就是一个个链表,估计沁恒也是建立了一个任务链表,通过不断的循环执行链表里的任务实现调度。

而注册任务是通过下面这个

沁恒的任务可以看成是一个文件夹,一个文件夹里可以处理16个事件,为什么是16个事件?因为事件是一个2个字节的数据类型,2个字节16位。

同样的了解过RTOS的小伙伴都知道,事件都是用过位来实现的,因为位可以进行或和与操作,这样可以同时处理多个事件。比如:0000 0101,就表示SBP_START_DEVICE_EVT
SBP_READ_RSSI_EVT
两个事件有效
另一个原因就是避免一个任务过大,导致蓝牙连接异常,因为沁恒的蓝牙处理也是在任务中的,因为不是可抢占式的,所以单个任务处理时间不能过长。官方文档描述的有点让人迷糊,可能是为了让不了解RTOS的人也可以看的懂,但是我估计不懂RTOS的更迷糊了。源码也不开放,完全不知道什么意思,话说为什么蓝牙协议栈的源码都不开放源码呢?

创建任务函数中的参数就是我们自己要实现的函数,该函数中对各个事件进行处理。

将事件对应的位复位(设为0)。

自己实现的任务函数中对各个事件进行处理。二,任务间传递数据

沁恒定义了一个专用的事件叫消息,并提供了几个对应的函数。自己实现的任务函数中对消息事件进行处理,实现任务间的数据传递。


官方文档的举例:

申请了一个keyChange_t类型的缓冲区,并对缓冲区数据赋值。然后将这个消息发送到registeredKeysTaskID任务。registeredKeysTaskID就是我们上面的Peripheral_ProcessEvent。通过下面这个函数实现跨文件访问。


发送消息的参数中的任务ID是要发送到哪个任务。然后在任务中提取消息事件中的数据。


接收消息的参数中的任务ID是当前接收所在任务的ID,管方的这个例子发送消息的任务和接收消息的任务在同一个任务里。沁恒提供的资料真的很少,只能自己到源码里去领悟了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


联系客服 关注微信 下载APP 返回顶部 返回列表