EmbDev.net

Forum: ARM programming with GCC/GNU tools STM32F4 IMPRECISERR, trouble debugging


von SGT J. (rinion)


Rate this post
useful
not useful
First off I did make a Debug Fault Handler, this is what I am getting

r0 = 1200        0x000004B0
r1 = 0           0x00000000
r2 = 1200        0x000004B0
r3 = 1           0x00000001
r12 = 0           0x00000000
lr = 134228401   0x080029B1
pc = 134228410   0x080029BA
psr = 553648128   0x21000000
OST = 536881104   0x200027D0
HFSR = 1073741824  0x40000000
CFSR = 1024        0x00000400 Showing BUSFAULT IMPRECISERR
DFSR = 0           0x00000000
MMFAR = 3758157108  0xE000ED34
BFAR = 3758157112  0xE000ED38
AFSR = 0           0x00000000
PSP = 536881200   0x20002830
SHCSR = 0           0x00000000
FPSCR = 0           0x00000000
MSP = 536898808   0x20006CF8
XPSR = 3           0x00000003
APSR = 0           0x00000000
IPSR = 3           0x00000003
CONTROL = 4           0x00000004
s0 = 67119376    0x04002910
s1 = 536881455   0x2000292F
s2 = 10520       0x00002918
s3 = 536902072   0x200079B8
s4 = 536881440   0x20002920
s5 = 134225495   0x08001E57
s6 = 0           0x00000000
s7 = 0           0x00000000
s8 = 0           0x00000000
s9 = 4294967257  0xFFFFFFD9
s10 = 3256614912  0xC21C0000
s11 = 29245       0x0000723D
s12 = 1200        0x000004B0
s13 = 0           0x00000000
s14 = 1200        0x000004B0
s15 = 0           0x00000000
end = 3735936685  0xDEADDEAD

