【问题标题】:Atmelstudio UC3C AVR32 - framework objects in wrong place in memory?Atmelstudio UC3C AVR32 - 框架对象在内存中的错误位置?
【发布时间】:2017-04-13 09:02:50
【问题描述】:

在设置 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;
}

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

在下面的截图中,第一个是函数执行之前,最后一个是执行之后。 “msg”的内容是 0x8452000000000000。 损坏的指针 A 的内容应该是 0x00000bd0,因为它是在损坏发生之前。 指针A后面的32Bit整数是指针B,指针B指向指针A,因此其未损坏的内容为0x00000004(如截图所示)。

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

更新: 这是破坏指针的汇编级代码:

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

80006AC8  mov R8, -189440        
80006ACC  ld.w R9, R8[8]         
80006ACE  st.d R9[8], R5

【问题讨论】:

  • 在程序集级别单步调用。您确定您的目标支持 64 位整数吗?
  • 看更新,st.d是64位的汇编操作。似乎一切正常。对寄存器进行两次 32 位移动,然后进行一次 64 位写入。但它毕竟是错误的位置。
  • 联合强制类型违背了首先使用联合的目的。使用:CANIF_mob_get_ptr_data(ACTIVECHANNEL,0)-&gt;data.u64 = msg; - 不是解决方案,只是评论。
  • 在发布的代码片段的上下文中不清楚您在谈论什么指针。 CANIF_mob_get_ptr_data() 是根据另一个 nacro 定义的宏,它根据 CAN I/F 寄存器 (AVR32_CANIF.channel[ch].canramb) 的内容生成地址。祝你调试好运,但它可能依赖于canramb 中的有效值。所以早期的初始化可能有问题。
  • 我不知道AVR32是否有无效地址异常,如果没有,当你写入一个无效地址时,不在地址范围内的高位将被忽略,地址将解析为不确定位置的真实地址。所以我的赌注仍然是返回无效地址的宏,因为 CAN I/F 配置不正确。本质上,错误在您的代码中的其他地方,而不是在您发布的代码中 - 因此无法从给出的信息中获得明确的答案。查看 CAN 寄存器值和任何 canramb 引用。

标签: c pointers atmelstudio atmel-uc3


【解决方案1】:

行内:

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返回的指针将无效,后续的赋值也会失败。

即使解析的地址无效,在没有任何硬件内存保护的情况下,这种访问的典型效果是“包装”地址,使其解析为非确定性的真实地址 - 因此破坏了不相关的记忆。

【讨论】:

    猜你喜欢
    • 2014-11-17
    • 2019-03-21
    • 2011-11-14
    • 1970-01-01
    • 2013-05-17
    • 1970-01-01
    • 2010-11-22
    • 2014-08-24
    • 2020-02-07
    相关资源
    最近更新 更多