-
Data: 2011-07-19 20:39:57
Temat: Skrypt linkera, pamięć zewnętrzna i... problem :(
Od: Konop <k...@g...pl> szukaj wiadomości tego autora
[ pokaż wszystkie nagłówki ]Witam
Piszę program na STM32, kompilator to gcc (CodeSorcery). Mam podłączoną
zewnętrzną pamięć RAM. Chciałbym w niej umieścić kilka zmiennych (duże
bufory), reszta zmiennych ma być w wewnętrznej pamięci RAM.
Próbowałem więc przerobić skrypt linkera (od Freddiego Chopina) tak,
aby uwzględniał tę pamięć zewnętrzną. Zrobiłem to dopisując do MEMORY wpis:
eram (rwx): org = 0x60000000, len = 512k
Dalej oczywiście __eram_start, end itp. Następnie tworzę sekcję .extram:
.extram :
{
. = ALIGN(4);
__eram_start = .;
PROVIDE(__eram_start = __eram_start);
. = ALIGN(4);
*(.extram)
. = ALIGN(4);
__eram_end = .;
PROVIDE(__eram_end = __eram_end);
} > eram AT > eram
Nie znam się za dobrze na skryptach linkera, więc to trochę taka moja
radosna twórczość na podstawie innych sekcji. Ale próbowałem różnych
zabiegów, z AT>eram, bez, umieszczałem tą sekcję w różnych miejscach
pliku itp... i cały czas ten sam problem:
W programie deklaruję zmienne:unsigned char Buffer[(128*1024)]
__attribute__ ((section("extram")));
(łącznie jest tych buforów 512kB)
Projekt.elf section `extram' will not fit in region `ram' Projekt.elf
section `extram' will not fit in region `rom'
region `ram' overflowed by 464976 bytes
region `rom' overflowed by 8316 bytes
Czemu on mi wciska ten "extram" do RAMu lub ROMu?? Co należy zrobić,
żeby to się kompilowało?? Prosiłbym chociaż o informację, czego szukać
lub z czym kombinować.. Dodam, że zmienne oczywiście nie są
inicjalizowane jakimiś wartościami, nie muszą być nawet zerowane (strata
czasu, a program jest odporny na obecne tam śmieci).
Poniżej cały skrypt linkera...
--
Pozdrawiam
Konop
SEARCH_DIR(.);
/*
+===================================================
==========================+
| format configurations
+===================================================
==========================+
*/
OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm");
OUTPUT_ARCH(arm);
/*
+===================================================
==========================+
| stacks sizes
+===================================================
==========================+
*/
/* Handler mode (core exceptions / interrupts) can use only main stack */
/* Thread mode can use main stack (default) or process stack - selected
in CONTROL special register */
__main_stack_size = 2048;
__process_stack_size = 4096;
PROVIDE(__main_stack_size = __main_stack_size);
PROVIDE(__process_stack_size = __process_stack_size);
/*
+===================================================
==========================+
| available memories definitions
+===================================================
==========================+
*/
MEMORY
{
rom (rx) : org = 0x08000000, len = 512k
ram (rwx) : org = 0x20000000, len = 64k
eram (rwx): org = 0x60000000, len = 512k
}
__rom_start = ORIGIN(rom);
__rom_size = LENGTH(rom);
__rom_end = __rom_start + __rom_size;
__ram_start = ORIGIN(ram);
__ram_size = LENGTH(ram);
__ram_end = __ram_start + __ram_size;
__eram_start = ORIGIN(eram);
__eram_size = LENGTH(eram);
__eram_end = __eram_start + __eram_size;
PROVIDE(__rom_start = __rom_start);
PROVIDE(__rom_size = __rom_size);
PROVIDE(__rom_end = __rom_end);
PROVIDE(__ram_start = __ram_start);
PROVIDE(__ram_size = __ram_size);
PROVIDE(__ram_end = __ram_end);
PROVIDE(__eram_start = __eram_start);
PROVIDE(__eram_size = __eram_size);
PROVIDE(__eram_end = __eram_end);
/*
+===================================================
==========================+
| entry point
+===================================================
==========================+
*/
ENTRY(Reset_Handler);
/*
+===================================================
==========================+
| put data in sections
+===================================================
==========================+
*/
SECTIONS
{
.text :
{
. = ALIGN(4);
__text_start = .;
PROVIDE(__text_start = __text_start);
. = ALIGN(4);
KEEP(*(.vectors));
. = ALIGN(4);
*(.text .text.* .gnu.linkonce.t.*);
. = ALIGN(4);
*(.glue_7t .glue_7);
. = ALIGN(4);
*(.rodata .rodata.* .gnu.linkonce.r.*);
. = ALIGN(4);
*(.ARM.extab* .gnu.linkonce.armextab.*); /* exception unwinding
information */
. = ALIGN(4);
*(.gcc_except_table); /* information used for stack unwinding
during exception */
. = ALIGN(4);
*(.eh_frame_hdr); /* additional information about .ex_frame
section */
. = ALIGN(4);
*(.eh_frame); /* information used for stack unwinding during
exception */
. = ALIGN(4);
KEEP(*(.init));
. = ALIGN(4);
__preinit_array_start = .;
KEEP(*(.preinit_array));
. = ALIGN(4);
__preinit_array_end = .;
__init_array_start = .;
KEEP(*(SORT(.init_array.*)));
. = ALIGN(4);
KEEP(*(.init_array));
. = ALIGN(4);
__init_array_end = .;
KEEP(*(.fini));
. = ALIGN(4);
__fini_array_start = .;
KEEP(*(.fini_array));
. = ALIGN(4);
KEEP(*(SORT(.fini_array.*)));
. = ALIGN(4);
__fini_array_end = .;
. = ALIGN(4);
__text_end = .;
PROVIDE(__text_end = __text_end);
} > rom AT > rom
. = ALIGN(4);
__exidx_start = .;
PROVIDE(__exidx_start = __exidx_start);
.ARM.exidx :
{
*(.ARM.exidx* .gnu.linkonce.armexidx.*);
} > rom AT > rom /* index entries for section unwinding */
. = ALIGN(4);
__exidx_end = .;
PROVIDE(__exidx_end = __exidx_end);
.data :
{
. = ALIGN(4);
__data_init_start = LOADADDR (.data);
PROVIDE(__data_init_start = __data_init_start);
__data_start = .;
PROVIDE(__data_start = __data_start);
. = ALIGN(4);
*(.data .data.* .gnu.linkonce.d.*)
. = ALIGN(4);
__data_end = .;
PROVIDE(__data_end = __data_end);
} > ram AT > rom
.extram :
{
. = ALIGN(4);
__eram_start = .;
PROVIDE(__eram_start = __eram_start);
. = ALIGN(4);
*(.extram)
. = ALIGN(4);
__eram_end = .;
PROVIDE(__eram_end = __eram_end);
} > eram AT > eram
.bss :
{
. = ALIGN(4);
__bss_start = .;
PROVIDE(__bss_start = __bss_start);
. = ALIGN(4);
*(.bss .bss.* .gnu.linkonce.b.*)
. = ALIGN(4);
*(COMMON);
. = ALIGN(4);
__bss_end = .;
PROVIDE(__bss_end = __bss_end);
} > ram AT > ram
.stack :
{
. = ALIGN(8);
__stack_start = .;
PROVIDE(__stack_start = __stack_start);
. = ALIGN(8);
__main_stack_start = .;
PROVIDE(__main_stack_start = __main_stack_start);
. += __main_stack_size;
. = ALIGN(8);
__main_stack_end = .;
PROVIDE(__main_stack_end = __main_stack_end);
. = ALIGN(8);
__process_stack_start = .;
PROVIDE(__process_stack_start = __process_stack_start);
. += __process_stack_size;
. = ALIGN(8);
__process_stack_end = .;
PROVIDE(__process_stack_end = __process_stack_end);
. = ALIGN(8);
__stack_end = .;
PROVIDE(__stack_end = __stack_end);
} > ram AT > ram
. = ALIGN(4);
__heap_start = .;
PROVIDE(__heap_start = __heap_start);
. = ALIGN(4);
__heap_end = __ram_end;
PROVIDE(__heap_end = __heap_end);
.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 .gnu.linkonce.wi.*) }
.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) }
.note.gnu.arm.ident 0 : { KEEP(*(.note.gnu.arm.ident)) }
.ARM.attributes 0 : { KEEP(*(.ARM.attributes)) }
/DISCARD/ : { *(.note.GNU-stack) }
}
PROVIDE(__text_size = __text_end - __text_start);
PROVIDE(__exidx_size = __exidx_end - __exidx_start);
PROVIDE(__data_size = __data_end - __data_start);
PROVIDE(__bss_size = __bss_end - __bss_start);
PROVIDE(__stack_size = __stack_end - __stack_start);
PROVIDE(__heap_size = __heap_end - __heap_start);
Następne wpisy z tego wątku
- 19.07.11 20:57 Michoo
- 19.07.11 21:13 Konop
- 19.07.11 21:57 Portal
- 20.07.11 06:09 Zbych
- 20.07.11 11:25 Michoo
- 20.07.11 20:44 Konop
- 20.07.11 20:45 Konop
- 20.07.11 20:53 Konop
- 21.07.11 05:50 Zbych
- 23.07.11 10:51 Konop
Najnowsze wątki z tej grupy
- ciekawy układ magnetofonu
- Mikroskop 3D
- Jak być bezpiecznym z Li-Ion?
- Szukam monitora HDMI ok. 4"
- Obcinaczki z łapaczem
- termostat do lodowki
- SEP 1 kV E
- Aku LiPo źródło dostaw - ktoś poleci ?
- starość nie radość
- Ataki hakerskie
- Akumulatorki Ni-MH AA i AAA Green Cell
- Dławik CM
- JDG i utylizacja sprzetu
- Identyfikacja układ SO8 w sterowniku migających światełek choinkowych
- DS1813-10 się psuje
Najnowsze wątki
- 2024-12-21 Arch. Prog. Nieuprzywilejowanych w pełnej wer. na nowej s. WWW energokod.pl
- 2024-12-21 Ideologia Geniuszy-Mocarzy dostępna na nowej s. WWW energokod.pl
- 2024-12-21 ciekawy układ magnetofonu
- 2024-12-21 Bieruń => Spedytor Międzynarodowy (handel ładunkami/prowadzenie flo
- 2024-12-21 Warszawa => Java Developer <=
- 2024-12-21 Zalesie Borowe => Medical Equipment Service Engineer <=
- 2024-12-21 Żerniki => Specjalista ds. Employer Brandingu <=
- 2024-12-21 jak tacy debile
- 2024-12-20 Precedensy politycznie motywowanego nie wydawania w UE
- 2024-12-20 Obrońcy
- 2024-12-20 Obrońcy
- 2024-12-20 Obrońcy
- 2024-12-20 Gdańsk => Inżynier bezpieczeństwa aplikacji <=
- 2024-12-20 czyste powietrze
- 2024-12-20 Katowice => Analyst in the Trade Development department (experience wi