基于CC2430/31的Zigbee实践(5)--结构体指针减1问题

本文详细解释了在特定的内存管理框架下,如何通过宏定义访问结构体成员,并阐述了结构体内存布局的设计原理,包括如何分配内存以及如何通过指针操作实现结构体间的正确链接。

1、关于结构体 –1 访问问题
#define OSAL_MSG_ID(msg_ptr) ((osal_msg_hdr_t *) (msg_ptr) - 1)->dest_id
为什么要-1呢?It's a question.
byte OnBoard_SendKeys( byte keys, byte state )调用下面函数
byte osal_msg_send( byte destination_task, byte *msg_ptr )调用下面宏定义
OSAL_MSG_ID( msg_ptr ) = destination_task;

在OnBoard_SendKeys函数中声明
msgPtr = (keyChange_t *)osal_msg_allocate(sizeof(keyChange_t));
这个函数中
hdr = (osal_msg_hdr_t *) osal_mem_alloc( (short)(len + sizeof( osal_msg_hdr_t )) );
这里分配的地址是osal_msg_hdr_t +sizeof(keyChange_t)的大小的结构体。
if ( hdr )
{
hdr->next = NULL;
hdr->len = len;
hdr->dest_id = TASK_NO_TASK;

#if defined( OSAL_TOTAL_MEM )
osal_msg_cnt++;
#endif
return ( (byte *) (hdr + 1) );
}
这里返回的是(byte *) (hdr + 1) ,(hdr+1)指向的是(osal_msg_hdr_t *) 指针结构的下一个也就是跳过了一个osal_msg_hdr_t结构体的大小,并且以byte* 返回,在返回后有将其转为(keyChange_t *)类型,而且在初始化时候大小就是(short)(len + sizeof( osal_msg_hdr_t )) ,len大小正好是sizeof(keyChange_t),sizeof( osal_msg_hdr_t )正好用于分配给hdr = (osal_msg_hdr_t *) 的第一个变量。
typedef struct
{
void *next;
uint16 len;
byte dest_id;
} osal_msg_hdr_t; - hdr
typedef struct
{
osal_event_hdr_t hdr;
byte state; // shift
byte keys; // keys
} keyChange_t; -msgPtr
define OSAL_MSG_ID(msg_ptr) ((osal_msg_hdr_t *) (msg_ptr) - 1)->dest_id


未命名6

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值