BLE系统架构
// OSAL_SimpleBLEPeripheral.c
const pTaskEventHandlerFn tasksArr[] =
{
LL_ProcessEvent, // task 0
HAL_ProcessEvent,
HCI_ProcessEvent,
#if defined(OSAL_CBTIMER_NUM_TASKS)
OSAL_CBITMER_PROCESS_EVENT(osal_CbTimerProcessEvent), //task 3
#endif
L2CAP_ProcessEvent,
GAP_ProcessEvent, // task5
// ...
}
const uint8 tasksCnt = sizeof(tasksArr)/ sizeof(tasksArr[0]); // 任务个数
uint16 * tasksEvents; //指针的首地址
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 ++); // taskID 任务ID,ID越小,优先级越高
Hal_Init(taskID ++);
HCI_Init(taskID ++);
osal_start_system();
return 0;
}
//OASL.c
void osal_start_system(void)
{
#if !defined (ZBIT) && !defined(UBIT)
for(;;)
#endif
{
osal_run_system();
}
}
void osal_run_system(void)
{
uint8 idx = 0;
#ifndef HAL_BOARD_CC2538
osalTimeUpdate(); // 定时器更新
#endif
Hal_ProcessPoll(); // Hal层信息处理
do
{
if(tasksEvents[idx])
{
break;
}
}while( ++idx < tasksCnt); //检查每个任务是否有事件
if(idx < tasksCnt) // 有事件发生
{
uint16 events;
halIntState_t intState;
HAL_ENTER_CRITICAL_SECTION(intState); // 进入临界区
events = tasksEvents[idx]; // 保存任务事件标志
tasksEvents[idx] = 0; // 清除时间标志
HAL_EXIT_CRITCAL_SECTION(intState); // 退出临界区
activeTaskID = idx; // 保存任务事件ID号
events = (tasksArr[idx])(idx, events); // 执行事件处理函数
activeTaskID = TASK_NO_TASK; // 清除保存的任务事件ID号
HAL_ENTER_CRITICAL_SECTION(intState);
tasksEvents[idx] |= events;
HAL_EXIT_CRITICAL_SECTION(intState);
}
#if defined(POWER_SAVING) // 开启低功耗,没有事件发生,进入该函数
else
{
osal_pwrmgr_powerconserve();
}
}
// OSAL.h
typedef struct
{
void *next;
uint16 len;
uint8 dest_id;
}osal_msg_har_t; // 消息结构
OSAL启动流程
OSAL工作原理
事件表和函数表
OSAL层API接口
消息管理,任务同步,时间管理,中断管理,任务管理,内存管理,电源管理,非易失性内存管理
消息管理 API
/*
* 函数原型 uint8 *osal_msg_allocate(uint16 len)
* 功能描述 为消息分配缓存空间
*/
osal_msg_allocate();
/*
* 函数原型 uint8 osal_msg_deallocate(uint8 *msg_ptr)
* 功能描述 释放消息的缓存空间
*/
osal_msg_deallocate();
/*
* 函数原型 uint8 osal_msg_send(uint8 des tination_task, uint8 *msg_ptr)
* 功能描述 一个任务发送消息的消息队列
*/
osal_msg_send();
/*
* 函数原型 uint8 *osal_msg_receive(uint8 task_id)
* 功能描述 一个任务从消息队列接收属于自己的消息
*/
osal_msg_receive();
任务同步 API
/*
* 函数原型 uint8 osal_set_event(uint8 task_id,uint16 event_flag)
* 功能描述 运行一个任务设置某一事件
*/
osal_set_event();
时间管理 API
/*
* 函数原型 uint8 osal_start_timerEx(uint8 task_id,uint16 event_id,uint16 timeout_value)
* 功能描述 设置个定时时间,定时时间到后,相应的事件被设置
*/
osal_start_timerEx();
/*
* 函数原型 uint8 osal_stop_timerEx(uint8 task_id,uint16 event_id)
* 功能描述 停止一级启动的定时器
*/
osal_stop_timerEx();
任务管理API
/*
* 函数原型 uint8 osal_init_system(void)
* 功能描述 初始化 OSAL, 该函数是第一个被调用的OSAL函数
*/
osal_init_system();
/*
* 函数原型
* 功能描述 该函数包含一个无限循环,它将查询所有的任务事件,如果有事件发生,则执行相应的操作
*/
osal_start_system();
内存管理 API
/*
* 函数原型 void *osal_mem_alloc(uint16 size);
* 功能描述 在堆上分配指定大小的缓冲区
*/
osal_mem_alloc();
/*
* 函数原型 void osal_mem_free(void *ptr)
* 功能描述 释放使用 osal_mem_allc() 分配的缓冲区
*/
osal_mem_free();
非易失性闪存管理
/*
* 函数原型 byte osal_nv_item_init(uint16 id, uint16 len, void *buf);
* 功能描述 初始化 NV 条目,该函数检查是否存在 NV 条目,如果不存在,将创建并初始化该条目
* 如果条目存在,每次调用osal_nv_read(),write() 进行读写之前,都要先调用该函数
*/
osal_nv_item_init();
/*
* 函数原型 byte osal_nv_read(uint16 id, uint16 offset,uint16, void *buf);
* 功能描述 从 NV 条目中读取数据,可以读取整个条目的数据,也可以读取部分数据
*/
osal_nv_read();
/*
* 函数原型 byte osal_nv_write(uint16 id,uint16 offset, uint 16len,void *buf);
* 功能描述 写数据到 NV 条目
*/
osal_nv_write();