OSAL之消息管理

本文详细介绍了OSAL中的消息管理机制,包括消息创建、发送、入队列和处理。重点讲解了osal_msg_allocate、osal_msg_send、osal_msg_enqueue_push及其变种函数的使用,以及目标任务如何通过osal_msg_receive获取并处理消息。
摘要由CSDN通过智能技术生成

转载请注明出处,尊重原创;

本文基于蓝牙1.3.2版本


总述:

消息处理机制流程
消息处理机制流程
OSAL中实现对消息管理的功能实现是在osal.cosal.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;

  • 9
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值