ZigBeeでのメモリ管理(メモリ空間による血の事件)

2398 ワード

この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 );

(uint 8*)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」という警告がありましたが、その時も気にしていませんでした.プログラムをボードにダウンロードした後、データ送信は初めて正常で、残りはすべて間違ったデータで、データ値がすべて同じか、プログラムが直接飛んでしまいました.
私は何も考えていないので、憂鬱ですが、問題がどこにあるのか分かりません.その後、問題がどこにあるかを発見した.皆さんは問題がどこにあるか見ていますか?
コード第1行ADC_Value *adc_value;ポインタが1つしか宣言されていませんが、メモリ領域が割り当てられていないため、問題が発生します.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);
  
}