HARDFAULTS从阅读/写作到未对齐的地址?

14个帖子/ 0新
最后一篇
布莱恩
离线
最后一次露面:6年4个月前
专家 掌握
加入:2014-10-16 18:10
HARDFAULTS从阅读/写作到未对齐的地址?

我注意到,Cortex Generic用户指南指出硬盘可以出现如下:

一个尝试的加载或存储到未对齐的地址

这对DA14580是真的吗?如果是这样,被认为对齐的是什么?8位?16位?32位?

如果有一个有16位对齐,我需要小心如何定义结构或者编译器适用于我吗?

如何使用编译器无法保护的c - 代码来调用此类错误?memcpy,指针?

py_dialog.
离线
最后一次露面:2年12个月前
职员
加入:2014-08-25 09:59
嗨Brian,

嗨Brian,

我认为如果您使用了C代码,则不应对齐问题,因为C编译器将进行更正。如果您不需要进行对齐,但不应导致内存问题可能会有笨拙。

问候!
PY

布莱恩
离线
最后一次露面:6年4个月前
专家 掌握
加入:2014-10-16 18:10
但我可以一直导致

但是,我可以通过删除已解释和实现(但未使用)的结构中的一个元素来始终如一地引起错误。故障由Strs指令触发。该地图显示,结构(MDS_DATA)位于某些ARCH_MAIN代码之前,如下所示:

RWIP_RF 0x0008071C数据0 rom_symdef.txt绝对
mds_data 0x00080768数据248 app.o(.bss)
CS_AREA $$基础0x00080860号0 ARCH_MAIN.O(CS_AREA)
CS_Table 0x00080860数据546 Arch_main.o(cs_area)

