AVRGCC wskazniki a dodatkowy flash

May 25, 2004 6 Replies

Witam, mam zewnetrzna pamiec flash AT45B011 (SPI) chcialbym w programie stworzyc zmienne oraz wskazniki odwolujace sie do danych zawartych w tej pamieci. Czy da sie to jakos zrobic tak jak w przypadku eeprom??? Mam nawet stworzone przez siebie odpowiednie procedury identyczne z tymi do obslugi eeprom'u. Wartosc wskaznika jest odpowiednio dekodowana na adres wewnetrzny strony i buffora .....



Czy ponizsza definicja wymaga jakis zabiegow w pliku make ????



#define FLASH_SECTION __attribute__ ((section(".flash"))) const u08 FlashData[100] FLASH_SECTION;


Chyba trzeba jakos zdefiniowac linkerowi gdzie jest sekcja .flash. Niekoniecznie musi to byc w make'u, mozna podac do linkera dodatkowy plik z instrukcjami.

Krzysiek Rudnik

tylko jak to zrobic???

Co prawda to jest m68k ale sadze ze linker wiele sie nie rozni:

/* najpierw deklaracja jak mamy podzielona pamiec */ MEMORY { /* najpierw flash - podzielony na rozne obszary */ sflash : org = 0x02000000, len = 0x001000 /* zarezerwowane 16MB by mozna bylo wlaczyc cache */ /* odszar ramu dzielimy na kawalki */ sdata : org = 0x02000000, len = 0x001000 stack : org = 0x02001000, len = 0x37F000 /* potem od 0x40000000 dodatkowa, pamiec DRAM max 256+256 MB (min 16MB) */ /* (pierwsze 0x1000 zarezerwowane dla boota ) */ /* pelna, szybka 32 bitowa DRAM */ /* automatycznie okreslamy jej wielkosc daje tutaj max */

ram : org = 0x40000000, len = 0xFF0000 }

/* potem przydzielany kolejne sekcje programu do odpowiednich obszarow pamieci */ SECTIONS { .text : { *(.text) . = ALIGN (16);

*(.eh_frame) . = ALIGN (16); *(.gnu.linkonce.t.*) *(.gnu.linkonce.r.*)

. = ALIGN(0x4); __CTOR_LIST__ = .; ___CTOR_LIST__ = .; LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2) *(.ctors) LONG(0) __CTOR_END__ = .; __DTOR_LIST__ = .; ___DTOR_LIST__ = .; LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2) *(.dtors) LONG(0) __DTOR_END__ = .; *(.rodata) *(.gcc_except_table)

. = ALIGN(0x2); __INIT_SECTION__ = . ; LONG (0x4e560000) /* linkw %fp,#0 */ *(.init) SHORT (0x4e5e) /* unlk %fp */ SHORT (0x4e75) /* rts */

__FINI_SECTION__ = . ; LONG (0x4e560000) /* linkw %fp,#0 */ *(.fini) SHORT (0x4e5e) /* unlk %fp */ SHORT (0x4e75) /* rts */

*(.lit) . = ALIGN(16); _etext = .; etext = .; } > flash

.data : { __DATA_RAM = .; __DATA_ROM = .; copy_start = .; *(.shdata) *(.data) *(.gnu.linkonce.d.*) . = ALIGN (16); _edata = .; copy_end = .; __DATA_END = .; } > ram

.bss : { . = ALIGN(0x4); __BSS_START = .; __bss_start = . ; *(.shbss) *(.bss) *(COMMON) _end = ALIGN (0x8); __end = _end; __BSS_END = .; } > ram

.stab 0 (NOLOAD) : { *(.stab) }

.stabstr 0 (NOLOAD) : { *(.stabstr) } /* DWARF debug sections. Symbols in the DWARF debugging sections are relative to the beginning of the section so we begin them at 0. */ /* DWARF 1 */ .debug 0 : { *(.debug) } .line 0 : { *(.line) } /* GNU DWARF 1 extensions */ .debug_srcinfo 0 : { *(.debug_srcinfo) } .debug_sfnames 0 : { *(.debug_sfnames) } /* DWARF 1.1 and DWARF 2 */ .debug_aranges 0 : { *(.debug_aranges) } .debug_pubnames 0 : { *(.debug_pubnames) } /* DWARF 2 */ .debug_info 0 : { *(.debug_info) } .debug_abbrev 0 : { *(.debug_abbrev) } .debug_line 0 : { *(.debug_line) } .debug_frame 0 : { *(.debug_frame) } .debug_str 0 : { *(.debug_str) } .debug_loc 0 : { *(.debug_loc) } .debug_macinfo 0 : { *(.debug_macinfo) } /* SGI/MIPS DWARF 2 extensions */ .debug_weaknames 0 : { *(.debug_weaknames) } .debug_funcnames 0 : { *(.debug_funcnames) } .debug_typenames 0 : { *(.debug_typenames) } .debug_varnames 0 : { *(.debug_varnames) } /* These must appear regardless of . */

}

/* definicje stalych adresow */ RAM2 = 0x02001000; PORTIO = 0x50000000;

To wyzej zapisac w pliku txt i dac ten plik jako argument do linkera z kluczem -T.

Krzysiek Rudnik

W artykule <c8vk9r$6mv$ snipped-for-privacy@atlantis.news.tpi.pl> autorem którego mieni się Paweł Kurzawa, napisano:

[...]

Można inicjować takie stałe w programie, a w makefile'u wygenerować obraz binarny sekcji .flash do zapisania w pamięci - analogicznie jak w przypadku .eeprom (wywołanie objcopy).

BTW adresy danych w AVRGCC są 16-bitowe:

const u08 OverFFFF[100]; // Adres powyżej 0xFFFF void go( const u08 *data ); // Przykładowa funkcja

go( FlashData ); // OK go( OverFFFF ); // go dostanie zły adres

to juz mam zrobione.

ale adresowanie flasha w 128ce jest 32 bitowe to jak to w koncu jest?

a jak funkcja bedzie wygladac tak: void go( const void *data ); go( OverFFFF );

W artykule <c94hvb$jhb$ snipped-for-privacy@nemesis.news.tpi.pl> autorem którego mieni się Paweł Kurzawa, napisano:

Są funkcje do odczytu flasha, które przyjmują adres 32-bitowy, jednak trzeba sobie go wypracować samodzielnie.

Dalej to samo. Adres jest daną 16-bitową ze znakiem (co widać przy próbie rzutowania jej na long).

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required