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


  

你可能感兴趣的:(struct,null,byte)