ОЗУ в STM32

Кто любит RISC в жизни, заходим, не стесняемся.
maksimdag0
Прорезались зубы
Сообщения: 225
Зарегистрирован: Чт апр 08, 2021 09:46:48

ОЗУ в STM32

Сообщение maksimdag0 »

Всех приветствую! Простите если я не сюда написал. Я сейчас изучаю что такое стек и куча, для чего она нужна и с чем ее едят. После долгих прогулок по просторам интернета вроде бы изучил, но у меня по итогу не складывается картина в целом, так как на некотрых источниках противоречит помему преставлению о стеке и куче. Я хотел ручками поработать с оперативной памятью на STMF401, посомтреть как локальные переменные записываются в стек и как глобальные записываются в кучу, но ничег не получилось, непотно куда что должно записывать и там уже половину оперативки у меня заполнено (так как тестил на написанно программе). Подскажите мне пожалуйста правильное ли у меня представление о стеке и куче?

Оперативная память состоит из двух областей — стек и кучи. В стек записываются локальные переменные, аргументы и все, что связано с функцией, а все остальное (например глобальные переменные) записывается в кучу. Весь остальной код программы хранится в Flash памяти, правильно ли я понимаю?

И как можно на практике поработать со оперативной памятью STM для закрепления знаний?
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: ОЗУ в STM32

Сообщение VladislavS »

[uquote="maksimdag0",url="/forum/viewtopic.php?p=4369722#p4369722"]правильно ли я понимаю?[/uquote]Нет.

Добавлено after 5 minutes 16 seconds:
[uquote="maksimdag0",url="/forum/viewtopic.php?p=4369722#p4369722"]И как можно на практике поработать со оперативной памятью STM для закрепления знаний?[/uquote]Смотреть map-файлы и листинги, в режиме отладки смотреть где в памяти что расположено. Только перед этим теорию подтянуть.

Добавлено after 1 hour 2 minutes 6 seconds:
Предлагаю сначала разобраться с аппаратным уровнем: блоки/регионы RAM, процессор с регистрами общего назначения (РОН), работой стека.

Затем на аппаратный уровень наложить сущности языков высокого уровня: глобальные, локальные, статические и динамические переменные, а также разного рода константы. Подумать и посмотреть где на аппаратном уровне они могут размещаться.
maksimdag0
Прорезались зубы
Сообщения: 225
Зарегистрирован: Чт апр 08, 2021 09:46:48

Re: ОЗУ в STM32

Сообщение maksimdag0 »

Спасибо за наставленный путь, приступлю дальше изучать)
alex1126
Вымогатель припоя
Сообщения: 567
Зарегистрирован: Ср дек 19, 2012 12:16:22

Re: ОЗУ в STM32

Сообщение alex1126 »

Вообщем ситуация обстоит примерно так:
Память делится на три области - куча (heap), стек, и память данных (статическая область).

В куче место выделяется функцией malloc. И только. Если ты не используешь выделение памяти руками, то можешь в компиляторе запретить кучу. Но надо быть точно уверенным что никто из вызываемых тобой библиотечных функций тоже не использует кучу.
Если ты попробуешь выделить памяти больше чем есть, то malloc вернет NULL. Нужно обязательно проверять возвращаемое значение.

В стеке хранятся локальные переменные, там же сохраняются значения переменных и регистров при вызове функций. Размер стека который нужен программе можно рассчитать на этапе компиляции. Но при условии что у тебя нет кучи всяких прерываний, вызываемых одно из другого, каких-нить указателей на функции и прочие неопределенные моменты. Но если у тебя пара таймеров, то можно накинуть пару десяткой байт к вычисленному значению и поймешь необходимый размер стека.

И область данных, где хранится все остальное. Глобальные переменные и переменные которые обозваны static.

В самой памяти стек, как правило, располагается после кучи. А место в стеке выделяется от большего адреса к меньшему, то есть стек заполняется задом наперед и при переполнении он лезет к кучу. Впринципе если он чуток залез, в куче эта область не используемая, то ничего и не произойдет, а если память занята, то будет так называемое переполнение стека. Причем не все МК умеют отслеживать данную ситуацию.

Ну как то так.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: ОЗУ в STM32

Сообщение VladislavS »

alex1126, каждое второе утверждение у вас ложное. Не надо с такими познаниями учить.
alex1126
Вымогатель припоя
Сообщения: 567
Зарегистрирован: Ср дек 19, 2012 12:16:22

Re: ОЗУ в STM32

Сообщение alex1126 »

ну подправьте
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: ОЗУ в STM32

Сообщение VladislavS »

