在设置CAN传输期间,指针正在被破坏(它从有效的0x00000bd0变为超出RAM范围的0x84520000)。指针也与CAN活动无关。腐败的原因是,union64被写在指针的地址上。这个union64属于CANIF对象(来自ASF),在源代码中,腐败发生在这里:
void CAN_SendMsg_KMS(uint64_t msg)
{
CANIF_mob_get_ptr_data(ACTIVECHANNEL,0)->data = (Union64)msg;
AVR32_CANIF.channel[ACTIVECHANNEL].mober = 1<<0;
}
我的问题是,为什么&#34;数据&#34;分配在与我的指针相同的地址? 或者这是一个错误的结论?
在以下屏幕截图中,第一个是在执行函数之前,最后一个是在执行之后。内容&#34; msg&#34;是0x8452000000000000。 被破坏的指针A的内容应该是0x00000bd0,就像腐败发生之前一样。 指针A之后的32Bit整数是指针B,指针B指向指针A,因此其未损坏的内容为0x00000004(如屏幕截图所示)。
我不知道这是否是一个有用的信息: 根据数据表,CANIF寄存器位于存储器地址0xFFFD1C00。
更新: 这是破坏指针的汇编级代码:
// CANIF_mob_get_ptr_data(ACTIVECHANNEL,0) - &gt; data =(Union64)msg;
80006AC8 mov R8, -189440
80006ACC ld.w R9, R8[8]
80006ACE st.d R9[8], R5
答案 0 :(得分: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
返回的指针将无效,后续分配将失败。
即使已解析的地址无效,在没有任何硬件内存保护的情况下,这种访问的典型效果是&#34; wrap&#34;该地址使其解析为非确定性的实际地址 - 因此会破坏不相关的内存。