ZigBee中內存管理(一個內存空間引發的血案)

    這個Zigbee的項目好久沒有寫了,現在對這個項目有點陌生,好多東西都搞不懂了。今天寫一個簡單的無線發送小程序時,一直出問題,程序調用zstack中的AF_DataRequest函數,如下

AF_DataRequest( &Coor_Addr, &App_epDesc,
                       APP_CLUSTERID_ADC,
                       sizeof(ADC_Value),
                       (uint8 *)adc_value,
                       &AppTransID,
                       AF_DISCV_ROUTE,
                       AF_DEFAULT_RADIUS );

(uint8 *)adc_value爲要發送數據的地址,必須爲8位無符號的指針。然後我就很悲催的寫了一個結構體ADC_Value,全部的代碼如下。

void ADC(void)
  {
  ADC_Value *adc_value;
  adc_value->x=HalAdcRead(HAL_ADC_CHANNEL_0,HAL_ADC_RESOLUTION_12); //計算數值
  adc_value->y=HalAdcRead(HAL_ADC_CHANNEL_1,HAL_ADC_RESOLUTION_12);//計算數值
  adc_value->z=HalAdcRead(HAL_ADC_CHANNEL_4,HAL_ADC_RESOLUTION_12);//計算數值
  AF_DataRequest( &Coor_Addr, &App_epDesc,               //發送數據
                       APP_CLUSTERID_ADC,
                       sizeof(ADC_Value),
                       (uint8 *)adc_value,
                       &AppTransID,
                       AF_DISCV_ROUTE,
                       AF_DEFAULT_RADIUS );
 osal_start_timerEx(AppTaskID,APP_ADC_EVT,5000);   //設置定時器,循環發送
  
}

    編譯後有個警告,“the adc_value is used before its value is set”,當時也沒在意,下載程序到板子上後,數據發送第一次正常,其餘的全部都是錯誤的數據,而且數據值全部一樣,或者程序直接跑飛了。

    我就百思不得其解啊,很鬱悶,但又不知道問題出在哪裏了。後來發現問題出在哪裏了。不知道各位看官看出來問題在哪裏沒?

    代碼第一行ADC_Value *adc_value;只聲明瞭一個指針,卻沒有分配內存空間,導致出現問題。用java用的連這個基本的問題都忽略了!這說明我學習還是不夠用心不夠深入。正確的代碼爲:

void ADC(void)
  {
  ADC_Value *adc_value;
  adc_value=(ADC_Value *)osal_msg_allocate(sizeof(ADC_Value));
  adc_value->x=HalAdcRead(HAL_ADC_CHANNEL_0,HAL_ADC_RESOLUTION_12);
  adc_value->y=HalAdcRead(HAL_ADC_CHANNEL_1,HAL_ADC_RESOLUTION_12);
  adc_value->z=HalAdcRead(HAL_ADC_CHANNEL_4,HAL_ADC_RESOLUTION_12);
  AF_DataRequest( &Coor_Addr, &App_epDesc,
                       APP_CLUSTERID_ADC,
                       sizeof(ADC_Value),
                       (uint8 *)adc_value,
                       &AppTransID,
                       AF_DISCV_ROUTE,
                       AF_DEFAULT_RADIUS );
 osal_msg_deallocate((uint8 *)adc_value);
 osal_start_timerEx(AppTaskID,APP_ADC_EVT,5000);
  
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章