Ср окт 16, 2019 17:02:12
MEMORY
{
rom (rx) : ORIGIN = 0x08000000, LENGTH = 0x00020000
ram (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00005000
}
{
rom (rx) : ORIGIN = 0x08000000, LENGTH = 0x00020000
ram0 (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00003000
ram1 (rwx) : ORIGIN = 0x20003000, LENGTH = 0x00002000
}
.My_Ram_Segment 0x20003000 : {KEEP(*(.My_section))} /*здесь можно было даже дописать после } отсыл к >ram1*/
.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 ) - 0x2000;
__StackLimit = __StackTop - SIZEOF(.co_stack);
PROVIDE(__stack = __StackTop);
/* Check if data + heap + stack exceeds ram limit */
ASSERT(__StackLimit >= __HeapLimit, "region ram overflowed with stack")
/*---------- Configuration-----------------------------------------------*/
#define STACK_SIZE 0x00000100 /*!< The Stack size suggest using even number */
__attribute__ ((section(".co_stack")))
unsigned long pulStack[STACK_SIZE];
Ср окт 16, 2019 18:02:20
Ср окт 16, 2019 18:24:17
Ср окт 16, 2019 19:44:56
Ср окт 16, 2019 20:47:25
Ср окт 16, 2019 20:52:10
Смотрите стартап файл, в котором расположена таблица прерываний и адрес начала стека.auric писал(а):Короче, sp указывал на адрес в районе 0x20001000, причем ему было все равно, где я указывал положение вершины стека в скрипте линкера
Она обнуляется программно в стартап файле. Аппаратно это не производится.auric писал(а):Вторая половина вопроса номер два про мусор, ведь насколько я понимаю оперативная память после сброса питания должна быть обнулена?
Ср окт 16, 2019 21:10:04
Чт окт 17, 2019 10:05:30
/* Zero fill the bss segment. This is done with inline assembly since this
will clear the value of pulDest if it is not kept in a register. */
__asm(" ldr r0, =_sbss\n"
" ldr r1, =_ebss\n"
" mov r2, #0\n"
" .thumb_func\n"
"zero_loop:\n"
" cmp r0, r1\n"
" it lt\n"
" strlt r2, [r0], #4\n"
" blt zero_loop");
Смотрите стартап файл, в котором расположена таблица прерываний и адрес начала стека.auric писал(а):Короче, sp указывал на адрес в районе 0x20001000, причем ему было все равно, где я указывал положение вершины стека в скрипте линкера
/*---------- Configuration-----------------------------------------------*/
#define STACK_SIZE 0x00000100 /*!< The Stack size suggest using even number */
__attribute__ ((section(".co_stack")))
unsigned long pulStack[STACK_SIZE];
/* .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 ) - 0x2000;
__StackLimit = __StackTop - SIZEOF(.co_stack);
PROVIDE(__stack = __StackTop);
/* Check if data + heap + stack exceeds ram limit */
ASSERT(__StackLimit >= __HeapLimit, "region ram overflowed with stack")
.co_stack 0x20000c18 0x400 load address 0x08003698
0x20000c18 . = ALIGN (0x8)
*(.co_stack .co_stack.*)
.co_stack 0x20000c18 0x400 ..\obj\startup_stm32f10x_md.o
0x20000c18 pulStack
0x20003000 __StackTop = ((ORIGIN (ram) + LENGTH (ram)) - 0x2000)
0x20002c00 __StackLimit = (__StackTop - SIZEOF (.co_stack))
[!provide] PROVIDE (__stack, __StackTop)
0x00000001 ASSERT ((__StackLimit >= __HeapLimit), region ram overflowed with stack)
Она обнуляется программно в стартап файле. Аппаратно это не производится.auric писал(а):Вторая половина вопроса номер два про мусор, ведь насколько я понимаю оперативная память после сброса питания должна быть обнулена?
Чт окт 17, 2019 11:35:43
Чт окт 17, 2019 11:52:59
(void *)&pulStack[STACK_SIZE], /*!< The initial stack pointer */
/*---------- Configuration-----------------------------------------------*/
#define STACK_SIZE 0x00000100 /*!< The Stack size suggest using even number */
__attribute__ ((section(".co_stack")))
unsigned long pulStack[STACK_SIZE];
Чт окт 17, 2019 12:03:19
#define STACK_SIZE 0x00000100 /*!< The Stack size suggest using even number */
__attribute__ ((section(".co_stack")))
unsigned long pulStack[STACK_SIZE];
Чт окт 17, 2019 12:12:19
#define STACK_SIZE 0x00000100 /*!< The Stack size suggest using even number */
__attribute__ ((section(".co_stack")))
unsigned long pulStack[STACK_SIZE];
Чт окт 17, 2019 12:15:44
(void *)&pulStack[STACK_SIZE], /*!< The initial stack pointer */
...
.section .isr_vector,"a",%progbits
.type g_pfnVectors, %object
.size g_pfnVectors, .-g_pfnVectors
g_pfnVectors:
.word _estack
.word Reset_Handler
.word NMI_Handler
.word HardFault_Handler
...
...
/* Highest address of the user mode stack */
_estack = 0x20005000; /* end of RAM */
...