概述
在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解读所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复