Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

ОЗУ в STM32

Пт фев 10, 2023 15:35:30

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

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

И как можно на практике поработать со оперативной памятью STM для закрепления знаний?

Re: ОЗУ в STM32

Пт фев 10, 2023 18:32:42

правильно ли я понимаю?
Нет.

Добавлено after 5 minutes 16 seconds:
И как можно на практике поработать со оперативной памятью STM для закрепления знаний?
Смотреть map-файлы и листинги, в режиме отладки смотреть где в памяти что расположено. Только перед этим теорию подтянуть.

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

Затем на аппаратный уровень наложить сущности языков высокого уровня: глобальные, локальные, статические и динамические переменные, а также разного рода константы. Подумать и посмотреть где на аппаратном уровне они могут размещаться.

Re: ОЗУ в STM32

Пт фев 10, 2023 19:20:03

Спасибо за наставленный путь, приступлю дальше изучать)

Re: ОЗУ в STM32

Пт фев 10, 2023 20:06:02

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

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

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

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

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

Ну как то так.

Re: ОЗУ в STM32

Пт фев 10, 2023 20:21:54

alex1126, каждое второе утверждение у вас ложное. Не надо с такими познаниями учить.

Re: ОЗУ в STM32

Пт фев 10, 2023 20:54:27

ну подправьте

Re: ОЗУ в STM32

Пт фев 10, 2023 21:00:13

Спасибо за одолжение, но не хочу.

Re: ОЗУ в STM32

Пт фев 10, 2023 23:45:44

alex1126, ну типа если ОС отсутствует, то почти наверняка выделение памяти статическое. Malloc совсем низачем не нужен

Re: ОЗУ в STM32

Сб фев 11, 2023 00:08:30

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

ПС ЗЫ Кстати, данная архитектура, если ее можно так назвать, справедлива и для виндовсов всяких, с небольшими поправками на наличие процессов.

Re: ОЗУ в STM32

Сб фев 11, 2023 00:18:28

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

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

Re: ОЗУ в STM32

Сб фев 11, 2023 00:32:44

А чем выделение памяти в куче на stm32 отличается от .... от чего? Что именно то я не так сказал? malloc.... а с ним что не так?

Re: ОЗУ в STM32

Сб фев 11, 2023 00:35:46

Malloc выделяет память уже в процессе работы, в рантайме, если угодно. В микроконтроллерах такой подход применяется далекоооо не всегда. Чаще память выделяется статически, на этапе сборки проекта.

Re: ОЗУ в STM32

Сб фев 11, 2023 07:42:18

Что именно то я не так сказал? malloc....
Конкретно про malloc вы сказали
В куче место выделяется функцией malloc. И только.
Даже если не выходить за пределы С, то это и calloc, и realloc. А так как ТС ничего про языки не говорил, то в других найдём ещё кучу способов выделения памяти из кучи.

Также, категоричное
Память делится на три области - куча (heap), стек, и память данных (статическая область).
не соответствует действительности. Только типов памяти в контроллере больше, а уж областей и подавно.

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

Ну и дальше по тексту... Вы бы не были столь категоричны, если бы почаще заглядывали в map, листинги и отладчик.

Re: ОЗУ в STM32

Сб фев 11, 2023 09:43:08

Доброго дня! для ясности - я работаю в keil на языке си

Re: ОЗУ в STM32

Вс фев 12, 2023 22:32:05

Даже если не выходить за пределы С, то это и calloc, и realloc.

и они для выделения памяти используют именно malloc. И я писал дальше, что могут быть библиотечные функции, которые используют malloc

Только типов памяти в контроллере больше, а уж областей и подавно.

ну можно и до физического уровня договорится. Для начала данной информации достаточно. Да и вообще для 99% случаев данных знаний достаточно. Многие и этого то не знают.

Во-первых, как настройками проекта можно отправить статическую переменную в кучу, динамическую на стек и т.д.?

ну посмотрите вы в отладчике адрес переменной 0x20000A5. Где она расположена? В стеке? В куче? Локальная? Глобальная?

Re: ОЗУ в STM32

Вс фев 12, 2023 22:47:39

maksimdag0 писал(а):ну посмотрите вы в отладчике адрес переменной 0x20000A5. Где она расположена? В стеке? В куче? Локальная? Глобальная?


А как посмотреть в отдадчике куда переменная записывается в стек или кучу?

Re: ОЗУ в STM32

Вс фев 12, 2023 23:01:06

maksimdag0 писал(а):ну посмотрите вы в отладчике адрес переменной 0x20000A5. Где она расположена? В стеке? В куче? Локальная? Глобальная?


А как посмотреть в отдадчике куда переменная записывается в стек или кучу?

в этом то весь и вопрос :)

Re: ОЗУ в STM32

Пн фев 13, 2023 03:23:52

и они для выделения памяти используют именно malloc.
Это ваши фантазии. На самом деле это независимые и равноправные функции стандартной библиотеки. Как их реализовать - дело авторов библиотеки.

ну можно и до физического уровня договорится.
Не можно, а нужно с него начинать в эмбедде.
Для начала данной информации достаточно. Да и вообще для 99% случаев данных знаний достаточно.
Это вы так решили? Я вот считаю, что знание о возможности размещения переменных в РОН необходимо в 100% случаев.
Многие и этого то не знают.
Но они и не кидаются учить.
ну посмотрите вы в отладчике адрес переменной 0x20000A5. Где она расположена? В стеке? В куче? Локальная? Глобальная?
Какой ужас...

Добавлено after 6 minutes 28 seconds:
А как посмотреть в отдадчике куда переменная записывается в стек или кучу?
Переменная не может никуда записываться. Переменная где-то располагается. Записывается (присваивается) значение переменной. А где переменная располагается в отладчике видно.

Re: ОЗУ в STM32

Пн фев 13, 2023 12:58:18

и они для выделения памяти используют именно malloc.
Это ваши фантазии. На самом деле это независимые и равноправные функции стандартной библиотеки. Как их реализовать - дело авторов библиотеки.

Не затруднит вас показать какую нить стандартную библиотеку где это независимые и равноправные функции? Просто в Keil, например, это именно так
91B17D4D-EFB2-4DC1-A25F-2E16EA696F31.jpeg
(32.85 KiB) Скачиваний: 46

Re: ОЗУ в STM32

Пн фев 13, 2023 15:30:18

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