学习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)添加:
- 初始化函数:SimpleBLEPeripheral)init(taskID)
- 事件处理函数。 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
网友评论