Чт авг 23, 2018 11:05:04
Чт авг 23, 2018 11:13:07
Как правило да.afz писал(а):Я правильно понимаю, что локальные для функции переменные и массивы располагаются в области стека?
Необязательно. Распределением что и где (если явно не заданно) занимается компилятор/линкер.afz писал(а):А статические и глобальные (в смысле, определенные вне функций и видимые во всех функциях) - перед кучей
Вначале таблицы векторов находится указатель на стек, а он обычно располагается в конце памяти.afz писал(а):А вот на хрена для АРМов сделали такую глупость, как стек в начале памяти?
Чт авг 23, 2018 13:16:55
#define STACK_SIZE 0x00000100 /*!< The Stack size suggest using even number */
__attribute__ ((section(".co_stack")))
unsigned long pulStack[STACK_SIZE];
(void *)&pulStack[STACK_SIZE], /*!< The initial stack pointer */
Reset_Handler, /*!< Reset Handler */
NMI_Handler,
...
...
Чт авг 23, 2018 14:29:43
Чт авг 23, 2018 19:48:58
У Кейла то же самое, не считая того, что стартап у него на асме.То есть, все обследованные системы программирования в начале SRAM располагают статические переменные, затем кучу заданного размера и стек, тоже заданного размера. Да, я уточнил, Кейл по malloc() выдает память из кучи, думаю, остальные делают то же самое.Z_h_e писал(а):Это для компилятора GCC, у других как там я не знаю.
Чт авг 23, 2018 20:00:41
Я думаю в скрипте линковщика можно жестко указать, где должен находится сегмент стэка. И тогда можно будет более корректно установить указатель стека в конец памяти.afz писал(а):В общем, непонятно, зачем так сделали...
ЯВУ как бы избавляет программера думать об распределении памяти. Добавил переменныю - все "само" сдвинулось. Добавил много - наругается. Так что вся доступна, только надо заявить сколько тебе надо.afz писал(а):Получается, что остальная оперативка просто недоступна.
Чт авг 23, 2018 20:06:23
Стек может быть в конце оперативки.afz писал(а):Кто мешал стек разместить в физическом конце оперативки и не фиксировать соотношений между стеком и кучей - пусть растут навстречу друг другу, пока не встретятся.
Чт авг 23, 2018 20:12:44
Чт авг 23, 2018 20:30:24
А вот у меня пример небольшой прожки со стандартным линкером на тот же камень.Мурик писал(а):Адрес 0x20005000 это конец оперативки у STM32F103C8T6. Компилятор GCC. Скрипт линкера стандартный из IDE.
Хммм. Размер то ОЗУ до 0x20004FFF. Разве не должен быть максимальный адрес для 32битного регистра быть 0x20004FFC для такого размера памяти?Мурик писал(а):Адрес 0x20005000 это конец оперативки у STM32F103C8T6.
Чт авг 23, 2018 20:56:46
Z_h_e писал(а):ЯВУ как бы избавляет программера думать об распределении памяти. Добавил переменныю - все "само" сдвинулось. Добавил много - наругается. Так что вся доступна, только надо заявить сколько тебе надо.
VladislavS писал(а):Линкер выделяет программе ровно столько памяти сколько ей нужно. Зачем давать программе больше чем ей нужно? Она от этого лучше работать не будет.
С Кейлом - не выйдет.VladislavS писал(а):Кто запрещает вам это сделать? Скрипт линкера и стартап доступны для редактирования - пишите как считаете нужным. От себя лишь пожелаю, чтобы они всё же не встречались у вас.
Z_h_e писал(а):Хотя, видимо укзатель сначала уменьшается и потом запись, а увеличивается уже после чтения.
Увы, у Кейла это не так!Мурик писал(а):Как правило да.afz писал(а):Я правильно понимаю, что локальные для функции переменные и массивы располагаются в области стека?
Чт авг 23, 2018 21:02:23
Чт авг 23, 2018 21:16:21
А вот у меня пример небольшой прожки со стандартным линкером на тот же камень.Мурик писал(а):Адрес 0x20005000 это конец оперативки у STM32F103C8T6. Компилятор GCC. Скрипт линкера стандартный из IDE.
.data 0x20000000 0x68 load address 0x08000570
0x20000000 __data_start__ = .
*(vtable)
*(.data*)
.data.impure_data
0x20000000 0x60 ./embitz/1.11/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libg_n.a(lib_a-impure.o)
0x20000060 . = ALIGN (0x4)
0x20000060 PROVIDE (__preinit_array_start, .)
*(.preinit_array)
0x20000060 PROVIDE (__preinit_array_end, .)
0x20000060 . = ALIGN (0x4)
0x20000060 PROVIDE (__init_array_start, .)
*(SORT(.init_array.*))
*(.init_array)
.init_array 0x20000060 0x4 ./embitz/1.11/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m/crtbegin.o
0x20000064 PROVIDE (__init_array_end, .)
0x20000064 . = ALIGN (0x4)
[!provide] PROVIDE (__fini_array_start, .)
*(SORT(.fini_array.*))
*(.fini_array)
.fini_array 0x20000064 0x4 ./embitz/1.11/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m/crtbegin.o
[!provide] PROVIDE (__fini_array_end, .)
0x20000068 . = ALIGN (0x4)
0x20000068 __data_end__ = .
.jcr 0x20000068 0x0 load address 0x080005d8
.jcr 0x20000068 0x0 ./embitz/1.11/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m/crtbegin.o
.igot.plt 0x20000068 0x0 load address 0x080005d8
.igot.plt 0x20000068 0x0 ./embitz/1.11/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m/crtbegin.o
.bss 0x20000068 0x1c load address 0x080005d8
0x20000068 __bss_start__ = .
*(.bss*)
.bss 0x20000068 0x1c ./embitz/1.11/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m/crtbegin.o
*(COMMON)
0x20000084 __bss_end__ = .
.heap 0x20000088 0x0
0x20000088 __end__ = .
0x20000088 end = __end__
*(.heap*)
.heap 0x20000088 0x0 obj\release\src\startup_stm32f10x_md.o
0x20000088 __HeapLimit = .
.stack_dummy 0x20000088 0x100
*(.stack)
.stack 0x20000088 0x100 obj\release\src\startup_stm32f10x_md.o
0x20005000 __StackTop = (ORIGIN (RAM) + LENGTH (RAM))
0x20004f00 __StackLimit = (__StackTop - SIZEOF (.stack_dummy))
0x20005000 PROVIDE (__stack, __StackTop)
Чт авг 23, 2018 21:22:47
VladislavS писал(а):Вы что-то конкретно путаете!
Чт авг 23, 2018 21:29:15
Чт авг 23, 2018 21:33:19
Чт авг 23, 2018 21:39:16
Пт авг 24, 2018 06:27:30
Пт авг 24, 2018 07:25:11
Пт авг 24, 2018 07:57:34
Угу. Только EmBitz делает это сам, без моих движений, а Кейлу я должен буду править каждый проект, где мне нужно такое распределение памяти. И еще непонятно, как при этом бороться с кейловскими Stack_Size и Heap_Size - их же тоже придется регулярно править...Keil делает ровно то что написано в вашем проекте. Куда поместите стек, там он и будет.
Пт авг 24, 2018 11:00:38