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();