Спасибо за одолжение, но не хочу.
Аватара пользователя
>TEHb<
Друг Кота
Сообщения: 5723
Зарегистрирован: Ср ноя 11, 2009 17:19:30
Откуда: Воронеж
Контактная информация:

Re: ОЗУ в STM32

Сообщение >TEHb< »

alex1126, ну типа если ОС отсутствует, то почти наверняка выделение памяти статическое. Malloc совсем низачем не нужен
"Привет!" - соврал он.
alex1126
Вымогатель припоя
Сообщения: 567
Зарегистрирован: Ср дек 19, 2012 12:16:22

Re: ОЗУ в STM32

Сообщение alex1126 »

Вам может и не нужен, но в компилятор место наверняка выделяет, если вы ничего не меняли в параметрах. На чем пишите? В KEil-е в файлах проекта, в модулях инициализации, задается распределение памяти, сколько под кучу отводить, сколько под стек. Кстати поэтому совет предыдущего автора бессмысленен - что толку смотреть отладчиком адрес размещения переменных, когда это может быть и стек и куча и статитическая память, в зависимости от настроек проект.

ПС ЗЫ Кстати, данная архитектура, если ее можно так назвать, справедлива и для виндовсов всяких, с небольшими поправками на наличие процессов.
Аватара пользователя
azhel12
Встал на лапы
Сообщения: 145
Зарегистрирован: Пн апр 02, 2012 15:56:23

Re: ОЗУ в STM32

Сообщение azhel12 »

alex1126, при всем уважении, согласен с VladislavS. Вопрос был конкретно про STM32, и рассказывать про кучу и Xalloc/new как минимум вредно (кто там есть аллокатор?).

Настройки проекта в конечном итоге (иначе и быть не может) - это настройки компилятора и компоновщика, так что очень даже полезно посмотреть на флаги и правила, ну и отладчиком убедиться, что никакой магии нет и сборка действует детерминированно, ровно в соответствии с документацией.
alex1126
Вымогатель припоя
Сообщения: 567
Зарегистрирован: Ср дек 19, 2012 12:16:22

Re: ОЗУ в STM32

Сообщение alex1126 »

А чем выделение памяти в куче на stm32 отличается от .... от чего? Что именно то я не так сказал? malloc.... а с ним что не так?
Аватара пользователя
>TEHb<
Друг Кота
Сообщения: 5723
Зарегистрирован: Ср ноя 11, 2009 17:19:30
Откуда: Воронеж
Контактная информация:

Re: ОЗУ в STM32

Сообщение >TEHb< »

Malloc выделяет память уже в процессе работы, в рантайме, если угодно. В микроконтроллерах такой подход применяется далекоооо не всегда. Чаще память выделяется статически, на этапе сборки проекта.
"Привет!" - соврал он.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: ОЗУ в STM32

Сообщение VladislavS »

[uquote="alex1126",url="/forum/viewtopic.php?p=4370034#p4370034"]Что именно то я не так сказал? malloc....[/uquote]Конкретно про malloc вы сказали[uquote="alex1126",url="/forum/viewtopic.php?p=4370034#p4370034"]В куче место выделяется функцией malloc. И только.[/uquote]Даже если не выходить за пределы С, то это и calloc, и realloc. А так как ТС ничего про языки не говорил, то в других найдём ещё кучу способов выделения памяти из кучи.

Также, категоричное [uquote="alex1126",url="/forum/viewtopic.php?p=4370034#p4370034"]Память делится на три области - куча (heap), стек, и память данных (статическая область).[/uquote]не соответствует действительности. Только типов памяти в контроллере больше, а уж областей и подавно.

[uquote="alex1126",url="/forum/viewtopic.php?p=4370034#p4370034"]Кстати поэтому совет предыдущего автора бессмысленен - что толку смотреть отладчиком адрес размещения переменных, когда это может быть и стек и куча и статитическая память, в зависимости от настроек проект.[/uquote]Во-первых, как настройками проекта можно отправить статическую переменную в кучу, динамическую на стек и т.д.? Во-вторых, в отладчике разве не видно где расположена переменная? Вы им хоть раз пользовались? В-третьих, в отладчике запросто можно увидеть, что локальные переменные хранятся не только в стеке, а в РОН, например. Точно так же как через РОН параметры передаются в функцию и возвращается её результат.

Ну и дальше по тексту... Вы бы не были столь категоричны, если бы почаще заглядывали в map, листинги и отладчик.
maksimdag0
Прорезались зубы
Сообщения: 225
Зарегистрирован: Чт апр 08, 2021 09:46:48

Re: ОЗУ в STM32

Сообщение maksimdag0 »

