arm_data在第二次运行我的程序时中止失败,然后



我将我的程序(加载文件并进行一些计算(添加到 TizenRT 的应用程序中ARTIK053。程序可以在第一次成功运行,但第二次运行时会遇到数据中止失败。具体错误信息如下:

arm_dataabort:
Data abort. PC: 040d25a0 DFAR: 00000011 DFSR: 0000080d
up_assert: Assertion failed at file:armv7-r/arm_dataabort.c line: 111 task: ghsom_test
up_dumpstate: Current sp: 020c3eb0
up_dumpstate: User stack:
up_dumpstate:   base: 020c3fd0
up_dumpstate:   size: 00000fd4
up_dumpstate:   used: 00000220
up_dumpstate: User Stack
up_stackdump: 020c3ea0: 00000003 020c3eb0 040c9638 041d38b8 00000000 040c9644 00000011 0000080
.....
.....
up_taskdump: Idle Task: PID=0 Stack Used=1024 of 1024
up_taskdump: hpwork: PID=1 Stack Used=164 of 2028
up_taskdump: lpwork: PID=2 Stack Used=164 of 2028
up_taskdump: logm: PID=3 Stack Used=300 of 2028
up_taskdump: LWIP_TCP/IP: PID=4 Stack Used=228 of 4068
up_taskdump: tash: PID=6 Stack Used=948 of 4076
up_taskdump: ghsom_test: PID=10 Stack Used=616 of 4052

我检查了剩余的可用RAM空间,这对于我的程序来说已经足够了。我在主函数中添加了一些打印信息,以检查错误出现在哪一行。我发现如果我在错误出现的行之前注释了一些行,那么在下次运行程序时,错误行将向下移动几行。似乎我释放了一些堆栈空间。所以我想这可能是与我可以分配给单个进程的堆栈大小相关的问题。有人知道原因,以及如何解决问题吗?值得一提的是,它只第二次发生,然后我运行该程序。

使用堆栈转储,您几乎总是可以找出错误的来源。 由于您有构建的映像文件,因此您可以执行

arm-none-eabi-addr2line -f  -p -i -b build/out/bin/tinyara 0xADDR

其中 ADDR 将是 addr 是堆栈转储中的相关地址之一。 您通常可以检查"当前sp"(堆栈指针(,但它通常指向上述故障中显示的arm_dataabort。

然后,您可以检查 PC 地址,并在堆栈转储(从其背面开始(中查找值类似于 PC 的地址。 在您的情况下,它可以是这样的地址(按该顺序(:040c9644、041d38b8、040c9638 所以基本上:

arm-none-eabi-addr2line -f  -p -i -b build/out/bin/tinyara 0x040c9644

请注意地址前面的 0x。 该命令将为您提供有关此地址在二进制文件中的来源的良好指示,例如:

up_idlepm_static at /home/user/tizenrt/os/arch/arm/src/chip/s5j_idle.c:111
(inlined by) up_idle at /home/user/tizenrt/os/arch/arm/src/chip/s5j_idle.c:254

如果地址未指向代码行,则如下所示:

??  ??:0

希望有帮助

最新更新