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

在使用蓝牙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函数中对其进行赋值。



你可能感兴趣的:(BLE学习—如何在蓝牙4.0BLE中添加新任务?)