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です(スクリーンショット参照)。
これは有用な情報である場合、私は知らない: は、データシートによると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
アセンブリレベルで呼び出しをシングルステップ実行します。ターゲットが64ビット整数をサポートしていますか? – unwind
更新を見て、st.dは64ビットのアセンブリ操作です。それはすべてが大丈夫であるかのように思えます。レジスタには2つの32ビットの動きがあり、次に64ビットの書き込みが1つあります。結局のところ、間違った場所です。 – anyone
ユニオンキャストの種類は、最初のインスタンスでユニオンを使用する目的を無効にします。使用: 'CANIF_mob_get_ptr_data(ACTIVECHANNEL、0) - > data.u64 = msg;' - 解決策ではなく、ただのコメント。 – Clifford