ZigBeeでのメモリ管理(メモリ空間による血の事件)
このZigbeeのプロジェクトは久しぶりに書きましたが、今はこのプロジェクトに少し慣れていません.多くのことが分かりません.今日は簡単なワイヤレス送信ウィジェットを書くとき、ずっと問題が発生して、プログラムはzstackの中のAFを呼び出します.DataRequest関数、次のようになります.
(uint 8*)adc_valueはデータを送信するアドレスであり、8ビットの符号なしポインタでなければならない.そして、構造体ADC_Valueを悲しそうに書いた.すべてのコードは以下の通りである.
コンパイル後、「the adc_value is used before its value is set」という警告がありましたが、その時も気にしていませんでした.プログラムをボードにダウンロードした後、データ送信は初めて正常で、残りはすべて間違ったデータで、データ値がすべて同じか、プログラムが直接飛んでしまいました.
私は何も考えていないので、憂鬱ですが、問題がどこにあるのか分かりません.その後、問題がどこにあるかを発見した.皆さんは問題がどこにあるか見ていますか?
コード第1行ADC_Value *adc_value;ポインタが1つしか宣言されていませんが、メモリ領域が割り当てられていないため、問題が発生します.Javaで使うのはこの基本的な問題さえ無視しました!これは私がまだ勉強が足りないことを示しています.正しいコードは次のとおりです.
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);
}