Paweł Kurzawa
Guest
Tue May 25, 2004 1:13 pm
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;
--
--
Best regards
K@pW from Poland
kpw(at)qs.pl
http://kpw.qs.pl
UIN: 8017753
GG: 1263183
---------------- end ----------------
Krzysztof Rudnik
Guest
Tue May 25, 2004 3:06 pm
Paweł Kurzawa wrote:
Quote:
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
Paweł Kurzawa
Guest
Tue May 25, 2004 3:45 pm
Quote:
Chyba trzeba jakos zdefiniowac linkerowi gdzie jest
sekcja .flash. Niekoniecznie musi to byc w make'u,
mozna podac do linkera dodatkowy plik z instrukcjami.
tylko jak to zrobic???
--
--
Best regards
K@pW from Poland
kpw(at)qs.pl
http://kpw.qs.pl
UIN: 8017753
GG: 1263183
---------------- end ----------------
Krzysztof Rudnik
Guest
Tue May 25, 2004 4:23 pm
Paweł Kurzawa wrote:
Quote:
Chyba trzeba jakos zdefiniowac linkerowi gdzie jest
sekcja .flash. Niekoniecznie musi to byc w make'u,
mozna podac do linkera dodatkowy plik z instrukcjami.
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
Paweł Kurzawa
Guest
Thu May 27, 2004 10:02 am
Quote:
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).
to juz mam zrobione.
Quote:
BTW adresy danych w AVRGCC są 16-bitowe:
ale adresowanie flasha w 128ce jest 32 bitowe to jak
to w koncu jest?
Quote:
const u08 OverFFFF[100]; // Adres powyżej 0xFFFF
void go( const u08 *data ); // Przykładowa funkcja
a jak funkcja bedzie wygladac tak:
void go( const void *data );
go( OverFFFF );
--
--
Best regards
K@pW from Poland
kpw(at)qs.pl
http://kpw.qs.pl
UIN: 8017753
GG: 1263183
---------------- end ----------------
JS
Guest
Thu May 27, 2004 10:09 am
W artykule <c8vk9r$6mv$1@atlantis.news.tpi.pl>
autorem którego mieni się Paweł Kurzawa, napisano:
Quote:
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???
[...]
Czy ponizsza definicja wymaga jakis zabiegow w pliku make ????
#define FLASH_SECTION __attribute__ ((section(".flash")))
const u08 FlashData[100] FLASH_SECTION;
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
--
Pozdrawiam
Jarosław Szynal
JS
Guest
Fri May 28, 2004 8:17 am
W artykule <c94hvb$jhb$1@nemesis.news.tpi.pl>
autorem którego mieni się Paweł Kurzawa, napisano:
Quote:
BTW adresy danych w AVRGCC są 16-bitowe:
ale adresowanie flasha w 128ce jest 32 bitowe to jak
to w koncu jest?
Są funkcje do odczytu flasha, które przyjmują adres 32-bitowy,
jednak trzeba sobie go wypracować samodzielnie.
Quote:
const u08 OverFFFF[100]; // Adres powyżej 0xFFFF
void go( const u08 *data ); // Przykładowa funkcja
a jak funkcja bedzie wygladac tak:
void go( const void *data );
go( OverFFFF );
Dalej to samo. Adres jest daną 16-bitową ze znakiem
(co widać przy próbie rzutowania jej na long).
--
Pozdrawiam
Jarosław Szynal