Below is the thread.  I am using a photocell with this program and it is 
hooked up to the ADC, It works fine when gradual changes occur, but 
throws a fault, when there is a spike or I go to low.  Not sure if I 
went back far enough in the stack from PC to show where things may have 
gone wrong.
Any help would be helpful, and extra info can be provided
[code]0x08002834:   str r0, [r7, #60]       ; 0x3c
1373                }
0x08002836:   ldr r3, [pc, #56]       ; (0x8002870 <processParam+708>)
0x08002838:   mov.w r2, #1
0x0800283c:   str r2, [r3, #0]
1374                case APPDATA_PARAM_TIT:
0x0800283e:   b.n 0x800298c <processParam+992>
1380
0x08002840:   lsls r4, r4, #8
0x08002842:   movs r2, #56    ; 0x38
0x08002844:   lsls r5, r5, #29
0x08002846:   lsrs r6, r1, #32
0x08002848:   lsls r4, r2, #6
0x0800284a:   movs r0, #0
1384                                &u8Status);
0x0800284c:   lsls r4, r0, #5
0x0800284e:   movs r2, #56    ; 0x38
0x08002850:   lsls r0, r2, #6
0x08002852:   movs r0, #0
0x08002854:   lsls r0, r1, #5
0x08002856:   movs r2, #56    ; 0x38
0x08002858:   cmp r2, #29
0x0800285a:   movs r0, #0
0x0800285c:   lsls r4, r1, #5
0x0800285e:   movs r2, #56    ; 0x38
0x08002860:   lsls r0, r2, #5
0x08002862:   movs r2, #56    ; 0x38
1385                        target = XADC_read();
0x08002864:   lsls r4, r2, #5
0x08002866:   movs r2, #56    ; 0x38
0x08002868:   lsls r0, r3, #5
0x0800286a:   movs r2, #56    ; 0x38
0x0800286c:   lsls r4, r3, #5
0x0800286e:   movs r2, #56    ; 0x38
0x08002870:   lsls r0, r4, #5
0x08002872:   movs r2, #56    ; 0x38
0x08002874:   ldr r0, [pc, #648]      ; (0x8002b00 <processParam+1364>)
0x08002876:   bl 0x8000430 <CJ_readColdJunction>
0x0800287a:   mov r3, r0
0x0800287c:   cmp r3, #0
1387                        /* Adjust ADC reading */
0x0800287e:   beq.n 0x80028fe <processParam+850>
0x08002880:   ldr r3, [pc, #636]      ; (0x8002b00 <processParam+1364>)
0x08002882:   ldrh r3, [r3, #0]
0x08002884:   sxth r3, r3
0x08002886:   cmp r3, #0
0x08002888:    ; <UNDEFINED> instruction: 0xf103da01
0x0800288c:   b 0x93c34b0
0x08002890:   addslt r0, r10, #-1946157053    ; 0x8c000003
0x08002894:   mulshi r10, r10, r11
0x08002898:   ldmdahi r11, {r0, r3, r4, r7, r8, r9, r11, lr}
0x0800289c:    ; <UNDEFINED> instruction: 0xf107b21a
0x080028a0:   ldmmi r8, {r0, r1, r2, r3, r4, r8, r9}
0x080028a4:    ; <UNDEFINED> instruction: 0x461a4611
0x080028a8:    ; <UNDEFINED> instruction: 0xff24f000
0x080028ac:   blmi 0x65940bc
0x080028b0:    ; <UNDEFINED> instruction: 0xf005601a
0x080028b4:    ; <UNDEFINED> instruction: 0x4603f9d5
0x080028b8:   blmi 0x64db8ac
0x080028bc:   blvs 0x7e9c930
0x080028c0:   mvnsvs r1, #13828096    ; 0xd30000
0x080028c4:   tsteq pc, #-1073741823  ; 0xc0000001
0x080028c8:   blvs 0x7e54b08
1391                        target /= 32;
0x080028cc:   mov r2, r3
0x080028ce:   bl 0x80032dc <LOOKUP_tableLookUp+40>
0x080028d2:   str r0, [r7, #60]       ; 0x3c
0x080028d4:   ldr r2, [r7, #60]       ; 0x3c
0x080028d6:   mov r3, r2
1392                        BB_SET_BIT(BB_OFFSET_APP_PROCESSPARAM, 8);
0x080028d8:   mov.w r3, r3, lsl #2
0x080028dc:   adds r3, r3, r2
0x080028de:   mov.w r3, r3, lsl #1
1393                    }
0x080028e0:   lsls r3, r0, #13
0x080028e2:   str r3, [r7, #60]       ; 0x3c
0x080028e4:   ldr r3, [r7, #60]       ; 0x3c
1394                    else
0x080028e6:   cmp r3, #0
0x080028e8:   bge.n 0x80028ee <processParam+834>
0x080028ea:   add.w r3, r3, #31
1397                        coldTemp = -9999;
0x080028ee:   mov.w r3, r3, asr #5
0x080028f2:   str r3, [r7, #60]       ; 0x3c
0x080028f4:   ldr r3, [pc, #532]      ; (0x8002b0c <processParam+1376>)
1398                        adjust = -9999;
0x080028f6:   mov.w r2, #1
0x080028fa:   str r2, [r3, #0]
0x080028fc:   b.n 0x800292c <processParam+896>
0x080028fe:   ldrsh.w r3, [r7, #86]   ; 0x56
1400                        BB_SET_BIT(BB_OFFSET_APP_PROCESSPARAM, 9);
0x08002900:   adds r0, #86    ; 0x56
0x08002902:   ldr r2, [pc, #524]      ; (0x8002b10 <processParam+1380>)
0x08002904:   mov.w r1, #0
0x08002908:   strb r1, [r2, r3]
0x0800290a:   ldr r3, [pc, #500]      ; (0x8002b00 <processParam+1364>)
0x0800290c:   movw r2, #55537 ; 0xd8f1
1401                    }
0x08002910:   strh r2, [r3, #0]
0x08002912:   ldr r3, [pc, #500]      ; (0x8002b08 <processParam+1372>)
0x08002914:   ldr r2, [pc, #508]      ; (0x8002b14 <processParam+1384>)
0x08002916:   str r2, [r3, #0]
0x08002918:   ldr r3, [pc, #488]      ; (0x8002b04 <processParam+1368>)
0x0800291a:   ldr r3, [r3, #4]
0x0800291c:   add.w r3, r3, #4
1402        #if 0
0x08002920:   ldr r3, [r3, #0]
0x08002922:   str r3, [r7, #60]       ; 0x3c
0x08002924:   ldr r3, [pc, #496]      ; (0x8002b18 <processParam+1388>)
0x08002926:   mov.w r2, #1
0x0800292a:   str r2, [r3, #0]
0x0800292c:   ldr r3, [pc, #492]      ; (0x8002b1c <processParam+1392>)
0x0800292e:   ldr r3, [r3, #0]
1403                    target = XADC_read();
0x08002930:   ldr r3, [r3, #124]      ; 0x7c
0x08002932:   and.w r3, r3, #4
0x08002936:   cmp r3, #0
0x08002938:   beq.n 0x800296a <processParam+958>
0x0800293a:   ldr r2, [r7, #60]       ; 0x3c
0x0800293c:   mov r3, r2
1405                    /* Adjust ADC reading */
0x0800293e:   mov.w r3, r3, lsl #3
0x08002942:   adds r3, r3, r2
0x08002944:   str r3, [r7, #60]       ; 0x3c
0x08002946:   ldr r3, [r7, #60]       ; 0x3c
0x08002948:   ldr r2, [pc, #468]      ; (0x8002b20 <processParam+1396>)
1406                    target = LOOKUP_tableLookUp(&XADC_typeKDegC, 
target, &u8Status);
0x0800294a:   smull r1, r2, r2, r3
0x0800294e:   mov.w r2, r2, asr #1
0x08002952:   mov.w r3, r3, asr #31
0x08002956:   subs r3, r2, r3
0x08002958:   str r3, [r7, #60]       ; 0x3c
0x0800295a:   ldr r3, [r7, #60]       ; 0x3c
0x0800295c:   add.w r3, r3, #320      ; 0x140
1407                    target *= 10;
0x0800295e:   strb r0, [r4, #14]
0x08002960:   str r3, [r7, #60]       ; 0x3c
0x08002962:   ldr r3, [pc, #448]      ; (0x8002b24 <processParam+1400>)
0x08002964:   mov.w r2, #1
1408                    target /= 32;
0x08002966:   lsls r1, r0, #8
0x08002968:   str r2, [r3, #0]
0x0800296a:   ldr r3, [pc, #444]      ; (0x8002b28 <processParam+1404>)
0x0800296c:   mov.w r2, #1
1410
0x0800296e:   lsls r1, r0, #8
0x08002970:   str r2, [r3, #0]
0x08002972:   b.n 0x800298c <processParam+992>
0x08002974:   ldr r3, [pc, #436]      ; (0x8002b2c <processParam+1408>)
1411                    if (APPDATA_IS_FAHRENHEIT)
0x08002976:   mov.w r2, #1
1415                        target += 320;
0x08002978:   lsls r1, r0, #8
0x0800297a:   str r2, [r3, #0]
0x0800297c:   mov.w r0, #9
1416                        BB_SET_BIT(BB_OFFSET_APP_PROCESSPARAM, 10);
0x08002980:   ldr r1, [pc, #428]      ; (0x8002b30 <processParam+1412>)
0x08002982:   mov.w r2, #5
0x08002986:   bl 0x80e0000 <RTERR_displayErrorId>
0x0800298a:   nop
0x0800298c:   ldrsh.w r4, [r7, #86]   ; 0x56
1417                    }
0x0800298e:   eors r6, r2
1422                {
0x08002990:   ldr r3, [r7, #60]       ; 0x3c
0x08002992:   add.w r3, r3, #5
0x08002996:   ldr r2, [pc, #392]      ; (0x8002b20 <processParam+1396>)
0x08002998:   smull r1, r2, r2, r3
0x0800299c:   mov.w r2, r2, asr #2
0x080029a0:   mov.w r3, r3, asr #31
0x080029a4:   subs r3, r2, r3
0x080029a6:   mov r0, r3
0x080029a8:   ldr r1, [r7, #80]       ; 0x50
0x080029aa:   ldr r2, [r7, #76]       ; 0x4c
0x080029ac:   bl 0x8003284 <limitParam+40>
0x080029b0:   mov r2, r0
0x080029b2:   ldr r3, [pc, #384]      ; (0x8002b34 <processParam+1416>)
0x080029b4:   str.w r2, [r3, r4, lsl #2]
0x080029b8:   ldrb r3, [r7, #7]
0x080029ba:   cmp r3, #1
1427            }/* End of Switch */
0x080029bc:   bne.n 0x80029d0 <processParam+1060>
0x080029be:   ldr r3, [pc, #376]      ; (0x8002b38 <processParam+1420>)
0x080029c0:   ldr r3, [r3, #0]
1429            /* set and limit*/
0x080029c2:   cmp.w r3, #4294967295
0x080029c6:   beq.n 0x80029e0 <processParam+1076>
0x080029c8:   ldr r3, [pc, #364]      ; (0x8002b38 <processParam+1420>)
0x080029ca:   ldr r3, [r3, #0]
1431
0x080029cc:   str r3, [r7, #60]       ; 0x3c
0x080029ce:   b.n 0x80029e0 <processParam+1076>
0x080029d0:   ldr r3, [pc, #356]      ; (0x8002b38 
<processParam+1420>)[/code

von SGT J. (rinion)


Rate this post
useful
not useful
I may have fixed the problem...or at least for now it seems.  Seemed 
only to throw a fault when I got a low signal from ADC.  I increased the 
sampling time, and that seemed to have fixed the issue for now.  Can the 
ADC be thrown off by possible white noise, and cause a IMPRECISERR?

von Dr. Sommer (Guest)


Rate this post
useful
not useful
You are a funny guy, you post a big bunch of disassembled code and 
expect anyone do debug it?! Why don't you post the C code?

The IMPRECISERR has nothing to do with the ADC and is solely caused by 
the  Cortex Core and its bus. Quoting from the ARMv7M Architechture 
Reference Manual (a must-read for Cortex-M4 developers):

BusFault, bus error on data bus, imprecise
Status bit BFSR.IMPRECISERR
Imprecise bus error caused by an explicit memory access. The processor 
does not update the Bus Fault Address Register.

The error is caused by an error in your code which might get triggered 
by certain ADC values.

von SGT J. (rinion)


Rate this post
useful
not useful
LOL,I posted the disassembly, because the IMPRECISERR usually deals with 
a STR somewhere if it was my code.  I would of posted my C code, but 
being RTOS, its not all straight forward.  And I know the ADC has 
nothing to do with the IMPRECISERR, but that is what I was wondering if 
the values maybe throwing it off.

Thanks though for clearing that up. My problem seemed to be an odd one, 
and I was having issues finding similar issues.  So far so good, seems 
by increasing the sampling time, it improved the issue, if not also 
fixed it.

von Dr. Sommer (Guest)


Rate this post
useful
not useful
SGT Jacobs wrote:
> LOL,I posted the disassembly, because the IMPRECISERR usually deals with
> a STR somewhere if it was my code.
Ah yes. But since the "str" is generated from C Code and that is 
generally much more readable, posting that would likely result in more 
helpful answers.
Posting a minimal compilable example in C that shows the problem also 
greatly increases the chances of getting help.

von gggggg (Guest)


Rate this post
useful
not useful
how change it to no-cooldawn or 0 timers skills



str r0, [r10, #56]

writeData(0x256ba4, 0x!!!!!!!!);

Please log in before posting. Registration is free and takes only a minute.
Existing account
Do you have a Google/GoogleMail account? No registration required!
Log in with Google account
No account? Register here.