CC2640蓝牙框架 下载本文

内容发布更新时间 : 2024/12/27 20:46:57星期一 下面是文章的全部内容请认真阅读。

文档描述有五个:

第一个 rtos的简单描述和使用。 第二个 2640的运行方式 第三个 低功耗蓝牙协议

第四个 从机的广播,收发profile。 第五个 主机的查询收发流程。

第一个rtos的简单描述和使用

关于rtos的简单描述:

第一;关于任务的开始。参考以下的一个任务开始:

Task_Params_init(&taskParams); taskParams.stack = sbcTaskStack; ①

taskParams.stackSize = SBC_TASK_STACK_SIZE;② taskParams.priority = SBC_TASK_PRIORITY;③

Task_construct(&sbcTask, SimpleBLECentral_taskFxn, &taskParams, NULL);④ 以上

①就是这个任务的栈空间。栈是用于给该任务一系列函数,子函数分配动态变量用的。他的表现形式就是一个数组。比如:Char sbcTaskStack[SBC_TASK_STACK_SIZE];

②就是代表这个栈允许的全部的局部变量的大小。如果局部变量的申请比实际的允许的空间还要大,那么分分钟就

是一个无解的死机。

③是这个任务的优先权。优先权越高,那么自动占有cpu资源的权限就越高。特别注意的是优先权的资源要及时释放。否则会导致优先权低的任务一直得不到cpu运行的资源。

第二;关于任务的通信与等待。

如果任务没有特别的事情。我们就让他保持沉睡的状态,pend。以下是让他保持沉睡状态的接口:

Queue_empty(appMsgQueue)msg队列的等待。 Semaphore_PendState 信号等待

ICall_wait(ICALL_TIMEOUT_FOREVER); 这个是蓝牙协议栈的接口。实质上里面的是一个信号或者队列

从沉睡状态变成运行状态,需要一个外部任务或者中断服务的信号或者通知。比如: Semaphore_post(sem);致位一个信号 Queue_insert;插入一个消息

还有rtos_timer_delay(2)实现一个软件延时。也可以让当前运行任务释放cpu资源。

2640的运行方式

第一个,是关于gap_role与simple的关系。

Gap_role的作用就是把一些无关紧要,或者我们不需要的蓝牙协议栈的消息,过滤掉。 ICall_wait(ICALL_TIMEOUT_FOREVER);这个是所有的蓝牙消息的发起点。 参考代码:

// Pass event to app 把经过我们洗选的消息发送到app

if (pGapCentralRoleCB && pGapCentralRoleCB->eventCB) {

return (pGapCentralRoleCB->eventCB((gapCentralRoleEvent_t *)pMsg)); }

其中:下面这个就是废掉无用的消息。 if (pMsg && safeToDealloc) {

ICall_freeMsg(pMsg); }

第二个,关于ICall_fetchServiceMsg(&src, &dest, (void **)&pMsg) 与Queue_empty(appMsgQueue) simple应用里面这两个个流程里面的区分。

㈠ICall_fetchServiceMsg(&src, &dest, (void **)&pMsg)实质上就是Gap_role过滤后的一些蓝牙协议栈的消息。以下为案例: if (ICall_fetchServiceMsg(&src, &dest,

(void **)&pMsg) == ICALL_ERRNO_SUCCESS) {

if ((src == ICALL_SERVICE_CLASS_BLE) && (dest == selfEntity)) {

// Process inter-task message

SimpleBLECentral_processStackMsg((ICall_Hdr *)pMsg); }

if (pMsg) {

ICall_freeMsg(pMsg); } }

SimpleBLECentral_processStackMsg((ICall_Hdr *)pMsg)是对蓝牙协议栈的消息进行的分派与响应。按照GAP_MSG_EVENT,GATT_MSG_EVENT ,HCI_GAP_EVENT_EVENT等不一样的消息进行处理。其中在GATT_MSG_EVENT 下面的ATT_HANDLE_VALUE_NOTI,就是主从机通信的重要的信息。GAP_MSG_EVENT里面的GAP_DEVICE_INFO_EVENT对应从机信息,GAP_LINK_ESTABLISHED_EVENT建立连接信息等等。

㈡Queue_empty更多的是在Gap_role里面发送过来的蓝牙协议信息: 一般我们在simple里面先向Gap_role注册一个回b比如: GAPCentralRole_StartDevice(&SimpleBLECentral_roleCB);

Gap_role收到蓝牙信息后,通过回调,通知simple,形成一个有意思的分工。从而产生一系列的消息队列。

if (pGapCentralRoleCB && pGapCentralRoleCB->eventCB) {

return (pGapCentralRoleCB->eventCB((gapCentralRoleEvent_t *)pMsg)); }