我是靠谱客的博主 自信棒球,最近开发中收集的这篇文章主要介绍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 );

最后

以上就是自信棒球为你收集整理的OSAL osal_msg_send解读的全部内容,希望文章能够帮你解决OSAL osal_msg_send解读所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部