Skocz do zawartości

STM32F103 (środowisko CooCox) - zmiana wartości rozmiaru stosu


simba92

Pomocna odpowiedź

Witam!

Jak w temacie, czy ktoś może wie gdzie mógłbym zmienić wartość rozmiaru stosu przydzielanego przez kompilator w środowisku CooCox ? Przeglądałem trochę już internet i znalazłem skrypt linkera w folderze kompilatora GNU dla arm'a, poniżej zamieszam kod :

/* Linker script to configure memory regions. 
* Need modifying for a specific board. 
*   FLASH.ORIGIN: starting address of flash
*   FLASH.LENGTH: length of flash
*   RAM.ORIGIN: starting address of RAM bank 0
*   RAM.LENGTH: length of RAM bank 0
*/
MEMORY
{
 FLASH (rx) : ORIGIN = 0x0, LENGTH = 0x20000 /* 128K */
 RAM (rwx) : ORIGIN = 0x10000000, LENGTH = 0x2000 /* 8K */
 RAM2 (rwx) : ORIGIN = 0x20000000, LENGTH = 0x2000 /* 8K */
}

/* Linker script to place sections and symbol values. Should be used together
* with other linker script that defines memory regions FLASH and RAM.
* It references following symbols, which must be defined in code:
*   Reset_Handler : Entry of reset handler
* 
* It defines following symbols, which code can use without definition:
*   __exidx_start
*   __exidx_end
*   __copy_table_start__
*   __copy_table_end__
*   __zero_table_start__
*   __zero_table_end__
*   __etext
*   __data_start__
*   __preinit_array_start
*   __preinit_array_end
*   __init_array_start
*   __init_array_end
*   __fini_array_start
*   __fini_array_end
*   __data_end__
*   __bss_start__
*   __bss_end__
*   __end__
*   end
*   __HeapLimit
*   __StackLimit
*   __StackTop
*   __stack
*/
ENTRY(Reset_Handler)

SECTIONS
{
.text :
{
	KEEP(*(.isr_vector))
	*(.text*)

	KEEP(*(.init))
	KEEP(*(.fini))

	/* .ctors */
	*crtbegin.o(.ctors)
	*crtbegin?.o(.ctors)
	*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
	*(SORT(.ctors.*))
	*(.ctors)

	/* .dtors */
		*crtbegin.o(.dtors)
		*crtbegin?.o(.dtors)
		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
		*(SORT(.dtors.*))
		*(.dtors)

	*(.rodata*)

	KEEP(*(.eh_frame*))
} > FLASH

.ARM.extab : 
{
	*(.ARM.extab* .gnu.linkonce.armextab.*)
} > FLASH

__exidx_start = .;
.ARM.exidx :
{
	*(.ARM.exidx* .gnu.linkonce.armexidx.*)
} > FLASH
__exidx_end = .;

/* To copy multiple ROM to RAM sections,
 * uncomment .copy.table section and,
 * define __STARTUP_COPY_MULTIPLE in startup_ARMCMx.S */
.copy.table :
{
	. = ALIGN(4);
	__copy_table_start__ = .;
	LONG (__etext)
	LONG (__data_start__)
	LONG (__data_end__ - __data_start__)
	LONG (__etext2)
	LONG (__data2_start__)
	LONG (__data2_end__ - __data2_start__)
	__copy_table_end__ = .;
} > FLASH

/* To clear multiple BSS sections,
 * uncomment .zero.table section and,
 * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_ARMCMx.S */
.zero.table :
{
	. = ALIGN(4);
	__zero_table_start__ = .;
	LONG (__bss_start__)
	LONG (__bss_end__ - __bss_start__)
	LONG (__bss2_start__)
	LONG (__bss2_end__ - __bss2_start__)
	__zero_table_end__ = .;
} > FLASH

/* Location counter can end up 2byte aligned with narrow Thumb code but
   __etext is assumed by startup code to be the LMA of a section in RAM
   which must be 4byte aligned */
__etext = ALIGN (4);

.data : AT (__etext)
{
	__data_start__ = .;
	*(vtable)
	*(.data*)
	__data_end__ = .;

} > RAM

/* Location counter can end up 2byte aligned with narrow Thumb code but
   __etext2 is assumed by startup code to be the LMA of a section in
   RAM which must be 4byte aligned */
__etext2 = __etext + ALIGN (SIZEOF(.data), 4);

.data2 : AT (__etext2)
{
	__data2_start__ = .;

	. = ALIGN(4);
	/* preinit data */
	PROVIDE_HIDDEN (__preinit_array_start = .);
	KEEP(*(.preinit_array))
	PROVIDE_HIDDEN (__preinit_array_end = .);

	. = ALIGN(4);
	/* init data */
	PROVIDE_HIDDEN (__init_array_start = .);
	KEEP(*(SORT(.init_array.*)))
	KEEP(*(.init_array))
	PROVIDE_HIDDEN (__init_array_end = .);


	. = ALIGN(4);
	/* finit data */
	PROVIDE_HIDDEN (__fini_array_start = .);
	KEEP(*(SORT(.fini_array.*)))
	KEEP(*(.fini_array))
	PROVIDE_HIDDEN (__fini_array_end = .);

	KEEP(*(.jcr*))
	. = ALIGN(4);
	/* All data end */
	__data2_end__ = .;

} > RAM2

.bss :
{
	. = ALIGN(4);
	__bss_start__ = .;
	*(.bss*)
	. = ALIGN(4);
	__bss_end__ = .;
} > RAM

.bss2 :
{
	. = ALIGN(4);
	__bss2_start__ = .;
	*(COMMON)
	. = ALIGN(4);
	__bss2_end__ = .;
} > RAM2

.heap (COPY):
{
	__end__ = .;
	PROVIDE(end = .);
	*(.heap*)
	__HeapLimit = .;
} > RAM

/* .stack_dummy section doesn't contains any symbols. It is only
 * used for linker to calculate size of stack sections, and assign
 * values to stack symbols later */
.stack_dummy (COPY):
{
	*(.stack*)
} > RAM

/* Set stack top to end of RAM, and stack limit move down by
 * size of stack_dummy section */
__StackTop = ORIGIN(RAM) + LENGTH(RAM);
__StackLimit = __StackTop - SIZEOF(.stack_dummy);
PROVIDE(__stack = __StackTop);

/* Check if data + heap + stack exceeds RAM limit */
ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
}

