Re: gcc 4.6.1 messes up code ?? why

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

Do you use 'volatile' type qualifier to prevent undesirable
transformations of FPGA registers reading code?

BR
Ilya

2011/8/1 andy_code <andy_code@xxxxxxxxxx>:
>
> hi,
>
> I have a function I wrote that part of a keypad reading interrupt for an
> embbed os we have written for coldfire processors
> in this function the code reads an FPGA that controls the interrupt, it
> should only read it once any more and
> it would confuse the FPGA.
>
> here is the original function
>
> void keypad_isr(void)
> {
>    /*  read a character from the key buffer */
>    FPGA_UART_DATA              *ptr;
>    FPGA_UART_DATA              kpd;
>    int                                 g;
>    int                                 n;
>    KEYBUFFER                   *kb;
>    char                                ch;
>
>    kb  = &key_buffer;
>    asm(" halt");          /* just for debugging */
>    ptr = FPGA_UART;   /* make a pointer to the FPGA register */
>    // read upto 8 keys from the keypad
>    for( n = 0; n < 8 ; n++ )
>    {
>        kpd     = *ptr;        /* read from register  (only do this ONCE) */
>        g = kpd.fifo_cnt;
>        if(g == 0)
>            return;
>        ch = (char) kpd.rx_data;
>        kb->status = ch;
>        if( ch != 0 && ch != -1 )
>        {
>            if ( kb->current_location >= MAX_KEY_BUFFERS_SIZE-1 )
>            {
>                kb->current_location = MAX_KEY_BUFFERS_SIZE-1;
>            }
>            kb->key_buff[kb->current_location] = ch;
>            kb->current_location++;
>        }
>    }
> }
>
> ok now here is my problem, gcc does not use an address register for the
> pointer, and it insists on reading the FPGA directly twice ????
> here is generated assembly from gcc.
>
> keypad_isr:
>        lea (-12,%sp),%sp
>        movem.l #1036,(%sp)
>        move.w -1073741664,%d0         <<<--- should use %a0 surely
>        clr.l %d1
>        move.w %d0,%d1                    <<< --- theres the read
>        moveq #13,%d2
>        lsr.l %d2,%d1
>        tst.b %d1
>        jeq .L3
>        moveq #8,%d1
>        lea key_buffer+33,%a1
>        lea key_buffer,%a0
>        lea key_buffer+1,%a2
>        jra .L5
> .L8:
>        move.w -1073741664,%d0       <<< --- look its done it again ?????
>        clr.l %d2
>        move.w %d0,%d2                  <<< --- ARRRGGGgg its knackered my FPGA
>        moveq #13,%d3
>        lsr.l %d3,%d2
>        tst.b %d2
>        jeq .L3
> .L5:
>        move.b %d0,%d2
>        move.b %d0,(%a1)
>        move.l %d2,%d0
>        addq.l #1,%d0
>        and.l #255,%d0
>        moveq #1,%d3
>        cmp.l %d0,%d3
>        jcc .L6
>        clr.l %d0
>        move.b (%a0),%d0
>        move.b #30,%d3
>        cmp.l %d0,%d3
>        jcc .L7
>        move.b #31,(%a0)
> .L7:
>        move.b (%a0),%d0
>        clr.l %d3
>        move.b %d0,%d3
>        move.b %d2,(%a2,%d3.l)
>        addq.l #1,%d0
>        move.b %d0,(%a0)
> .L6:
>        subq.l #1,%d1
>        jne .L8
> .L3:
>        movem.l (%sp),#1036
>        lea (12,%sp),%sp
>        rts
>
> ok how do i stop this happening, thats not the code I wrote.
> please help, I is tearing my hair out
>
> thank you
> --
> View this message in context: http://old.nabble.com/gcc-4.6.1-messes-up-code----why-tp32169196p32169196.html
> Sent from the gcc - Help mailing list archive at Nabble.com.
>
>



[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux