BLE OSAL

作者: YuQiao0303 | 来源:发表于2019-03-13 11:31 被阅读0次

学习CC2540 资料5.3

OSAL 就是一种支持多任务运行的系统资源分配机制。

术语

一些术语

说明

task

  • LL,Hal,HCI,GAP等都是task
  • 上面这些都是系统自带的,我们可以自己定义task,例如SimpleBLEPeripheral
  • 每个task有自己的.c 和.h文件
  • 每个task 对应一个taskid
  • 每个task有一个初始化函数,和一个事件处理函数
  • 以SimpleBLEPeripheral 这个用户自定义的task为例
    • 事件处理函数(任务函数):SimpleBLEPeripheral_ProcessEvent( uint8 task_id, uint16 events )
    • 初始化函数:SimpleBLEPeripheral_Init( uint8 task_id )
    • 这两个函数都定义在SimpleBLEPeripheral.c 中
    • 同时,事件处理函数的指针SimpleBLEPeripheral_ProcessEvent注册在OSAL_SimpleBLEPeripheral.c的tasksArr数组中
    • 同时,任务初始化函数SimpleBLEPeripheral_Init()在OSAL_SimpleBLEPeripheral.c的osalInitTasks()中调用。

EVT

  • 每个任务函数中,还可以有很多小EVT,定义在他自己的.h中
  • 例如SimpleBLEPeripheral.h中的SBP_START_DEVICE_EVT 和SBP_PERIODIC_EVT。
  • 对SimpleBLEPeripheral.h中每个EVT的处理的逻辑,都写在SimpleBLEPeripheral_ProcessEvent()中,里面有很多if(events & someEVT),每一组if对应一个EVT

任务task是在哪里注册/声明的:OSAL_SimpleBLEPeripheral.c

OSAL_SimpleBLEPeripheral.c 中有:

数组tasksArr[] 中存放任务函数指针
函数osalInitTasks()调用任务初始化算法并分配一个taskid

tasksArry中存放:所有任务函数指针(函数名)

// The order in this table must be identical to the task initialization calls below in osalInitTask.
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
  SM_ProcessEvent,                                                  // task 6
  GATT_ProcessEvent,                                                // task 7
  GAPRole_ProcessEvent,                                             // task 8
  GAPBondMgr_ProcessEvent,                                          // task 9
  GATTServApp_ProcessEvent,                                         // task 10
  SimpleBLEPeripheral_ProcessEvent                                  // task 11
};

osalInitTasks(): 所有任务初始化函数,并给每个任务分配一个id

/*********************************************************************
 * @fn      osalInitTasks
 *
 * @brief   This function invokes the initialization function for each task.
 *
 * @param   void
 *
 * @return  none
 */
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++ );

  /* SM Task */
  SM_Init( taskID++ );
  
  /* GATT Task */
  GATT_Init( taskID++ );

  /* Profiles */
  GAPRole_Init( taskID++ );
  GAPBondMgr_Init( taskID++ );

  GATTServApp_Init( taskID++ );

  /* Application */
  SimpleBLEPeripheral_Init( taskID );
}

这里除了 SimpleBLEPeripheral_ProcessEvent 和 SimpleBLEPeripheral_Init( taskID );之外,都是系统自带的,我们不用动。

相当于我们要添加一个自定义的新任务,在自己的文件里(SimpleBLEPeripheral)添加:

  1. 初始化函数:SimpleBLEPeripheral)init(taskID)
  2. 事件处理函数。 SimpleBLEPeripheral_ProcessEvent //task11 在这个函数中处理所有自定义的新事件

定义新的小事件EVT

在simpleBLEPeripheral.h 中,define了很多EVT,自己可以添加新的事件
然后在SimpleBLEPeripheral_ProcessEvent()中,对于每一个事件

if (events & 某EVT)
{
  do something ;
  return (events ^ this EVT);
}

启动事件

osal_set_event()函数是事件启动函数
参数1 是需要启动定时器的任务ID
第二个参数是启动的事件ID
调用该函数后会立刻出发启动的事件
运行到SimpleBLEPeripheral_ProcessEvent ()函数时,会接收到该EVT

相关文章

网友评论

      本文标题:BLE OSAL

      本文链接:https://www.haomeiwen.com/subject/mzgapqtx.html