2017-04-13 18 views
0

在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(如屏幕截圖所示)。

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位的彙編操作。看起來好像一切都好。有兩個32位移動寄存器,然後一個64位寫入。但它畢竟是錯誤的位置。 – anyone

+0

工會演員在一開始就失敗了使用工會的目的。使用:'CANIF_mob_get_ptr_data(ACTIVECHANNEL,0) - > data.u64 = msg;' - 不是一個解決方案,只是一個評論。 – Clifford

回答

0

在行:

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

CANIF_mob_get_ptr_data是產生一個結構指針的宏,根據documentation所定義:

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

反過來宏CANIF_get_ram_add是返回一個宏包含在CAN接口寄存器中的地址CANRAMB

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

因此,如果AVR32_CANIF_CANRAMB先前未被初始化或不正確初始化,則返回的指針CANIF_mob_get_ptr_data將無效,並且後續分配將失敗。

即使解析地址是無效的,在沒有任何類型的硬件內存保護的情況下,這種訪問的典型效果是「包裝」地址,以便它解析爲非確定性實際地址 - 所以破壞無關的記憶。