Всех приветствую! Простите если я не сюда написал. Я сейчас изучаю что такое стек и куча, для чего она нужна и с чем ее едят. После долгих прогулок по просторам интернета вроде бы изучил, но у меня по итогу не складывается картина в целом, так как на некотрых источниках противоречит помему преставлению о стеке и куче. Я хотел ручками поработать с оперативной памятью на STMF401, посомтреть как локальные переменные записываются в стек и как глобальные записываются в кучу, но ничег не получилось, непотно куда что должно записывать и там уже половину оперативки у меня заполнено (так как тестил на написанно программе). Подскажите мне пожалуйста правильное ли у меня представление о стеке и куче?
Оперативная память состоит из двух областей — стек и кучи. В стек записываются локальные переменные, аргументы и все, что связано с функцией, а все остальное (например глобальные переменные) записывается в кучу. Весь остальной код программы хранится в Flash памяти, правильно ли я понимаю?
И как можно на практике поработать со оперативной памятью STM для закрепления знаний?
И как можно на практике поработать со оперативной памятью STM для закрепления знаний?
Смотреть map-файлы и листинги, в режиме отладки смотреть где в памяти что расположено. Только перед этим теорию подтянуть.
Добавлено after 1 hour 2 minutes 6 seconds: Предлагаю сначала разобраться с аппаратным уровнем: блоки/регионы RAM, процессор с регистрами общего назначения (РОН), работой стека.
Затем на аппаратный уровень наложить сущности языков высокого уровня: глобальные, локальные, статические и динамические переменные, а также разного рода константы. Подумать и посмотреть где на аппаратном уровне они могут размещаться.
Вообщем ситуация обстоит примерно так: Память делится на три области - куча (heap), стек, и память данных (статическая область).
В куче место выделяется функцией malloc. И только. Если ты не используешь выделение памяти руками, то можешь в компиляторе запретить кучу. Но надо быть точно уверенным что никто из вызываемых тобой библиотечных функций тоже не использует кучу. Если ты попробуешь выделить памяти больше чем есть, то malloc вернет NULL. Нужно обязательно проверять возвращаемое значение.
В стеке хранятся локальные переменные, там же сохраняются значения переменных и регистров при вызове функций. Размер стека который нужен программе можно рассчитать на этапе компиляции. Но при условии что у тебя нет кучи всяких прерываний, вызываемых одно из другого, каких-нить указателей на функции и прочие неопределенные моменты. Но если у тебя пара таймеров, то можно накинуть пару десяткой байт к вычисленному значению и поймешь необходимый размер стека.
И область данных, где хранится все остальное. Глобальные переменные и переменные которые обозваны static.
В самой памяти стек, как правило, располагается после кучи. А место в стеке выделяется от большего адреса к меньшему, то есть стек заполняется задом наперед и при переполнении он лезет к кучу. Впринципе если он чуток залез, в куче эта область не используемая, то ничего и не произойдет, а если память занята, то будет так называемое переполнение стека. Причем не все МК умеют отслеживать данную ситуацию.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Вам может и не нужен, но в компилятор место наверняка выделяет, если вы ничего не меняли в параметрах. На чем пишите? В KEil-е в файлах проекта, в модулях инициализации, задается распределение памяти, сколько под кучу отводить, сколько под стек. Кстати поэтому совет предыдущего автора бессмысленен - что толку смотреть отладчиком адрес размещения переменных, когда это может быть и стек и куча и статитическая память, в зависимости от настроек проект.
ПС ЗЫ Кстати, данная архитектура, если ее можно так назвать, справедлива и для виндовсов всяких, с небольшими поправками на наличие процессов.
alex1126, при всем уважении, согласен с VladislavS. Вопрос был конкретно про STM32, и рассказывать про кучу и Xalloc/new как минимум вредно (кто там есть аллокатор?).
Настройки проекта в конечном итоге (иначе и быть не может) - это настройки компилятора и компоновщика, так что очень даже полезно посмотреть на флаги и правила, ну и отладчиком убедиться, что никакой магии нет и сборка действует детерминированно, ровно в соответствии с документацией.
Malloc выделяет память уже в процессе работы, в рантайме, если угодно. В микроконтроллерах такой подход применяется далекоооо не всегда. Чаще память выделяется статически, на этапе сборки проекта.
В куче место выделяется функцией malloc. И только.
Даже если не выходить за пределы С, то это и calloc, и realloc. А так как ТС ничего про языки не говорил, то в других найдём ещё кучу способов выделения памяти из кучи.
Кстати поэтому совет предыдущего автора бессмысленен - что толку смотреть отладчиком адрес размещения переменных, когда это может быть и стек и куча и статитическая память, в зависимости от настроек проект.
Во-первых, как настройками проекта можно отправить статическую переменную в кучу, динамическую на стек и т.д.? Во-вторых, в отладчике разве не видно где расположена переменная? Вы им хоть раз пользовались? В-третьих, в отладчике запросто можно увидеть, что локальные переменные хранятся не только в стеке, а в РОН, например. Точно так же как через РОН параметры передаются в функцию и возвращается её результат.
Ну и дальше по тексту... Вы бы не были столь категоричны, если бы почаще заглядывали в map, листинги и отладчик.
Даже если не выходить за пределы С, то это и calloc, и realloc.
и они для выделения памяти используют именно malloc. И я писал дальше, что могут быть библиотечные функции, которые используют malloc
Цитата:
Только типов памяти в контроллере больше, а уж областей и подавно.
ну можно и до физического уровня договорится. Для начала данной информации достаточно. Да и вообще для 99% случаев данных знаний достаточно. Многие и этого то не знают.
Цитата:
Во-первых, как настройками проекта можно отправить статическую переменную в кучу, динамическую на стек и т.д.?
ну посмотрите вы в отладчике адрес переменной 0x20000A5. Где она расположена? В стеке? В куче? Локальная? Глобальная?
А как посмотреть в отдадчике куда переменная записывается в стек или кучу?
Переменная не может никуда записываться. Переменная где-то располагается. Записывается (присваивается) значение переменной. А где переменная располагается в отладчике видно.
Сейчас этот форум просматривают: veso74 и гости: 28
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения