BLE協(xié)議棧中事件與消息的概念很容易讓人混淆,總體上來說可以這樣理解事件與消息的概念: 1)OS依靠事件來決定執(zhí)行哪個任務 OS具有一個任務事件表依次存儲各個任務的事件標志events,每個任務的events對應該事件表中的一項,為16位,OS通過查詢事件列表來執(zhí)行不同的任務。事件列表內(nèi)存分配: tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt) 每個任務的事件標志events在事件列表中的順序與任務號一致,例如taskID為1的任務的events對應事件表中第一項,taskID為2的任務的events對應事件表中第二項。當任務事件標志events中的某位置位時,表示發(fā)生了特定事件,在函數(shù)osal_run_system()中會執(zhí)行發(fā)生事件的任務。 2)任務在特定事件處理中一般需要獲取并處理消息 每個任務除了具有一個16位的events外,還有自己的消息。消息存放在消息池中,消息池頭指針:osal_msg_q_t osal_qHead。消息由消息頭和消息體組成,消息頭結(jié)構(gòu): typedef struct { void *next; //指向下一條消息 uint16 len; //消息體長度 uint8 dest_id; //任務ID } osal_msg_hdr_t; 消息體結(jié)構(gòu)(以按鍵消息為例): typedef struct { osal_event_hdr_t hdr; uint8 state; // shift uint8 keys; // keys } keyChange_t; 其中osal_event_hdr_t hdr為事件頭結(jié)構(gòu): typedef struct { uint8 event; uint8 status; } osal_event_hdr_t; 當一個任務有對應的事件發(fā)生時,OS會執(zhí)行該任務,任務判斷事件類型并從消息池中提取自己的消息加以處理。 |
|