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 );
- OSAL osal_msg_send解读
- osal_msg_send 以及OSAL消息发送示例
- osal_msg_send 以及OSAL消息发送示例
- osal_msg_send
- 解读OSAL流程
- OSAL(操作系统抽象层)API解读
- OSAL
- OSAL
- osal_msg_send()函数使用
- ZigBee学习之7——OSAL(操作系统抽象层)API解读
- 谈谈OSAL
- OSAL基础知识
- OSAL API
- CC254x--OSAL
- Zstack OSAL详解
- OSAL系统框架专题
- OSAL调度机制
- Zstack OSAL资料汇编
- 外汇CRM系统
- iOS音频篇:使用AVPlayer播放网络音乐
- JAVA的方法
- 嵌入式数据库
- MySQL INNER JOIN关联多张表的写法
- OSAL osal_msg_send解读
- 酷炫轮播广告
- Java 集合Collection与List的详解
- vue项目问题
- python基础
- vue-引入 ElementUI
- Leetcode 337. House Robber III
- HBase相关文章索引(1)
- 网络编程