gpt4 book ai didi

c - arm cortex m4上的总线错误调试

转载 作者:太空狗 更新时间:2023-10-29 15:41:38 25 4
gpt4 key购买 nike

我正在尝试调试 Arm cortex m4 芯片上的精确总线错误。该板是带有飞思卡尔 MK20DX256VLH7 的微型 3.1。该错误仅在我实际使用 uart 发送字符并导致强制硬故障时发生,因为我没有总线错误和内存错误处理程序。当使用 uart 每秒发送 30 个整数时,在 1 秒到 1 分钟之间的随机时间后发生故障。此外,当我以二进制形式打印值时,不是 uartPutInt() 而是 uartPutBin() 函数,故障不会发生。

我“破解”了 teensy,所以我可以使用 SWD 调试。我使用 arm-none-eabi 工具链 gcc、gdb。

我尝试将筹码量加倍,但这没有用。我尝试了不同的 itoa() 方法,没有帮助。

完整代码可以在这里访问: https://github.com/paulusbrand/tricopter

问题出现在 uartPutInt() 函数中,它不是最漂亮的函数,但我尝试了不同的方法,这个是最容易调试和理解的。

原创:

void uartPutInt(int32_t data) {
char buf[16] = {0};
uint32_t tmpData;
uint8_t neg = 0;
int8_t tmp = 0;

if(data<0) { // check negative
tmpData = -data;
neg=1;
}
else {
tmpData = data;
}

while(tmpData) { // convert to chars
uint8_t num = tmpData % 10;
buf[tmp++]=num+48;
tmpData/=10;
}

if(neg) { // add minus sign
buf[tmp++] = 45;
}

while(tmp>=0) {
uartPutChar(buf[tmp--]);
}
}

新版本:

void uartPutInt(int32_t data) {
char buf[16] = {0};
uint32_t tmpData;
uint8_t neg = 0;
int8_t tmp = 0;

if(data<0) { // check negative
tmpData = -data;
neg=1;
}
else {
tmpData = data;
}

do { // convert te chars
uint8_t num = tmpData % 10;
buf[tmp++]=num+'0';
tmpData/=10;
} while(tmpData);

if(neg) { // add minus sign
buf[tmp++] = '-';
}

while(tmp>0) {
uartPutChar(buf[--tmp]);
}
}

当发生总线错误时,我检查 SCB 中的 CFSR 寄存器,发现精确的总线错误和 BFAR 有效。

BFAR 的值以及有问题的内存地址是 0x01007fd2。据我所知,这是在内存的代码区域,但远远超出了代码的末尾。我不太确定如何处理这个号码。

错误发生时程序计数器PC为0x1033。在 uartPutInt() 函数中。下面拆解。

