Обращение к нереализованному адресу это совсем не выход за разрешенный диапазон, и, как мне кажется, может как-то помочь уж совсем в крайнем случае. Отладка - это не то, что я имел ввиду. Прикладная программа может отловить аварийный выход стека за пределы и реализовать что-то вроде BSOD, что может помочь в нахождении проблем при эксплуатации, когда отладчик вообще ни к месту. Но если полноценного контроля за "сегментами" нет, все эти рассусоливания ни к чему вообще. В итоге, имхо, всех поголовно устроил бы тот вариант, о котором и говорил топикстартер: STACK=MAXRAM-STATIC-HEAP
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
У меня это вообще стандартно. Я почему и удивляюсь, чего такого сложного поправить скрипт линкера? Им даже размер стека лень поправить. Полный пердомонокль.
Заголовок сообщения: Re: Распределение оперативной памяти в STM32
Добавлено: Пт авг 24, 2018 20:20:22
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2693 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
VladislavS писал(а):
У меня это вообще стандартно. Я почему и удивляюсь, чего такого сложного поправить скрипт линкера? Им даже размер стека лень поправить. Полный пердомонокль.
Не придумывайте, то чего тут не говорилось. Все ходы записаны.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Угу. Только EmBitz делает это сам, без моих движений, а Кейлу я должен буду править каждый проект, где мне нужно такое распределение памяти. И еще непонятно, как при этом бороться с кейловскими Stack_Size и Heap_Size - их же тоже придется регулярно править...
Размер стэка и кучи в каждом проекте править, Карл!
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
Заголовок сообщения: Re: Распределение оперативной памяти в STM32
Добавлено: Пт авг 24, 2018 20:48:53
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2693 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
Инициализировал SP значением 0x20000000, то бишь ниже ОЗУ, в каком-то ничего не делающем особо проекте. Никаких настроек для обработки исключения больше не делал. При запуске ввалился в Default_Handler(). Вот причина.Спойлер SP=0x1fffffe0
Ну нормально, можно так за стеком следить. МК STM32F103
Добавлено after 1 minute 43 seconds:
VladislavS писал(а):
Размер стэка и кучи в каждом проекте править,
И где тут некие "они" сказали что "им" лень?
Добавлено after 4 minutes 9 seconds: Где-то у меня еще 030 валяется, на нем чтоли еще попробовать, что будет.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
А есть ешё чипы с CCM RAM и в них стек очень хорошо туда ложится. Как вы не поймёте, что не бывает одного универсального/правильного/лучшего решения для всех проектов.
Заголовок сообщения: Re: Распределение оперативной памяти в STM32
Добавлено: Пт авг 24, 2018 21:04:31
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2693 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
В регистре BFAR значение 1ffffff8. Получается ошибка не конкретно срыва стека, а ошибка адреса. Т.е. этот регистр хранит адрес куда пытался залезть. Но вроде как, можно отдельно настроить прерывание для М3 при проблемах со стеком, судя по маскам указанным мной ранее. Хотя я их ошибочно флагами назвал. Короче там много надо курить. Хотя и этого достаточно чтобы за стеком бдить.
А есть ешё чипы с CCM RAM и в них стек очень хорошо туда ложится. Как вы не поймёте, что не бывает одного универсального/правильного/лучшего решения для всех проектов.
Большой дядя, и этого никто не заявлял и не искал универсального решения для всего.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Инициализировал SP значением 0x20000000, то бишь ниже ОЗУ, в каком-то ничего не делающем особо проекте. Никаких настроек для обработки исключения больше не делал. При запуске ввалился в Default_Handler().
МК STM32F103
Это STM32F103 попадает в Default_Handler()? В таблице не нашел такого прерывания. Может имелся в виду МК с ядром M0? В STM32F103 при выходе стека за пределы ОЗУ происходит переход в HardFault_Handler().
Заголовок сообщения: Re: Распределение оперативной памяти в STM32
Добавлено: Пт авг 24, 2018 21:37:52
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2693 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
Ага, именно 103. Я в кокосе, может просто по разному обозваны обработчики исключений.
А вот сейчас я пробую 030. Но только распаковал его, еще до этого не пробовал никогда. Сразу обратил внимание, что SP уже инициализируется ручками, а нулевой вектор Reserved.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
А вот сейчас я пробую 030. Но только распаковал его, еще до этого не пробовал никогда. Сразу обратил внимание, что SP уже инициализируется ручками, а нулевой вектор Reserved.
По нулевому вектору адрес стека как и в STM32F103.
Последний раз редактировалось Мурик Пт авг 24, 2018 21:52:24, всего редактировалось 2 раз(а).
Заголовок сообщения: Re: Распределение оперативной памяти в STM32
Добавлено: Пт авг 24, 2018 22:20:19
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2693 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
Так этож не вектор, а дефолтный обработчик.
Добавлено after 20 minutes 15 seconds: Попробовал на 030. Стартап тут у меня уже ассмоский. По умолчанию SP на конец оперативки. Инициализировал SP=0x20000000. Ожидаемо ввалился в обработчик преывания по умолчанию. С регистрами причины не стал разбираться. Можно будет поразибраться именно по какому вектору идет прерывание. Но это уже вопрос техники. Надо будет со скриптом линкера поразбираться и попробовать стек поставить вперед кобылы . Нормальная в общем то идея бдить за срывом стека.
Добавлено after 3 minutes 45 seconds:
Мурик писал(а):
По нулевому вектору адрес стека как и в STM32F103.
Стартап у меня его туда кладет, но он не используется.(исп. 25.08.2018 07:30) Вот как там происходит инициализация.
Код:
Reset_Handler: ldr r0, =_eram mov sp, r0
Правка вектора №0 эффекта не дает в 030. А это уже из скрипта линкера
Код:
_eram = 0x20000000 + 0x00001000;
Добавлено after 5 minutes 35 seconds: Получается в 030 в линкере не выделяется секция под стек. Просто в конец sp и все. Но тут МК конечно самый простецкий из линейки stm32.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Последний раз редактировалось Z_h_e Сб авг 25, 2018 06:23:24, всего редактировалось 2 раз(а).
Стартап у меня его туда кладет, но он не используется.Вот как там происходит инициализация.
Код:
Reset_Handler: ldr r0, =_eram mov sp, r0
В EmBitz немного другой код в стартапе для M0.Спойлер
Код:
Reset_Handler: /* Loop to copy data from read only memory to RAM. The ranges * of copy from/to are specified by following symbols evaluated in * linker script. * __etext: End of code section, i.e., begin of data sections to copy from. * __data_start__/__data_end__: RAM address range that data should be * copied to. Both must be aligned to 4 bytes boundary. */
/* Our weak _start alternative if we don't use the library _start * The zero init section must be cleared, otherwise the librtary is * doing that */ .align 1 .thumb_func .weak _start .type _start, %function _start:
/* Zero fill the bss segment. */ ldr r1, = __bss_start__ ldr r2, = __bss_end__ movs r3, #0 b .fill_zero_bss .loop_zero_bss: str r3, [r1] adds r1, 4
.fill_zero_bss: cmp r1, r2 bcc .loop_zero_bss
/* Jump to our main */ bl main b . .size _start, . - _start
ld файле стек размещается в конце ОЗУ.Спойлер
Код:
/* .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 (NOLOAD): { *(.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")
Заголовок сообщения: Re: Распределение оперативной памяти в STM32
Добавлено: Сб авг 25, 2018 05:21:19
Опытный кот
Карма: 13
Рейтинг сообщений: 163
Зарегистрирован: Сб дек 22, 2012 08:17:42 Сообщений: 744 Откуда: Караганда, Казахстан
Рейтинг сообщения:0
VladislavS писал(а):
Для всех проектов одной галочкой, Карл!
Именно. До сих пор всё, что я знал о скриптах линкера, это то, что они существуют, что их генерит среда, которую я пользую, и больше ничего. И был счастлив в своем незнании. А теперь выясняется, что одна из сред генерит нечто неудобное и мне для комфортной работы надо куда-то лезть и что-то править. На хрена мне, спрашивается, это удовольствие? Классическое преодоление трудностей, специально для этой цели придуманных.
Ладно, случай с malloc() в некоторой степени надуманный - это характерно, скорее, для компьютеров, где и памяти может быть разное количество, и загруженность другими задачами разной. На МК изменение размера доступной памяти возможно только при переносе на другой МК, не грех и руками поправить. То есть, бог с ней, с кучей. Но ведь в стеке располагаются автоматические переменные и массивы. Приспичит мне в какой-то программуле объявить массив килобайт на несколько, и лезь в startup_stm32f10x_md править размер стека. Какого хрена я вынужден делать правку сразу в двух местах? Чем думали кейловские программисты, когда делали такое? Головой? Ну, так пусть сядут на нее!..
_________________ Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Это написано для случая, если либо загрузчик, либо отладчик загрузил прошивку в ОЗУ и не знает, что надо стек инициализировать значением из нулевого вектора. В принципе, можно убрать.
Какого хрена я вынужден делать правку сразу в двух местах? Чем думали кейловские программисты, когда делали такое? Головой? Ну, так пусть сядут на нее!..
Хорош истерить уже. Всё там в одном месте правится. У Keil не лучшее решение в этом плане, но оно рабочее.
Заголовок сообщения: Re: Распределение оперативной памяти в STM32
Добавлено: Сб авг 25, 2018 06:02:29
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2693 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
VladislavS писал(а):
Это же кортекс, он по ресету аппаратно из нулевого вектора загружает указатель стека.
Да, с этим я перемудрил. Сбило с толку принудительная инициализация SP и Reserved в таблице векторов. Хотя второе есть и на 103. Сейчас обозначу это в ранее сказанном.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Однажды в одной программе столкнулся с переполнением стека. Как изменить размер быстро не нашел, пошел обходным путем. Такой вариант беру на заметку. Правда на изменение размера кучи ругается.
Заголовок сообщения: Re: Распределение оперативной памяти в STM32
Добавлено: Сб авг 25, 2018 06:43:43
Опытный кот
Карма: 13
Рейтинг сообщений: 163
Зарегистрирован: Сб дек 22, 2012 08:17:42 Сообщений: 744 Откуда: Караганда, Казахстан
Рейтинг сообщения:0
VladislavS писал(а):
Всё там в одном месте правится.
Неправда. В одном месте я исправил свою программу - добавил массив и что-то с ним делаю. А еще я должен не забыть в другом месте поправить размер стека.
_________________ Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения