基于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


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