Спасибо за познавательное видео. От себя могу добавить, что есть еще одна возможная проблема, связанная с использованием динамической памяти, а именно "фрагментация кучи" - вещь еще более коварная, т.к. последствия могут проявиться не сразу, а в процессе длительной работы МК.
Интересно. Был у меня когда-то вопрос, когда Я только начинал программировать на ардуино связанный с выделением памяти в функциях. Т.е. когда поток выполнения попадает в функцию в которой используются какие-то переменные, массивы, то под них выделяется память, а по выходу из функции, память этой функции очищается. Первый вопрос, какая тогда разница между динамической памятью и памятью выделяемой в функции, в контексте МК у которого этой памяти крайне мало и продумывать код который будет без контрольнно выделять память бессмысленно, а такое может случиться... По стечению лет, вопрос отпал сам собой) Второй вопрос, как отследить этот момент, что память уже кончилась или кончается при попадании в функцию и выделении памяти на эту функцию? *Как то у меня был момент, когда в большом проекте мне надо было опрашивать ESP32 через AT команды и искать Wi-Fi без пароля и выводить все названия точек доступа на экран. В какой-то момент, терминал ардуино начинал сбоить и выводить бессвязные символы, а программа начинала исполняться не корректно.
Спасибо за контент! Как всегда по делу и очень полезно. Есть ли в планах видео, посвященные применению Rust и Zig для разработки на МК (RISC-V, STM32, AVR)? Еще очень интересен вопрос выбора МК в зависимости от требуемого объема вычислений. Например, что выбрать для реализации звука (44100, минимум 16 бит) и DSP в реальном времени? Как правильно подсчитать нагрузку?
Я полностью понимаю ваши слова о теракте в ТЦ в начале видео - но извините, это маразм, такое заявлять "те кто будет плясать на костях", при том что ваша страна в тот же день утром запустила более десятка шахедов и ракет по соседней стране по гражданским объектам.
Смешались в кучу кони, люди... (С) И Пригожин тут уже помянут, и црушная помойка википедия как источник правды, где модераторы русского сегмента все знаете какой нации? :) Вы не понимаете, о чем я говорю, видимо скудоумие ваше все. Ведь у ваших родителей такое же советское образование, как у меня и моих, куда вы все просрали?! Кто бы по вашему мнению не сжег кого в Доме профсоюзов, в вашей стране массово смеялись над этим! Называли кафешки и блюда в "честь" славной победы! И для альтернативно-одаренных, как только вы по поводу теракта пытаетесь сознательно или подспудно переводить стрелки на Царя или Пригожина или еще кого, вы самой постановкой ОПРАВДЫВАЕТЕ ТЕРОРИЗМ! С вами, скотами, мне говорить не о чем.
@@bcdbcd7116то что ципсошные выруси пишут в куче видео - не является правдой. Они только фекальные массы на вентилятор накидывают дабы оправдать своё (и не только) существование.
Пока так и не понял , по этому вопрос : Обязательно нужно ли прописывать в коде удаление указателя на динамический массив и сам массив ? Нигде в ардуиновских кодах не встречал delete , но все ютюбучителя С++ настаивают на этом.
Смотря как используется этот массив. Если постоянно с момента создания - то зачем его удалять? Если же временно, то конечно надо освобождать память. В коде для МК во многих классах нет деструкторов, потому что типа нет нужды освобождать ресурсы, т.к. объекты чаще всего существуют до конца, потому что конца то и нет. Но это очень спорно...
@@alexmorozov73 , если в loop вызывается функция которая при отсутствии контекста с роутером читает с ЕЕПРОМ (имя и пароль) и создает эти массивы для последующего WIFi.connect (name, password); , то есть в бесконечном ходе программы происходит такое создание рандомно . Немного поразмыслив предполагаю , что такие массивы должны попадать именно в СТЕК , и значит при выходе из функции - память очистится без ее ,,утечки,, ... Правильны ли мои умозаключения ? . И конечно же БОЛЬШОЕ СПАСИБО , за оказанное мне внимание . Но не уж то указатель на массив тоже попадает в СТЕК ?..
Если массив не динамический, то нет никакого "указателя", есть область памяти и имя переменной массива заменяется при использовании на адрес его первого элемента.
@@alexmorozov73 , да ,это я хорошо усвоил в первую очередь благодаря Вашему уроку о арифметике указателей . Но я о : unsigned char * buff_ssid = new unsigned char [32] ; . На этот момент я полагаю , что непрерывная область памяти под массив из 32 байт помещается в стек , но указатель на адрес первого байта массива ,(по моему) должен попадать в КУЧУ. Вот и не понимаю , стоит ли тратить ROM на дополнительный код их удаления .
Вызовы malloc/new в любом контексте выделяют именно динамическую память. Так что в вашем случае указатель лежит на стеке, а место, куда он указывает - в динамической памяти. Как вышли из функции, так адрес выделенного блока потеряли и его уже не освободить. Так что или используйте умные указатели (они сами заботятся об освобождении выделенной памяти при выходе из области видимости), или освобождайте ее сами перед выходом из функции или держите весь небольшой массив на стеке.
Добрый день. Вопрос от полуламера - в чём вообще смысл произвольного выделения динамической памяти на микроконтроллерах в небольших/средних проектах? Я может чего то не понимаю, но вроде в МК есть встроенный аппаратный шедулер для выделения/удаления всех не статических данных?
Как столкнетесь с реальной задачей, так подобные вопросы сами собой пропадут. И фантазии на тему "аппаратных шедулеров для памяти" в МК. :) Например, хотя бы разбор или формирование HTTP или JSON пакета. По факту весь ESP-IDF построен на структурах в динамической памяти.
@@alexmorozov73 Спасибо за ответ. З.Ы. по поводу аппаратного это да, что то я фигню написал) Думал про одно, а пальцы набрали другое... Имел в виду команды вшитые в среду разработки... Именно то про что Вы говорили в начале видео - память перестаёт (вроде бы) выделяться после выхода из функции где была вызвана переменная.
Огромное спасибо за ваши уроки! Не в тему данного видео, хотел бы попросить вас найти время и рассказать о самой работе программиста микроконтроллеров, о вашем опыте и над какими проектами работали, дать советы новичкам кто только устроился и начинает свой трудовой путь.
Увы, я не программист МК и на ваши вопросы у меня нет ответов. Это просто хобби, скорее зарядка для ума. Да, я иногда делаю проекты на заказ, но только те, которые мне интересны и являются каким-нибудь вызовом обыденности.
Лучи добра и поддержки всем здравомыслящим! Спасибо вам
Спасибо, очень полезная информация.
Спасибо за познавательное видео. От себя могу добавить, что есть еще одна возможная проблема, связанная с использованием динамической памяти, а именно "фрагментация кучи" - вещь еще более коварная, т.к. последствия могут проявиться не сразу, а в процессе длительной работы МК.
Только сегодня увидел видео. Соболезнования всем родным погибших! Нужно найти виновников этого ЧУДОВИЩНОГО терракта!
Привет из солнечного Ташкента, большое спасибо за полезную информацию 👍
Интересно. Был у меня когда-то вопрос, когда Я только начинал программировать на ардуино связанный с выделением памяти в функциях. Т.е. когда поток выполнения попадает в функцию в которой используются какие-то переменные, массивы, то под них выделяется память, а по выходу из функции, память этой функции очищается.
Первый вопрос, какая тогда разница между динамической памятью и памятью выделяемой в функции, в контексте МК у которого этой памяти крайне мало и продумывать код который будет без контрольнно выделять память бессмысленно, а такое может случиться... По стечению лет, вопрос отпал сам собой)
Второй вопрос, как отследить этот момент, что память уже кончилась или кончается при попадании в функцию и выделении памяти на эту функцию?
*Как то у меня был момент, когда в большом проекте мне надо было опрашивать ESP32 через AT команды и искать Wi-Fi без пароля и выводить все названия точек доступа на экран. В какой-то момент, терминал ардуино начинал сбоить и выводить бессвязные символы, а программа начинала исполняться не корректно.
Спасибо за контент! Как всегда по делу и очень полезно. Есть ли в планах видео, посвященные применению Rust и Zig для разработки на МК (RISC-V, STM32, AVR)? Еще очень интересен вопрос выбора МК в зависимости от требуемого объема вычислений. Например, что выбрать для реализации звука (44100, минимум 16 бит) и DSP в реальном времени? Как правильно подсчитать нагрузку?
Ничего такого в планах нет
Я полностью понимаю ваши слова о теракте в ТЦ в начале видео - но извините, это маразм, такое заявлять "те кто будет плясать на костях", при том что ваша страна в тот же день утром запустила более десятка шахедов и ракет по соседней стране по гражданским объектам.
Маразм - это теракт сравнивать с боевыми действиями. После 2 мая в Одессе еще не наплясались?
Смешались в кучу кони, люди... (С)
И Пригожин тут уже помянут, и црушная помойка википедия как источник правды, где модераторы русского сегмента все знаете какой нации? :)
Вы не понимаете, о чем я говорю, видимо скудоумие ваше все. Ведь у ваших родителей такое же советское образование, как у меня и моих, куда вы все просрали?!
Кто бы по вашему мнению не сжег кого в Доме профсоюзов, в вашей стране массово смеялись над этим! Называли кафешки и блюда в "честь" славной победы!
И для альтернативно-одаренных, как только вы по поводу теракта пытаетесь сознательно или подспудно переводить стрелки на Царя или Пригожина или еще кого, вы самой постановкой ОПРАВДЫВАЕТЕ ТЕРОРИЗМ! С вами, скотами, мне говорить не о чем.
@@alexmorozov73 Думаю лучше такие темы сдесь не обсуждать. Никого нельзя переубедить у всех своя правда. Поетому сдесь техникой заниматься ефективнее.
@@alexmorozov73всё понятно, ты Zтник с промытыми мозгами. Я думал адекватный, а оказался полный набор "8 лет дамбили бомбас".
@@bcdbcd7116то что ципсошные выруси пишут в куче видео - не является правдой. Они только фекальные массы на вентилятор накидывают дабы оправдать своё (и не только) существование.
✌️
Пока так и не понял , по этому вопрос : Обязательно нужно ли прописывать в коде удаление указателя на динамический массив и сам массив ? Нигде в ардуиновских кодах не встречал delete , но все ютюбучителя С++ настаивают на этом.
Смотря как используется этот массив. Если постоянно с момента создания - то зачем его удалять? Если же временно, то конечно надо освобождать память.
В коде для МК во многих классах нет деструкторов, потому что типа нет нужды освобождать ресурсы, т.к. объекты чаще всего существуют до конца, потому что конца то и нет. Но это очень спорно...
@@alexmorozov73 , если в loop вызывается функция которая при отсутствии контекста с роутером читает с ЕЕПРОМ (имя и пароль) и создает эти массивы для последующего WIFi.connect (name, password); , то есть в бесконечном ходе программы происходит такое создание рандомно .
Немного поразмыслив предполагаю , что такие массивы должны попадать именно в СТЕК , и значит при выходе из функции - память очистится без ее ,,утечки,, ... Правильны ли мои умозаключения ? . И конечно же БОЛЬШОЕ СПАСИБО , за оказанное мне внимание .
Но не уж то указатель на массив тоже попадает в СТЕК ?..
Если массив не динамический, то нет никакого "указателя", есть область памяти и имя переменной массива заменяется при использовании на адрес его первого элемента.
@@alexmorozov73 , да ,это я хорошо усвоил в первую очередь благодаря Вашему уроку о арифметике указателей . Но я о : unsigned char * buff_ssid = new unsigned char [32] ; . На этот момент я полагаю , что непрерывная область памяти под массив из 32 байт помещается в стек , но указатель на адрес первого байта массива ,(по моему) должен попадать в КУЧУ. Вот и не понимаю , стоит ли тратить ROM на дополнительный код их удаления .
Вызовы malloc/new в любом контексте выделяют именно динамическую память. Так что в вашем случае указатель лежит на стеке, а место, куда он указывает - в динамической памяти. Как вышли из функции, так адрес выделенного блока потеряли и его уже не освободить.
Так что или используйте умные указатели (они сами заботятся об освобождении выделенной памяти при выходе из области видимости), или освобождайте ее сами перед выходом из функции или держите весь небольшой массив на стеке.
Вспоминается "64 килобайта хватит всем" ©
640 КБ, а не 64. Вы видимо и не програмили в это время и даже не знаете о чем речь.
Добрый день. Вопрос от полуламера - в чём вообще смысл произвольного выделения динамической памяти на микроконтроллерах в небольших/средних проектах? Я может чего то не понимаю, но вроде в МК есть встроенный аппаратный шедулер для выделения/удаления всех не статических данных?
Как столкнетесь с реальной задачей, так подобные вопросы сами собой пропадут. И фантазии на тему "аппаратных шедулеров для памяти" в МК. :)
Например, хотя бы разбор или формирование HTTP или JSON пакета.
По факту весь ESP-IDF построен на структурах в динамической памяти.
@@alexmorozov73 Спасибо за ответ. З.Ы. по поводу аппаратного это да, что то я фигню написал) Думал про одно, а пальцы набрали другое... Имел в виду команды вшитые в среду разработки... Именно то про что Вы говорили в начале видео - память перестаёт (вроде бы) выделяться после выхода из функции где была вызвана переменная.
Огромное спасибо за ваши уроки! Не в тему данного видео, хотел бы попросить вас найти время и рассказать о самой работе программиста микроконтроллеров, о вашем опыте и над какими проектами работали, дать советы новичкам кто только устроился и начинает свой трудовой путь.
Увы, я не программист МК и на ваши вопросы у меня нет ответов.
Это просто хобби, скорее зарядка для ума. Да, я иногда делаю проекты на заказ, но только те, которые мне интересны и являются каким-нибудь вызовом обыденности.
В моей стране уже 10лет СвО😮😢.
Всех найдём, всех....
лучше не делать динамическое выделение имхо, если уж на то пошло, лучше в сторону очередей посмотреть
А очереди по вашему какую память используют? :)