使用该结构的未使用元素将触发STRH指令的错误。有趣的是,我没有执行访问(Arch_Main之外)的代码。我可以在Arch_main中放置一个断裂点,而循环和步骤通过该循环,但应用程序代码中通常最热门的位置(app_init(app.cit)从未被命中。出现硬故障之前,最多可能需要10秒左右。

vesan.
离线
最后一次露面:5年8个月前
格鲁鲁 掌握
加入:2014-06-26 08:49
你好Brian,

你好Brian,

你能共享结构定义吗?

布莱恩
离线
最后一次露面:6年4个月前
专家 掌握
加入:2014-10-16 18:10
是这里

是这里
struct mds_data_tag.
{
unsigned char systemid [8];
unsigned char mapryername [32];
unsigned char modelnumber [32];
unsigned char serialnumber [32];
unsigned char firmwarerevision [32];
unsigned char hardwarerevision [32];
unsigned char softwarerevision [32];
unsigned char pnpid [8];
无符号Char ContinuamaJorversion;
无符号Char Continuaminorversion;
unsigned char numberofcertications;
无符号短*证书;
unsigned short regstatus;
未签名的Char Batteryvel;
无符号char longeoftimedata;
unsigned char agentcurrentime [8];
毫无符号的长度;
未签名的短时间;
unsigned char ahdcurrenttimtimtime [8];
毫无符号短期疾病;
unsigned short ahdtimesyncmethod;
};

仅在代码中仅使用STRUCT开始时的字符串。但是,我从未到达app_init(),以便是一个实用的点。通过在char pnpid [8]之后删除某些元素并保留一组“字符串”来生成错误。导致行为的示例是

struct mds_data_tag.
{
unsigned char systemid [8];
unsigned char mapryername [32];
unsigned char modelnumber [32];
unsigned char serialnumber [32];
unsigned char firmwarerevision [32];
unsigned char hardwarerevision [32];
unsigned char softwarerevision [32];
unsigned char pnpid [8];
无符号Char ContinuamaJorversion;
};

GCBlair.
离线
最后一次露面:4年11个月前
掌握
加入:2014-09-08 10:21
布莱恩,

布莱恩,

我会有兴趣听到你是否找到了这个解决方案。这一周似乎对话有点慢

布莱恩
离线
最后一次露面:6年4个月前
专家 掌握
加入:2014-10-16 18:10
我没有找到解决方案

我还没有找到解决方案,但我发现每当一个在系统关键的东西之前往往有阵列(如系统堆积)时往往会有麻烦(硬断层)。我在地图中看到了这一点。我已经看到了几个阵列案例相当一致。问题可能是我在最高的优化级别运行,并且我的临界在于我必须以优化模式运行的点。如果我可以以这样的方式发挥,即这些阵列不是这些堆或系统数据的其他领域之一,崩溃消失。还有另一个阵列,我们正在使用它在非保留堆大于100字节之前放置的数组。那时我们得到了那个错误。在100字节以100字节,地图显着移动,代码ran。当缓冲区仅在一个区域使用时,我们仍然无法弄清楚它,这很简单。下方是一个没有控制在该细节(......和我不想的情况下的内存中被放置在内存中。

yutaka.
离线
最后一次露面:3年5个月前
加入:2016-08-02 09:29
我们有一些类似的问题。

我们有一些类似的问题。
你有关于这个问题的进展吗?

mt_dialog.
离线
最后一次露面:4个月1日前
职员
加入:2015-06-08 11:34
嗨yutaka,

嗨yutaka,

对Cortex-M0处理器上的未对准访问没有支持。任何尝试执行未对齐的内存访问操作会导致硬故障异常。

以下链接可以找到更多信息。

http://infocenter.arm.com/help/index.jsp?主题= / com.arm.doc.dui0497a / bab ...

谢谢mt_dialog.

yutaka.
离线
最后一次露面:3年5个月前
加入:2016-08-02 09:29
但在我们的情况下

但在我们的产品的情况下,RWIP_Schedule()中发生了硬故障。
是否发生了错误的参数发生了?

mt_dialog.
离线
最后一次露面:4个月1日前
职员
加入:2015-06-08 11:34
嗨yutaka,

嗨yutaka,

有很多原因可能会发生硬断层。

您如何知道在RWIP_SCHEDULE()期间发生的硬故障?您是否检查了PC,在Proccessor Stalls(硬盘处理程序调试实现中)之前的地址对应地图文件中的RWIP_SCHEDULE()函数?您指的是什么参数?RWIP_Schedule()正在安排堆栈或应用程序接收的消息,并调用相应的处理程序,这有点不太可能这是导致HardFault_Handler()发生的函数。

谢谢mt_dialog.

yutaka.
离线
最后一次露面:3年5个月前
加入:2016-08-02 09:29
我检查了一步执行。

我检查了一步执行。
我检查了堆栈内存。
我发现发生了细节的地址。

地址:0x324cc.
LDRH R3,[R1,R3]

R1:0x00000003
R3:0x0003E350.

来自非法地址的CPU负载。

从地图文件。
> KE_QUEUE_EXTRACT 0x00032441拇指代码0 rom_symdef.txt绝对
> ke_queue_insert 0x0003247F thumb代码0 rom_symdef.txt绝对
> ke_task_init 0x0003256D thumb代码0 rom_symdef.txt绝对

地址(0x324cc)在Ke_queue_insert中。
ke_queue_insert是否使用了哪个参数?
我可以替换这种功能进行调试吗?

附件:
yutaka.
离线
最后一次露面:3年5个月前
加入:2016-08-02 09:29
我分析了堆栈内存。

我分析了堆栈内存。
地址(0x324cc)不是ke_queue_insert。
可能是此地址是ke_task_handler_get的子例程。

堆栈内存
00000000 R0.
00000003 R1
00007C6A R2.
0003E350 R3
00081004 R12
0003274D LR.
000324CC
01000000
20006378 R4.
0003274D LR KE_TASK_HANDLER_GET.
00000000
00000000 R0.
00000000 R1
000817A8 R4.
00000000 R5.
50000020 R6.
00000004 R7.
200055f3 lr patched_gapm_adv_op_sanity.
000805E4 R4
00000000 R5.
50000020 R6.
00032181 LR KE_EVENT_SCHEDULE.
50000000 R4.
00032DD9 LR RWIP_Schedule.
50000000 R4.
20000671 lr main_func.
00000000
00000000
20006B1C.
20005C01.

备注(来自地图文件)
KE_EVENT_SCHEDULE 0x0003213D thumb代码0 rom_symdef.txt绝对
ke_task_handler_get 0x000326EB Thumb代码0 rom_symdef.txt绝对
Rwip_schedule 0x00032DC9拇指代码0 ROM_SYMDEF.txt绝对
main_func 0x2000058b thumb代码592 arch_main.o(.text)

mt_dialog.
离线
最后一次露面:4个月1日前
职员
加入:2015-06-08 11:34
嗨yutaka,

嗨yutaka,

我从你上传的图片中看到你一直通过堆栈追踪函数。当在硬盘或NMI中时,SDK存储在两个不同地址中的寄存器的最后值为0x81800和0x81850一个用于硬盘驱动器,另一个用于NMI。从那里,您可以找到代码点击硬盘的地址,而不会努力从堆栈中追踪。现在,据我所知,它追溯到系统不断使用的函数,以便安排事件。最可能发生这种情况的原因是数据损坏,也许是无效的处理程序指针或类似的东西。此外,如果您可以弄清楚发生这种情况时的任何条件,您可以找到导致应用程序中这种行为的原因,尝试查找此错误是否发生在某些特定模式中,或者在应用程序中执行特定操作时发生此错误。

谢谢mt_dialog.