Eric,

Thanks for getting back to me...

I am aware that calling application space routines during a
application-flash erase operation isn't the best idea. I obviously tried
several other combinations including ones without any app-space calls
(libc or other). Nothing seems to work. Even a plain
boot_page_erase(i<<8) within a loop.

Has anyone succesfully used flash programming routines on a atmega644?

Thanks.


Pat


-----Original Message-----
From: [EMAIL PROTECTED]
[mailto:[EMAIL PROTECTED] On
Behalf Of Eric Weddington
Sent: August 20, 2007 10:09 PM
To: Patrick Mahoney; [email protected]
Subject: RE: [avr-libc-dev] Problem writing to flash - atmega644



> -----Original Message-----
> From:
> [EMAIL PROTECTED]
> [mailto:[EMAIL PROTECTED]
> org] On Behalf Of Patrick Mahoney
> Sent: Monday, August 20, 2007 4:01 PM
> To: [email protected]
> Subject: [avr-libc-dev] Problem writing to flash - atmega644
>
> Greetings,
>
> My setup is the following:
>       - Atmega644 uC.
>       - avr-libc 1.6
>       - gcc 4.2.0
>
> I am having an issue trying to have a bootloader write to flash.
>
> I am using the boot_program_page routine taken 'verbatim' from the
> avrlibc docs:
> http://www.nongnu.org/avr-libc/user-manual/group__avr__boot.ht
> ml#g7249d1
> 2e06789cd306583abf7def8176
>
> I would expect the following code to blank all of flash. Yet
> it doesn't
> happen, since the routine completes and returns as if nothing had
> happened. The application runs perfectly after reset/reboot.
>
> --------------------
>
> void  __attribute__((section (".bootloader"))) CopyMemory(void){
>
>     int i;
>     char buffer[ 256 ];
>
>     memset( buffer , '\0' , 256 );
>     for( i=0 ; i<256 ; i++ ){
>         boot_program_page( i , buffer );
>     }
>
>     printf("GET_LOW_FUSE_BITS = %x \r\n " ,boot_lock_fuse_bits_get(
> GET_LOW_FUSE_BITS ) );
>     printf("GET_LOCK_BITS = %x \r\n ", boot_lock_fuse_bits_get(
> GET_LOCK_BITS ) );
>     printf("GET_EXTENDED_FUSE_BITS = %x \r\n ",
> boot_lock_fuse_bits_get(
> GET_EXTENDED_FUSE_BITS ) );
>     printf("GET_HIGH_FUSE_BITS = %x \r\n ", boot_lock_fuse_bits_get(
> GET_HIGH_FUSE_BITS ) );
>

I believe this is in the docs (I don't have access to them at the
moment)
but you should NEVER call library routines from your bootloader. This
means
memset, and printf. Those library routines will be in your application
space
that you are probably trying to overwrite...

Eric Weddington




_______________________________________________
AVR-libc-dev mailing list
[email protected]
http://lists.nongnu.org/mailman/listinfo/avr-libc-dev


_______________________________________________
AVR-libc-dev mailing list
[email protected]
http://lists.nongnu.org/mailman/listinfo/avr-libc-dev

Reply via email to