00000f6c <uartPutInt>:
f6c: b580 push {r7, lr}
f6e: b088 sub sp, #32
f70: af00 add r7, sp, #0
f72: 6078 str r0, [r7, #4]
f74: f107 0308 add.w r3, r7, #8
f78: 2200 movs r2, #0
f7a: 601a str r2, [r3, #0]
f7c: 3304 adds r3, #4
f7e: 2200 movs r2, #0
f80: 601a str r2, [r3, #0]
f82: 3304 adds r3, #4
f84: 2200 movs r2, #0
f86: 601a str r2, [r3, #0]
f88: 3304 adds r3, #4
f8a: 2200 movs r2, #0
f8c: 601a str r2, [r3, #0]
f8e: 3304 adds r3, #4
f90: 2300 movs r3, #0
f92: 76fb strb r3, [r7, #27]
f94: 687b ldr r3, [r7, #4]
f96: 2b00 cmp r3, #0
f98: da05 bge.n fa6 <uartPutInt+0x3a>
f9a: 687b ldr r3, [r7, #4]
f9c: 425b negs r3, r3
f9e: 61fb str r3, [r7, #28]
fa0: 2301 movs r3, #1
fa2: 76fb strb r3, [r7, #27]
fa4: e001 b.n faa <uartPutInt+0x3e>
fa6: 687b ldr r3, [r7, #4]
fa8: 61fb str r3, [r7, #28]
faa: e01f b.n fec <uartPutInt+0x80>
fac: 69f9 ldr r1, [r7, #28]
fae: 4b23 ldr r3, [pc, #140] ; (103c <uartPutInt+0xd0>)
fb0: fba3 2301 umull r2, r3, r3, r1
fb4: 08da lsrs r2, r3, #3
fb6: 4613 mov r3, r2
fb8: 009b lsls r3, r3, #2
fba: 4413 add r3, r2
fbc: 005b lsls r3, r3, #1
fbe: 1aca subs r2, r1, r3
fc0: 4613 mov r3, r2
fc2: 767b strb r3, [r7, #25]
fc4: 7eba ldrb r2, [r7, #26]
fc6: b2d3 uxtb r3, r2
fc8: 3301 adds r3, #1
fca: b2db uxtb r3, r3
fcc: 76bb strb r3, [r7, #26]
fce: b253 sxtb r3, r2
fd0: 7e7a ldrb r2, [r7, #25]
fd2: 3230 adds r2, #48 ; 0x30
fd4: b2d2 uxtb r2, r2
fd6: f107 0120 add.w r1, r7, #32
fda: 440b add r3, r1
fdc: f803 2c18 strb.w r2, [r3, #-24]
fe0: 69fb ldr r3, [r7, #28]
fe2: 4a16 ldr r2, [pc, #88] ; (103c <uartPutInt+0xd0>)
fe4: fba2 2303 umull r2, r3, r2, r3
fe8: 08db lsrs r3, r3, #3
fea: 61fb str r3, [r7, #28]
fec: 69fb ldr r3, [r7, #28]
fee: 2b00 cmp r3, #0
ff0: d1dc bne.n fac <uartPutInt+0x40>
ff2: 7efb ldrb r3, [r7, #27]
ff4: 2b00 cmp r3, #0
ff6: d00b beq.n 1010 <uartPutInt+0xa4>
ff8: 7eba ldrb r2, [r7, #26]
ffa: b2d3 uxtb r3, r2
ffc: 3301 adds r3, #1
ffe: b2db uxtb r3, r3
1000: 76bb strb r3, [r7, #26]
1002: b253 sxtb r3, r2
1004: f107 0220 add.w r2, r7, #32
1008: 4413 add r3, r2
100a: 222d movs r2, #45 ; 0x2d
100c: f803 2c18 strb.w r2, [r3, #-24]
1010: e00d b.n 102e <uartPutInt+0xc2>
1012: 7eba ldrb r2, [r7, #26]
1014: b2d3 uxtb r3, r2
1016: 3b01 subs r3, #1
1018: b2db uxtb r3, r3
101a: 76bb strb r3, [r7, #26]
101c: b253 sxtb r3, r2
101e: f107 0220 add.w r2, r7, #32
1022: 4413 add r3, r2
1024: f813 3c18 ldrb.w r3, [r3, #-24]
1028: 4618 mov r0, r3
102a: f7ff ff87 bl f3c <uartPutChar>
102e: f997 301a ldrsb.w r3, [r7, #26]
1032: 2b00 cmp r3, #0
1034: daed bge.n 1012 <uartPutInt+0xa6>
1036: 3720 adds r7, #32
1038: 46bd mov sp, r7
103a: bd80 pop {r7, pc}
103c: cccccccd stclgt 12, cr12, [ip], {205} ; 0xcd

有人可以帮我解决这个问题吗?

谢谢!

最佳答案

tmp 未初始化:

void uartPutInt(int32_t data) {
char buf[16] = {0};
uint32_t tmpData;
uint8_t neg = 0;
int8_t tmp; // not initialized

if(data<0) { // check negative
tmpData = -data;
neg=1;
}
else {
tmpData = data;
}

while(tmpData) { // convert to chars
uint8_t num = tmpData % 10;

// what's in tmp right now?!?!
buf[tmp++]=num+48;
tmpData/=10;
}

if(neg) { // add minus sign
buf[tmp++] = 45;
}

while(tmp>=0) {
uartPutChar(buf[tmp--]);
}
}

关于c - arm cortex m4上的总线错误调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37828303/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com