oraz plik link.ld w projekcie :

OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
/* Internal Memory Map*/
MEMORY
{
rom (rx)  : ORIGIN = 0x08000000, LENGTH = 0x00040000
ram (rwx) : ORIGIN = 0x20000000, LENGTH = 0x0000C000
}

_eram = 0x20000000 + 0x0000C000;
SECTIONS
{
.text :
{
	KEEP(*(.isr_vector))
	*(.text*)

	KEEP(*(.init))
	KEEP(*(.fini))

	/* .ctors */
	*crtbegin.o(.ctors)
	*crtbegin?.o(.ctors)
	*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
	*(SORT(.ctors.*))
	*(.ctors)

	/* .dtors */
	*crtbegin.o(.dtors)
	*crtbegin?.o(.dtors)
	*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
	*(SORT(.dtors.*))
	*(.dtors)

	*(.rodata*)

	KEEP(*(.eh_fram e*))
} > rom 

.ARM.extab : 
{
	*(.ARM.extab* .gnu.linkonce.armextab.*)
} > rom 

__exidx_start = .;
.ARM.exidx :
{
	*(.ARM.exidx* .gnu.linkonce.armexidx.*)
} > rom 
__exidx_end = .;
__etext = .;

/* _sidata is used in coide startup code */
_sidata = __etext;

.data : AT (__etext)
{
	__data_start__ = .;

	/* _sdata is used in coide startup code */
	_sdata = __data_start__;

	*(vtable)
	*(.data*)

	. = ALIGN(4);
	/* preinit data */
	PROVIDE_HIDDEN (__preinit_array_start = .);
	KEEP(*(.preinit_array))
	PROVIDE_HIDDEN (__preinit_array_end = .);

	. = ALIGN(4);
	/* init data */
	PROVIDE_HIDDEN (__init_array_start = .);
	KEEP(*(SORT(.init_array.*)))
	KEEP(*(.init_array))
	PROVIDE_HIDDEN (__init_array_end = .);

	. = ALIGN(4);
	/* finit data */
	PROVIDE_HIDDEN (__fini_array_start = .);
	KEEP(*(SORT(.fini_array.*)))
	KEEP(*(.fini_array))
	PROVIDE_HIDDEN (__fini_array_end = .);

	KEEP(*(.jcr*))
	. = ALIGN(4);
	/* All data end */
	__data_end__ = .;

	/* _edata is used in coide startup code */
	_edata = __data_end__;
} > ram 

.bss :
{
	. = ALIGN(4);
	__bss_start__ = .;
	_sbss = __bss_start__;
	*(.bss*)
	*(COMMON)
	. = ALIGN(4);
	__bss_end__ = .;
	_ebss = __bss_end__;
} > ram 

.heap (COPY):
{
	__end__ = .;
	_end = __end__;
	end = __end__;
	*(.heap*)
	__HeapLimit = .;
} > ram 

/* .stack_dummy section doesn't contains any symbols. It is only
* used for linker to calculate size of stack sections, and assign
* values to stack symbols later */
.co_stack (NOLOAD):
{
	. = ALIGN(8);
	*(.co_stack .co_stack.*)
} > ram 

/* Set stack top to end of ram , and stack limit move down by
* size of stack_dummy section */
__StackTop = ORIGIN(ram ) + LENGTH(ram );
__StackLimit = __StackTop - SIZEOF(.co_stack);
PROVIDE(__stack = __StackTop);

/* Check if data + heap + stack exceeds ram  limit */
ASSERT(__StackLimit >= __HeapLimit, "region ram  overflowed with stack")
}

Trochę jestem jeszcze zielony, więc pytam czy jakieś zmiany w tym pliku lub plikach pozwolą mi ustawić domyślną wartość stosu ??? Dodam, że korzystam z bilbiotek standardowych STD Periph i nie mogę nigdzie znaleźć pola typu

_Min_Stack_Size 

??? W internecie znalazłem podobnie opisany problem, gdzie dla biblioteki CUBE można zmienić wartość stosu :

elektroda STOS dla stm32 .

Czy ktoś jest w stanie mi pomóc i powiedzieć jak ustawić rozmiar stosu dla projektu pisanego w CooCox i z biblioteką STDperiph ???

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.