AVRGCC wskazniki a dodatkowy flash

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;

Reply to
invalid unparseable
Loading thread data ...

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

Reply to
Krzysztof Rudnik

tylko jak to zrobic???

Reply to
invalid unparseable

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

Reply to
Krzysztof 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

Reply to
JS
Reply to
invalid unparseable

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).

Reply to
JS

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.