OSAL osal_msg_send解读

在onboard.c中 首先调用osal_msg_allocate申请一块内存,内存大小为sizeof(osal_msg_hdr_t)+sizeof(keyChange_t),这里注意的是返回地址是 首地址+sizeof(osal_msg_hdr_t)处的地址,这里长度为sizeof(keyChange_t)的内存分配给keyChange_t类型的msgPtr指针。

==================================
对指针不熟的可以看下面讲解。
比如:假如osal_msg_hdr_t长度为3,keyChange_t长度为2,申请内存地址为 0,1,2,3,4;osal_msg_allocate函数返回地址是3,这里地址转换为keyChange_t类型的。
可以把以下程序拿来仿真

typedef struct
{
    unsigned char nest;
    unsigned char len;
    unsigned char id;
}msg_t;

typedef struct
{
    unsigned char state;
    unsigned char key;
}key_t;

volatile key_t *msg;
unsigned char *msg_all(unsigned char len)
{
    msg_t *hdr;
    hdr = (msg_t*)malloc(len+sizeof(msg_t));
    hdr->id = 1;
    hdr->len = 2;
    hdr->nest = 3;
    return ((unsigned char *)(hdr+1));
}
msg = (key_t*)msg_all(sizeof(key_t));
msg->key = 4;
msg->state = 5;
((msg_t*)(msg)-1)->id = 5;

观察 (unsigned char )msg,(unsigned char )msg+1,(unsigned char )msg-1,(unsigned char )msg-2,(unsigned char *)msg-3的变量。

==================================
在osal_msg_enqueue_push中首先判断指针msg_ptr是否为空,空指针返回。任务ID大于tasksCnt就返回。

if ( OSAL_MSG_NEXT( msg_ptr ) != NULL ||
OSAL_MSG_ID( msg_ptr ) != TASK_NO_TASK )

OSAL_MSG_NEXT( msg_ptr )中这个地址-1就是申请到的内存起始地址。也就是osal_msg_hdr_t 地址。
下面就是分配ID。
调用osal_msg_enqueue( &osal_qHead, msg_ptr );把消息放到链表尾部。osal_msg_enqueue里边主要是一个遍历链表,把消息地址指向链表尾部。

最后设置事件标志位。
osal_set_event( destination_task, SYS_EVENT_MSG );

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值