Доброго дня! для ясности - я работаю в keil на языке си
alex1126
Вымогатель припоя
Сообщения: 567
Зарегистрирован: Ср дек 19, 2012 12:16:22

Re: ОЗУ в STM32

Сообщение alex1126 »

[uquote="VladislavS",url="/forum/viewtopic.php?p=4370078#p4370078"]Даже если не выходить за пределы С, то это и calloc, и realloc.[/uquote]
и они для выделения памяти используют именно malloc. И я писал дальше, что могут быть библиотечные функции, которые используют malloc
Только типов памяти в контроллере больше, а уж областей и подавно.
ну можно и до физического уровня договорится. Для начала данной информации достаточно. Да и вообще для 99% случаев данных знаний достаточно. Многие и этого то не знают.
Во-первых, как настройками проекта можно отправить статическую переменную в кучу, динамическую на стек и т.д.?
ну посмотрите вы в отладчике адрес переменной 0x20000A5. Где она расположена? В стеке? В куче? Локальная? Глобальная?
maksimdag0
Прорезались зубы
Сообщения: 225
Зарегистрирован: Чт апр 08, 2021 09:46:48

Re: ОЗУ в STM32

Сообщение maksimdag0 »

maksimdag0 писал(а):ну посмотрите вы в отладчике адрес переменной 0x20000A5. Где она расположена? В стеке? В куче? Локальная? Глобальная?
А как посмотреть в отдадчике куда переменная записывается в стек или кучу?
alex1126
Вымогатель припоя
Сообщения: 567
Зарегистрирован: Ср дек 19, 2012 12:16:22

Re: ОЗУ в STM32

Сообщение alex1126 »

[uquote="maksimdag0",url="/forum/viewtopic.php?p=4371277#p4371277"]
maksimdag0 писал(а):ну посмотрите вы в отладчике адрес переменной 0x20000A5. Где она расположена? В стеке? В куче? Локальная? Глобальная?
А как посмотреть в отдадчике куда переменная записывается в стек или кучу?[/uquote]
в этом то весь и вопрос :)
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: ОЗУ в STM32

Сообщение VladislavS »

[uquote="alex1126",url="/forum/viewtopic.php?p=4371271#p4371271"]и они для выделения памяти используют именно malloc.[/uquote]Это ваши фантазии. На самом деле это независимые и равноправные функции стандартной библиотеки. Как их реализовать - дело авторов библиотеки.

[uquote="alex1126",url="/forum/viewtopic.php?p=4371271#p4371271"]ну можно и до физического уровня договорится.[/uquote]Не можно, а нужно с него начинать в эмбедде.
[uquote="alex1126",url="/forum/viewtopic.php?p=4371271#p4371271"]Для начала данной информации достаточно. Да и вообще для 99% случаев данных знаний достаточно.[/uquote]Это вы так решили? Я вот считаю, что знание о возможности размещения переменных в РОН необходимо в 100% случаев.
[uquote="alex1126",url="/forum/viewtopic.php?p=4371271#p4371271"]Многие и этого то не знают.[/uquote]Но они и не кидаются учить.
[uquote="alex1126",url="/forum/viewtopic.php?p=4371271#p4371271"]ну посмотрите вы в отладчике адрес переменной 0x20000A5. Где она расположена? В стеке? В куче? Локальная? Глобальная?[/uquote]Какой ужас...

Добавлено after 6 minutes 28 seconds:
[uquote="maksimdag0",url="/forum/viewtopic.php?p=4371277#p4371277"]А как посмотреть в отдадчике куда переменная записывается в стек или кучу?[/uquote]Переменная не может никуда записываться. Переменная где-то располагается. Записывается (присваивается) значение переменной. А где переменная располагается в отладчике видно.
alex1126
Вымогатель припоя
Сообщения: 567
Зарегистрирован: Ср дек 19, 2012 12:16:22

Re: ОЗУ в STM32

Сообщение alex1126 »

[uquote="VladislavS",url="/forum/viewtopic.php?p=4371344#p4371344"][uquote="alex1126",url="/forum/viewtopic.php?p=4371271#p4371271"]и они для выделения памяти используют именно malloc.[/uquote]Это ваши фантазии. На самом деле это независимые и равноправные функции стандартной библиотеки. Как их реализовать - дело авторов библиотеки.[/uquote]
Не затруднит вас показать какую нить стандартную библиотеку где это независимые и равноправные функции? Просто в Keil, например, это именно так
91B17D4D-EFB2-4DC1-A25F-2E16EA696F31.jpeg
(32.85 КБ) 117 скачиваний
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: ОЗУ в STM32

Сообщение VladislavS »

В IAR realloc без вызова malloc умеет обходиться.
Ответить

Вернуться в «ARM»