在CAN傳輸的設置過程中,指針被損壞(它從有效的0x00000bd0變爲超出我的RAM範圍的0x84520000)。指針也與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之後的32Bit整數是指針B,指針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位的彙編操作。看起來好像一切都好。有兩個32位移動寄存器,然後一個64位寫入。但它畢竟是錯誤的位置。 – anyone
工會演員在一開始就失敗了使用工會的目的。使用:'CANIF_mob_get_ptr_data(ACTIVECHANNEL,0) - > data.u64 = msg;' - 不是一個解決方案,只是一個評論。 – Clifford