EmbDev.net

Forum: ARM programming with GCC/GNU tools Error on While loop


von Lain I. (lain_iwakura)


Rate this post
useful
not useful
Hi there :-)

Im building on a project with the STM32. So using the GCC V 4.3.0
(WinARM_20080331_testing) I got into the following problem:

the usual

while( a <50){
   ++a;
}

works just fine! Then one time I used :

{
   ++a;
}while( a<50 );

of course with much more useful contend, than just incrementing a :-)
The result was: it didn't work. But wait: I debugged it with
Insight/OOCD and it went like this:
# entered loop
# executed statements (like ++a;) (checked with memory watch)
# checked condition (which was true, thus not quitting loop)
# DID NOT EXECUTE LOOP AGAIN ????

I did some research and found out, that the jump-mark, to which he
should jump on re-doing the loop was not the beginning of the loop but
the end, thus executing while for infinity (because the condition was
always true).
I thought "OK may be there was something wrong with my setup" so I tried
this:

made 'test.c' with the following contend (and really nothing else):
-------------------------------------------------------------------
int main(){
  int b=4;
  {
    ++b;
  }while( b<100);
  return b;
}
-------------------------------------------------------------------
below you will find the disambling done with insight. You can see that
the jump-mark ('<main+20>')is pointing to the beginning of 'while' not
the beginning of the loop. The cmd to compile was the following:
'arm-eabi-gcc-4.3.0 -mthumb -mcpu=cortex-m3 -g -c test.c -o test.o'
-------------------------------------------------------------------
  4  int main(){
-  0x0  <main>:    push  {r7}
-  0x2  <main+2>:    sub  sp, #12
-  0x4  <main+4>:    add  r7, sp, #0
  5    int b=4;
-  0x6  <main+6>:    mov.w  r3, #4  ; 0x4
-  0xa  <main+10>:    str  r3, [r7, #4]
  6
  7    {
  8      ++b;
-  0xc  <main+12>:    ldr  r3, [r7, #4]
-  0xe  <main+14>:    add.w  r3, r3, #1  ; 0x1
-  0x12  <main+18>:    str  r3, [r7, #4]
  9    }while( b<100);
-  0x14  <main+20>:    ldr  r3, [r7, #4]
-  0x16  <main+22>:    cmp  r3, #99
-  0x18  <main+24>:    ble.n  0x14 <main+20>
  10
  11    return b;
-  0x1a  <main+26>:    ldr  r3, [r7, #4]
-  0x1c  <main+28>:    mov  r0, r3
-  0x1e  <main+30>:    add.w  r7, r7, #12  ; 0xc
-  0x22  <main+34>:    mov  sp, r7
-  0x24  <main+36>:    pop  {r7}
-  0x26  <main+38>:    bx  lr
-------------------------------------------------------------------

Is this a bug in GCC (I searched the bug list but couldn't find
anything). I cannot imagine that nobody found that before ???
Btw. the sourcery g++ version of GCC did exactly the same.

HELP :-)

von Mhel M. (mhel)


Rate this post
useful
not useful
> made 'test.c' with the following contend (and really nothing else):
> -------------------------------------------------------------------
> int main(){
>   int b=4;
>   {
>     ++b;
>   }while( b<100);
>   return b;
> }


Hi, I'm no expert but I think the syntax for the loop is missing the
'do'.
Maybe you could try a do/while instead.

 do{
    ++b;
  }while( b<100);

von Giovanni D. (gdisirio)


Rate this post
useful
not useful
Lain Iwakura wrote:
> Is this a bug in GCC (I searched the bug list but couldn't find
> anything). I cannot imagine that nobody found that before ???
> Btw. the sourcery g++ version of GCC did exactly the same.
>
> HELP :-)

I think you are missing the "do" part of the while statement. It should
be:

  int b=4;
  do {
    ++b;
  }while( b<100);

regards,
Giovanni
---
ChibiOS/RT http://chibios.sourceforge.net/

von Lain I. (lain_iwakura)


Rate this post
useful
not useful
Cool,

yea right, (see that is what gets u 2 days of Stuck-In-The-Lab work)
lol....

thaks you both

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.