2017-04-13 8 views
0

CAN送信のセットアップ中に、ポインタが壊れています(有効な0x00000bd0から0x84520000になり、これがRAMの範囲外になります)。ポインタはCANアクティビティとは無関係です。破損の理由は、ポインタのアドレスにunion64が書き込まれているためです。このunion64は、(ASFから)CANIFオブジェクトに属しているソースコードの腐敗はここに起こる:Atmelstudio UC3C AVR32 - フレームワークオブジェクトがメモリ内の間違った場所にありますか?

void CAN_SendMsg_KMS(uint64_t msg) 
{ 
    CANIF_mob_get_ptr_data(ACTIVECHANNEL,0)->data = (Union64)msg; 
    AVR32_CANIF.channel[ACTIVECHANNEL].mober = 1<<0; 
} 

私の質問は、なぜメモリは、私のポインタと同じアドレスに割り当てられた「データ」のためですか? これは間違った結論ですか?

次のスクリーンショットでは、最初の機能は関数の実行直前で、最後の機能は実行直後です。 msgの内容は0x8452000000000000です。 破損しているポインタAの内容は、破損が発生する前の0x00000bd0である必要があります。 ポインタAがポインタBの後の32Bit整数は、ポインタBがポインタAを指しているため、その破損していない内容は0x00000004です(スクリーンショット参照)。

Memory before corruption

Memory after corruption

これは有用な情報である場合、私は知らない: は、データシートによるとCANIFレジスタはメモリアドレス0xFFFD1C00です。

更新: これはポインタ破損アセンブリレベルのコード:

// CANIF_mob_get_ptr_data(ACTIVECHANNEL、0) - >データ=(Union64)MSGと、ラインで

80006AC8 mov R8, -189440   
80006ACC ld.w R9, R8[8]   
80006ACE st.d R9[8], R5 
+0

アセンブリレベルで呼び出しをシングルステップ実行します。ターゲットが64ビット整数をサポートしていますか? – unwind

+0

更新を見て、st.dは64ビットのアセンブリ操作です。それはすべてが大丈夫であるかのように思えます。レジスタには2つの32ビットの動きがあり、次に64ビットの書き込みが1つあります。結局のところ、間違った場所です。 – anyone

+0

ユニオンキャストの種類は、最初のインスタンスでユニオンを使用する目的を無効にします。使用: 'CANIF_mob_get_ptr_data(ACTIVECHANNEL、0) - > data.u64 = msg;' - 解決策ではなく、ただのコメント。 – Clifford

答えて

0

:次にマクロCANIF_get_ram_addを返すマクロである

#define CANIF_mob_get_ptr_data(ch, mob) ((can_msg_t *)(CANIF_SIZE_OF_CANIF_MSG*mob+CANIF_get_ram_add(ch))) 

CANIF_mob_get_ptr_data(ACTIVECHANNEL,0)->data = (Union64)msg; 

CANIF_mob_get_ptr_dataとしてdocumentationに従って定義され、構造体のポインタを得たマクロですCANインタフェースレジスタに含まれるアドレスCANRAMB

#define CANIF_get_ram_add(ch) (AVR32_CANIF.channel[ch].canramb) 

したがって、AVR32_CANIF_CANRAMBが以前に初期化されていないか、または正しく初期化されていない場合、CANIF_mob_get_ptr_dataによって返されたポインタは無効になり、その後の割り当ては失敗します。

解決されたアドレスが無効であっても、ハードウェアメモリ保護が存在しない場合のそのようなアクセスの典型的な効果は、アドレスを「ラップ」して非確定的な実アドレスに解決することです。無関係なメモリ。

関連する問題