首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Atmelstudio UC3C AVR32 -框架对象在内存中的错误位置?

Atmelstudio UC3C AVR32 -框架对象在内存中的错误位置?
EN

Stack Overflow用户
提问于 2017-04-13 09:02:50
回答 1查看 53关注 0票数 0

在设置CAN传输过程中,指针正在损坏(从有效的0x00000bd0到超出我RAM范围的0x84520000 )。指针也与CAN活动无关。造成损坏的原因是,union64写在指针的地址上。这个union64属于CANIF对象(来自ASF),在源代码中,损坏发生在这里:

代码语言:javascript
复制
void CAN_SendMsg_KMS(uint64_t msg)
{
    CANIF_mob_get_ptr_data(ACTIVECHANNEL,0)->data = (Union64)msg;
    AVR32_CANIF.channel[ACTIVECHANNEL].mober = 1<<0;
}

我的问题是,为什么“数据”的内存分配在与我的指针相同的地址?,还是这是一个错误的结论?

在下面的屏幕截图中,第一个是在函数执行之前,最后一个是在执行之后。“味精”的含量为0x8452000000000000。被破坏的指针A的内容应该是0x00000bd0,就像崩溃发生之前的情况一样。指针A后面的32位整数是指针B,指针B指向指针A,因此其未损坏的内容为0x00000004 (如屏幕截图所示)。

我不知道这是否是有用的信息:根据数据表,CANIF寄存器位于内存地址0xFFFD1C00。

update:这是破坏指针的程序集级代码:

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

代码语言:javascript
复制
80006AC8  mov R8, -189440        
80006ACC  ld.w R9, R8[8]         
80006ACE  st.d R9[8], R5
EN

回答 1

Stack Overflow用户

发布于 2017-04-13 12:35:58

在队伍中:

代码语言:javascript
复制
CANIF_mob_get_ptr_data(ACTIVECHANNEL,0)->data = (Union64)msg;

CANIF_mob_get_ptr_data是生成结构指针的宏,根据文档定义为:

代码语言:javascript
复制
#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中包含的地址的宏。

代码语言:javascript
复制
#define CANIF_get_ram_add(ch) ( AVR32_CANIF.channel[ch].canramb )

因此,如果AVR32_CANIF_CANRAMB以前没有初始化,或者初始化错误,则CANIF_mob_get_ptr_data返回的指针将无效,随后的赋值将失败。

即使解析的地址无效,在没有任何类型的硬件内存保护的情况下,这种访问的典型效果是“封装”该地址,从而将其解析为一个不确定的实际地址,从而腐蚀无关的内存。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43387873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档