Skocz do zawartości

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


Pomocna odpowiedź

Napisano

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 ???

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...