BLE协议栈中事件与消息的概念很容易让人混淆,总体上来说可以这样理解事件与消息的概念:
1)OS依靠事件来决定执行哪个任务
OS具有一个任务事件表依次存储各个任务的事件标志events,每个任务的events对应该事件表中的一项,为16位,OS通过查询事件列表来执行不同的任务。事件列表内存分配:
tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt)
每个任务的事件标志events在事件列表中的顺序与任务号一致,例如taskID为1的任务的events对应事件表中第一项,taskID为2的任务的events对应事件表中第二项。当任务事件标志events中的某位置位时,表示发生了特定事件,在函数osal_run_system()中会执行发生事件的任务。
2)任务在特定事件处理中一般需要获取并处理消息
每个任务除了具有一个16位的events外,还有自己的消息。消息存放在消息池中,消息池头指针:osal_msg_q_t osal_qHead。消息由消息头和消息体组成,消息头结构:
typedef struct
{
void *next; //指向下一条消息
uint16 len; //消息体长度
uint8 dest_id; //任务ID
} osal_msg_hdr_t;
消息体结构(以按键消息为例):
typedef struct
{
osal_event_hdr_t hdr;
uint8 state; // shift
uint8 keys; // keys
} keyChange_t;
其中osal_event_hdr_t hdr为事件头结构:
typedef struct
{
uint8 event;
uint8 status;
} osal_event_hdr_t;
当一个任务有对应的事件发生时,OS会执行该任务,任务判断事件类型并从消息池中提取自己的消息加以处理。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。