BLE学习—如何在蓝牙4.0BLE中添加新任务?

来源:互联网 发布:mac ssh 客户端 推荐 编辑:程序博客网 时间:2024/06/07 19:14

在使用蓝牙4.0BLE协议栈进行应用程序开发时,如何在应用程序中添加一个新任务

下面结合工程示例SimpleBLEPeripheral来讲解,打开OSAL_SimpleBLEPeripheral.c文件可以找到数组tasksArr[]和函数osalInitTasks()。tasksArr[]数组里存放了所有任务的事件处理函数的地址;osalInitTasks()是OSAL的任务初始化函数,所有任务的初始化工作都在这里面完成,并且自动给每个任务分配一个任务ID。

      要添加新任务,只需要编写两个函数:

(1)新任务的初始化函数;

(2)新任务的事件处理函数。

      将事件处理函数的地址加入tasksArr[]数组,代码如下所示。

const pTaskEventHandlerFn tasksArr[] ={  LL_ProcessEvent,                                                  // task 0  Hal_ProcessEvent,                                                 // task 1  HCI_ProcessEvent,                                                 // task 2#if defined ( OSAL_CBTIMER_NUM_TASKS )  OSAL_CBTIMER_PROCESS_EVENT( osal_CbTimerProcessEvent ),           // task 3#endif  L2CAP_ProcessEvent,                                               // task 4  GAP_ProcessEvent,                                                 // task 5  GATT_ProcessEvent,                                                // task 6  SM_ProcessEvent,                                                  // task 7  GAPRole_ProcessEvent,                                             // task 8  GAPBondMgr_ProcessEvent,                                          // task 9  GATTServApp_ProcessEvent,                                         // task 10  SimpleBLEPeripheral_ProcessEvent                                  // task 11};

     将新任务的初始化函数添加在osalInitTasks()函数的最后,如下代码所示。

void osalInitTasks( void ){  uint8 taskID = 0;  tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt);  osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt));  /* LL Task */  LL_Init( taskID++ );  /* Hal Task */  Hal_Init( taskID++ );  /* HCI Task */  HCI_Init( taskID++ );#if defined ( OSAL_CBTIMER_NUM_TASKS )  /* Callback Timer Tasks */  osal_CbTimerInit( taskID );  taskID += OSAL_CBTIMER_NUM_TASKS;#endif  /* L2CAP Task */  L2CAP_Init( taskID++ );  /* GAP Task */  GAP_Init( taskID++ );  /* GATT Task */  GATT_Init( taskID++ );  /* SM Task */  SM_Init( taskID++ );  /* Profiles */  GAPRole_Init( taskID++ );  GAPBondMgr_Init( taskID++ );  GATTServApp_Init( taskID++ );  /* Application */  SimpleBLEPeripheral_Init( taskID );
}

在此例中,SimpleBLEPeripheral_ProcessEvent函数添加到了函数的末尾,将SimpleBLEPeripheral_Init()函数添加到osalInitTasks()任务初始化函数中。

需要注意两点:

(1)taskArr[]数组里各事件处理函数的排列顺序要与osalInitTasks()函数中调用各任务初始化函数的顺序保持一致,只有这样才能保持一致,只有这样才能保证每个任务的事件处理函数能够接收到正确的任务ID(在osalInitTasks()函数中分配)

(2)为了保证osalInitTasks()函数所分配的任务ID,需要给每一个任务定义一个全局变量来保存这个ID。如在SimpleBLEPeripheral.c中定义了一个全局变量SimpleBLEPeripheral_TaskID,并且SimpleBLEPeripheral_Init函数中对其进行赋值。