OSAL osal_msg_send解读

来源:互联网 发布:lcd1602数据口反了 编辑:程序博客网 时间:2024/06/06 23:13

在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 );

原创粉丝点击