Распределение оперативной памяти в STM32
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
Угарная тема. Такое ощущение, что на форуме кулинарного техникума, а не эмбеддерам про стеки рассказываешь 
- Реклама
- Сообщения: 3604
- Зарегистрирован: Пн июл 28, 2008 22:12:01
[uquote="afz",url="/forum/viewtopic.php?p=3443168#p3443168"]То есть, бог с ней, с кучей. Но ведь в стеке располагаются автоматические переменные и массивы. Приспичит мне в какой-то программуле объявить массив килобайт на несколько, и лезь в startup_stm32f10x_md править размер стека. Какого хрена я вынужден делать правку сразу в двух местах? Чем думали кейловские программисты, когда делали такое? Головой? Ну, так пусть сядут на нее!..[/uquote]
F042, массив структур 1,5 кб , стек и куча по дефолту. Все арбайтен.
Keil, кстати, не даст сделать динамический массив- что есть гуд, меньше шансов рукожопым кодерам накосячить.
Да и чем толочь воду в ступе лучше читайте - https://community.arm.com/processors/b/ ... plications
F042, массив структур 1,5 кб , стек и куча по дефолту. Все арбайтен.
Keil, кстати, не даст сделать динамический массив- что есть гуд, меньше шансов рукожопым кодерам накосячить.
Да и чем толочь воду в ступе лучше читайте - https://community.arm.com/processors/b/ ... plications
Последний раз редактировалось dosikus Сб авг 25, 2018 08:51:24, всего редактировалось 1 раз.
не понял , с этого места поподробней ))
на stm32f030f4 c размером памяти 4 кб стек по умолчанию 1 кб
если я объявлю три массива (в глобальной секции) по 512 байт , мне стек увеличивать ? до 2 кб ?
на stm32f030f4 c размером памяти 4 кб стек по умолчанию 1 кб
если я объявлю три массива (в глобальной секции) по 512 байт , мне стек увеличивать ? до 2 кб ?
- Сообщения: 3385
- Зарегистрирован: Пн окт 11, 2010 19:00:08
Глобальные массивы находятся постоянно в ОЗУ, а не в стеке. Если объявить локальный не статический массив, то он будет в стеке и нужно обеспечить чтобы в нем было достаточно места. Он находится в стеке только во время выполнения функции включая и выполнение всех функций вызванных из нее.
хм, я как то об этом даже и не задумывался, бум знать
на моем примере
где их найти здесь ?
Добавлено after 2 minutes 28 seconds:
и например как изменить Scatter файл в кейле что бы стек был под всеми данными ???? Начиная с 0х20000000.
Тогда при выходе за стек получим hard fault, который легко отследить
на моем примере
Спойлер
есть три буфера Buffer , IN_Buffer_Data IN_Buffer_CommКод: Выделить всё
SystemCoreClock 0x20000000 Data 4 system_stm32f0xx.o(.data)
Buffer 0x20000004 Data 256 main.o(.data)
pwm_is_ready 0x20000104 Data 1 main.o(.data)
pwm_lock_write 0x20000105 Data 1 main.o(.data)
delay_TIM14 0x20000106 Data 1 main.o(.data)
idxIN 0x20000108 Data 2 main.o(.data)
idxOUT 0x2000010a Data 2 main.o(.data)
IN_Buffer_Data 0x20000134 Data 512 main.o(.bss)
IN_Buffer_Comm 0x20000334 Data 512 main.o(.bss)
__initial_sp 0x20000938 Data 0 startup_stm32f030x6.o(STACK)Код: Выделить всё
Execution Region RW_IRAM1 (Base: 0x20000000, Size: 0x00000938, Max: 0x00001000, ABSOLUTE, COMPRESSED[0x00000010])
Base Addr Size Type Attr Idx E Section Name Object
0x20000000 0x00000004 Data RW 16 .data system_stm32f0xx.o
0x20000004 0x00000100 Data RW 517 .data main.o
0x20000104 0x0000002c Data RW 519 .data main.o
0x20000130 0x00000004 Data RW 706 .data delay.o
0x20000134 0x00000400 Zero RW 515 .bss main.o
0x20000534 0x00000004 PAD
0x20000538 0x00000400 Zero RW 1 STACK startup_stm32f030x6.oКод: Выделить всё
Total RO Size (Code + RO Data) 10172 ( 9.93kB)
Total RW Size (RW Data + ZI Data) 2360 ( 2.30kB)
Total ROM Size (Code + RO Data + RW Data) 10188 ( 9.95kB)и например как изменить Scatter файл в кейле что бы стек был под всеми данными ???? Начиная с 0х20000000.
Тогда при выходе за стек получим hard fault, который легко отследить
- Реклама
- Сообщения: 3604
- Зарегистрирован: Пн июл 28, 2008 22:12:01
Мурик, нормальная практика использовать для этого кучу. Рекомендую начать исправлять свою пробелы в знаниях.
Начни с изучения malloc, free и как пример FreeRtos.
Так же рекомендую внимательнейше изучить ссылку что я привел ,
особливо Figure 2: Typical stack layouts
Даже Joseph Yiu не находит криминала что в одном варианте, что в другом , вы же узрели какую-то хрень, уверовав что эмобитс делает верно а кайло нет.
Начни с изучения malloc, free и как пример FreeRtos.
Так же рекомендую внимательнейше изучить ссылку что я привел ,
особливо Figure 2: Typical stack layouts
Даже Joseph Yiu не находит криминала что в одном варианте, что в другом , вы же узрели какую-то хрень, уверовав что эмобитс делает верно а кайло нет.
- Сообщения: 3385
- Зарегистрирован: Пн окт 11, 2010 19:00:08
dosikus, речь шла о том где размещаются локальные переменные/массивы/структуры и т. д. Не имеет смысла использовать malloc/free для небольших массивов и структур размер которых заранее известен.
- Сообщения: 3604
- Зарегистрирован: Пн июл 28, 2008 22:12:01
Читать, читать и еще раз читать. Дабы не возникало когнитивного диссонанса подобного тому, что ты здесь устроил, восхваляя недоделку что пользуешь... Довел afz до истерики...
dosikus писал(а):Да и чем толочь воду в ступе лучше читайте
Угу. Кейл пользует Typical arrangement 1, о чем я написал еще на 1-й странице. EmBitz - Typical arrangement 2, как выяснили на 2-й странице.dosikus писал(а):особливо Figure 2: Typical stack layouts
Внимание, вопрос: как по-быстрому объяснить Кейлу, что он неправ, и требуется Typical arrangement 2 ?
В старые добрые времена в приличных системах контроль стека делался аппаратно. В принципе, ничего сложного, регистр предельного адреса стека, куда система или программа заносят нижний адрес области стека, и цифровой компаратор, который потихоньку, не занимая времени основной части ЦП, мониторит указатель стека и, как произошло переполнение - выдает какое-то "жесткое" прерывание. И все. У PDP-11 было даже два уровня контроля переполнения стека - "желтая" и "красная" зоны. Правда у нее не было регистра предельного адреса стека, поскольку стек всегда располагался в начале памяти, сразу после векторов. Адреса переполнения стека, соответственно, были фиксированными.Z_h_e писал(а):За то мы тут нашли способ контроля переполнения стека. В принципе он лежал на поверхности, но я лично даже не думал об этом до сей темы форума
В "больших" системах это дело, обычно, возлагается на страничный механизм виртуальной памяти, поэтому, похоже, про простой аппаратный контроль переполнения стека подзабыли. ARM ведь пытаются конкурировать с x86/x64, они, типа, "большие", а про то, что это ядро применяется и в МК, в которых памяти десятки, а то и единицы КИЛОбайт и такая фенечка могла бы быть весьма полезой - не подумали...
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
afz, бросайте вы этот Keil пока не подсели. Тут есть его ярые защитники, но как начинаешь выяснять как сделать что-то отличающееся от их шаблонов, то сразу как зайцы по кустам разбегаются.
Касательно вашего вопроса - изучаем scatter file.
Касательно вашего вопроса - изучаем scatter file.
Я пробовал чуть-чуть править scatter у Кейла. Правда совсем для другой задачи, не для перемещения стека. Не совсем понял как, но получилось сделать что хотел. Больше пока к Кейлу не возвращался. Скрипт линкера Кейла, имхо, какой-то не интуитивный, хотя возможно это дело привычки.
- Сообщения: 3604
- Зарегистрирован: Пн июл 28, 2008 22:12:01
Хаятели кайла - мануал читать не пробовали?
Что в первом варианте , что во втором, остаются участки памяти Unused и что бы их юзать надо править размер.
С какого бодуна вам взбрендилось, что во втором варианте вы можете их беспроблемно юзать ?
На хрена оно надо? И с какого хрена кайл не прав?Внимание, вопрос: как по-быстрому объяснить Кейлу, что он неправ, и требуется Typical arrangement 2 ?
Что в первом варианте , что во втором, остаются участки памяти Unused и что бы их юзать надо править размер.
С какого бодуна вам взбрендилось, что во втором варианте вы можете их беспроблемно юзать ?
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
[uquote="dosikus",url="/forum/viewtopic.php?p=3443755#p3443755"]На хрена оно надо?[/uquote]Чтобы стек с кучей по нежданчику встречались 
- Сообщения: 3604
- Зарегистрирован: Пн июл 28, 2008 22:12:01
За этим им все равно следить самим придется.
А как выше и писал кайло не даст создать массив с переменным размером.
А как выше и писал кайло не даст создать массив с переменным размером.
afz, если не хотца со скаттером разбираться, то можно в стартапе зарезервировать огромное место под стек. В конец точно не попадешь, но будешь близко. И с увеличением скомпилленого кода придется его каждый раз уменьшать
.
Еще есть индуский способ. Если ты знаешь, что у тебя стек последняя секция и выше нее точно ничего нет, вручную ставишь "вектор" инициализации SP на конец. На первый взгляд вроде как ничего плохого в этом нет, но легко может оказаться что тут скрыты огромные грабли или сарай граблей. Так что я такого не советовал
.
Еще есть индуский способ. Если ты знаешь, что у тебя стек последняя секция и выше нее точно ничего нет, вручную ставишь "вектор" инициализации SP на конец. На первый взгляд вроде как ничего плохого в этом нет, но легко может оказаться что тут скрыты огромные грабли или сарай граблей. Так что я такого не советовал
С того, что, по крайней мере, стек кейловское творение (в смысле собранная программа) не проверяет. Куча, скорее всего, проверяется - оговорено же, что если malloc() не может выделить требуемый объем памяти, возвращается NULL. А стек никто не проверяет, иначе не вылетали бы программы с недостаточным размером стека в Hard Fault.dosikus писал(а):С какого бодуна вам взбрендилось, что во втором варианте вы можете их беспроблемно юзать ?
Угу. В смысле пореже встречались. Ибо при неправильно назначенных Stack_Size и Heap_Size они встречаются точно так же. Иначе не было бы регулярных жалобных вопросов от новичков, типа "Почему у меня FatFS вылетает в Hard Fault?" и ответов от наступивших на эти грабли: "Стек увеличь!"VladislavS писал(а):Чтобы стек с кучей по нежданчику встречались
Позже же, когда программа более-менее заработает, по-любому полезно просмотреть в отладчике память в области стека и оценить, какой же в действительности размер стека.
Мне у Кейла нравится работа с CMSIS. Написал в начале программыVladislavS писал(а):afz, бросайте вы этот Keil пока не подсели.
Код: Выделить всё
#include "stm32f10x.h"
#include "RTE_Components.h"А вообще, конечно, я не настоящий сварщик. Программистом я был во времена расцвета наших клонов Системы 360 и PDP-11. Встроенным программированием я занимался именно на клонах PDP-11 (Э-60, ДВК). Потом несколько лет программировал под MS-DOS. Увы всеобщего перехода под винды я не сдюжил, ввиду слабости своего английского. Пришлось сменить род деятельности. А сейчас, на пенсии, пытаюсь эмбеддить по-мелочи...
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
Классическое ИМХО - имею мнение хрен оспоришь.
А оно нам надо?
- Сообщения: 3604
- Зарегистрирован: Пн июл 28, 2008 22:12:01
[uquote="afz",url="/forum/viewtopic.php?p=3445002#p3445002"]С того, что, по крайней мере, стек кейловское творение (в смысле собранная программа) не проверяет. Куча, скорее всего, проверяется - оговорено же, что если malloc() не может выделить требуемый объем памяти, возвращается NULL. А стек никто не проверяет, иначе не вылетали бы программы с недостаточным размером стека в Hard Fault.[/uquote]
Пруф что эмобитс сие проверяет . Вы вновь выдаете свои надумки за действительность...
Пруф что эмобитс сие проверяет . Вы вновь выдаете свои надумки за действительность...
и все-таки, я так и не увидел ответа на теоретический вопрос: зачем вручную задавать размер и местоположение стека, если наиболее оптимальным выглядить отдавать под него все, что осталось после выделения кучи и статических переменных (ну и под код, исполняемый из ОЗУ - это я не в курсе, как правильно называется)?
я даже согласен переформулировать вопрос иначе: зачем ОДНОВРЕМЕННО задавать размер и кучи и стека, если вполне логичным выглядит задавать что-то одно, а остатки оставлять под другое?
экзотические варианты с "дырами" в адресном пространстве не рассматриваем, т.к. это не общий случай.
я даже согласен переформулировать вопрос иначе: зачем ОДНОВРЕМЕННО задавать размер и кучи и стека, если вполне логичным выглядит задавать что-то одно, а остатки оставлять под другое?
экзотические варианты с "дырами" в адресном пространстве не рассматриваем, т.к. это не общий случай.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
Нет никакого ОБЩЕГО СЛУЧАЯ. Для STM32 мы пользуемся средствами разработки под ядра ARM. На ARM сделано несметное количество разных чипов, архитектура которых сильно отличается. И во всех средах разработки есть механизм настройки под каждый из этих чипов. Либо пользуйтесь этими механизмами, либо сидите на тинях и газируйте лужи.



