一、TMOS概述
蓝牙为了实现同多个设备相连,实现多功能和多任务,产生了调度问题。虽然软件和协议栈可扩充,但终究最底层的执行部门只有一个。为了实现多事件和多任务切换,需要把事件和任务对应,针对这种应用起了一个TMOS名字操作系统抽象层。
TMOS作为调度核心,BLE协议栈、profile定义、所有的应用都围绕它来实现。TMOS不是传统大家使用的操作系统,而是一个允许软件建立和执行事件的循环。
TMOS不是传统意义上的操作系统,而是一种以 实现多任务为核心的系统资源管理机制。多任务管理方式实际上只有一个任务在运行,但是可以使用任务调度的策略将多个任务进行调度,每个任务占用一定的时间(独占式,执行完当前任务退出,继续查询其他可执行任务),所有的任务通过时间分片的方式处理。

上图是官方提供的文档有关TMOS的截图,从中我们很容易知道,任务有优先级,但这种优先级只是在系统调度的才有意义,高优先级的任务并不能打断低优先级的任务。
任务与事件的关系:从上图中,我们可以得知,事件需要添加到任务链表中,而每个任务最多可添加15个自定义事件。
二、TMOS任务的注册及事件的处理
/**
* @brief register process event callback function
*
* @param eventCb-events callback function
*
* @return 0xFF - error,others-task id
*/
#define TMOS_ProcessEventRegister (( tmosTaskID (*) ( pTaskEventHandlerFn eventCb )) BLE_LIB_JT(19))
centralTaskId = TMOS_ProcessEventRegister( Central_ProcessEvent );
halTaskID = TMOS_ProcessEventRegister(HAL_ProcessEvent);
其中Central_ProcessEvent和HAL_ProcessEvent是事件处理回调函数。另外,对Central来说,还有一个非常重要的协议栈任务,这个任务的回调函数是:centralEventCB。我们开发产品的时候,大多数的工作都围绕着这三个回调函数以及进行。
// Simple BLE Observer Task Events
#define START_DEVICE_EVT 0x0001
#define START_DISCOVERY_EVT 0x0002
#define START_SCAN_EVT 0x0004
#define START_SVC_DISCOVERY_EVT 0x0008
#define START_PARAM_UPDATE_EVT 0x0010
#define START_PHY_UPDATE_EVT 0x0020
#define START_READ_OR_WRITE_EVT 0x0040
#define START_WRITE_CCCD_EVT 0x0080
#define START_READ_RSSI_EVT 0x0100
#define ESTABLISH_LINK_TIMEOUT_EVT 0x0200
以上是Central的任务centralTaskId下定义的事件。
我们启动事件的方式有两种,大家可以根据实际需要决定用哪种启动方式。
1、 立即启动事件
/**
* @brief start a event immediately
*
* @param taskID - task ID of event
* @param event - event value
*
* @return 0 - SUCCESS.
*/
#define tmos_set_event (( bStatus_t (*) ( tmosTaskID taskID, tmosEvents event )) BLE_LIB_JT(7))
tmos_set_event( centralTaskId, START_DEVICE_EVT );
2、延时启动事件
/*

最低0.47元/天 解锁文章
7439

被折叠的 条评论
为什么被折叠?



