转载请注明出处,尊重原创;
本文基于蓝牙1.3.2版本
总述:
消息处理机制流程
OSAL中实现对消息管理的功能实现是在osal.c 与 osal.h 文件中,对于操作系统来说,不可缺少的就是任务之间信息的传递,消息包括:信号量,互斥量,消息邮箱、消息队列等。在OSAL中仅仅实现了消息队列的功能,系统可以发送或接收消息,并对消息进行管理。
背景知识:在OSAL.H文件中
1、定义消息管理的消息首部,所有的消息构成都有它这部分;
typedef struct
{ //用于消息首部
void *next;
uint16 len;
uint8 dest_id;
} osal_msg_hdr_t;
其中next指针将消息组织成有序的链表,len为消息的长度,dest_id是目标任务id。
2、定义管理消息队列的指针类型,从这里也可以看出管理消息队列指针类型是空指针,也说明了消息结构的类型是变化的,不是固定的。
typedef void * osal_msg_q_t;
3、定义几个消息操作的宏
获得下一个消息
#define OSAL_MSG_NEXT(msg_ptr) ((osal_msg_hdr_t *) (msg_ptr) - 1)->next
获得一个消息的消息长度
#define OSAL_MSG_LEN(msg_ptr) ((osal_msg_hdr_t *) (msg_ptr) - 1)->len
获得消息发送的目标任务
#define OSAL_MSG_ID(msg_ptr) ((osal_msg_hdr_t *) (msg_ptr) - 1)->dest_id
下面几个 *(q_ptr)计算,说明必须传过来的是消息链表头指针的地址,
typedef void *osal_msg_q_t;
osal_msg_q_t osal_qHead;//定义的消息头指针
//调用入队列函数osal_msg_enqueue( &osal_qHead, msg_ptr );
//它的定义处是void osal_msg_enqueue( osal_msg_q_t *q_ptr, void *msg_ptr ),这里说明q_ptr是一个二级指针。
初始化一个消息队列,将消息头指针置空
#define OSAL_MSG_Q_INIT(q_ptr) *(q_ptr) = NULL
判断消息队列是否为空
#define OSAL_MSG_Q_EMPTY(q_ptr) (*(q_ptr) == NULL)
获得消息队列头指针
#define OSAL_MSG_Q_HEAD(q_ptr) (*(q_ptr))
4、定义一个管理消息队列的变量用于管理消息队列
osal_msg_q_t osal_qHead;