Покраска стека (области памяти) Keil uVision

Поделиться
HTML-код
  • Опубликовано: 16 янв 2024
  • Небольшой рассказ о том, как с использованием простого цикла на языке ассемблера, "покрасить" область памяти.
    ; покраска стека выбранным шаблоном
    LDR R0, =Stack_Mem
    LDR R1, =Stack_Size
    LDR R2, =0xAAAAAAAA
    Fill STR R2, [R0], #4
    SUBS R1,#4
    BNE Fill
    Не забывайте подписываться на группу в телеграмм
    Канал в телеграмм - t.me/vladimir_medintsev
  • НаукаНаука

Комментарии • 48

  • @user-ne9ng7pz6s
    @user-ne9ng7pz6s 5 месяцев назад +2

    Автор красава, чётко, лаконично, а главное понятно все объясняет.

  • @Nidvoraich
    @Nidvoraich 5 месяцев назад +8

    Если кому интересно - автор покрасил память в примерно светло-серый цвет

  • @user-bp3hg9fu5t
    @user-bp3hg9fu5t 5 месяцев назад +5

    Было бы интересны ролики, где вы выслеживаете какие-нибудь баги в проектах в отладке. То есть непосредственный опыт. Спасибо за ваши видео!

  • @chepegin
    @chepegin 5 месяцев назад +3

    Очень наглядно и полезно. Спасибо

  • @user-tz2gx7ow7p
    @user-tz2gx7ow7p 5 месяцев назад

    🎉😂❤Ура, ура... 🎉ДождалсяяАААа!

  • @andreykokunin6942
    @andreykokunin6942 5 месяцев назад +2

    Очень хорошая идея. Спасибо.

  • @rxlroman
    @rxlroman 5 месяцев назад +4

    Единственно, стоит паттерн менять, если в коде уже используется подобная константа 0xaaaaaaaa, на что-то менее примелькавшееся. Помнится, в MSVC используется константа 0xcсcсcсcс для заполнения кучи под отладочной сборкой. Так же где-то встречалась 0xdeadbeef.

  • @kestvvv
    @kestvvv 5 месяцев назад +1

    Да. Интересный способ маркирования максимума стека.

  • @konstantinkonyukhov2141
    @konstantinkonyukhov2141 5 месяцев назад +2

    Владимир Валентинович, Ваши видео интересны на любой вопрос в сфере микроэлектроники.

  • @ruslangabitov5202
    @ruslangabitov5202 5 месяцев назад +1

    Владимир, спасибо за видео. Интересная идея, очень красивая в своей простоте.

  • @MonahTuk
    @MonahTuk 5 месяцев назад

    Ещё, это способ вскрыть некоторые проблемы, когда начали использовать неинициализированную область памяти. Ну или скрыть её)

  • @SevenNightdreemVeryPavlovny
    @SevenNightdreemVeryPavlovny 5 месяцев назад

    Если нк ошибаюсь freertos такой же механизм использует для hightwatermark

  • @amischuk
    @amischuk 5 месяцев назад

    Здравствуйте! Как можно выделить память под программный код. Затем провести простейшую компилляцию в этой области - сформировать - вызов функций и после передать на сформированный код управление. Но или возможно подскажите ссылки по данной тематике?

    • @VladimirMedintsev
      @VladimirMedintsev  5 месяцев назад

      У меня есть готовое видео по этой тебе ищите его на канале. Там прям все ответы на ваши вопросы.

    • @amischuk
      @amischuk 5 месяцев назад

      @@VladimirMedintsev Спасибо огромное!!!! Я не так давно стал подписчиком Вашего канала. Всё очень интересно! Посмотрю обязательно.

    • @amischuk
      @amischuk 5 месяцев назад

      @@VladimirMedintsevНо не так давно смотрел Ваше видео по stm32 freertos, к сожалению столкнулся с проблемой, при попытках сделать что-то сложнее чем мигание светодиодами, например параллельный ввод/вывод по прерываниям через UART, контроллер STM32F405RGT6 уходит в незавидное состояние полного не реагирования ни на что - даже светодиоды мигать перестают. В коде сомнений нет, поскольку если вывести прерывания из управления RTOS или поднять приоритет прерывания до нуля, всё работает как часы. В итоге у меня сложилось впечатление, что использовать RTOS для промышленных решений то, что делать как раз не следует. Но а после того, как с той же проблемой - полное подвисание контроллера, столкнулся и для SPI интерфейса, сейчас со всем усердием чищу код в STM32CubeIDE от любых попыток подружиться с параллельным программированием встроенного в оболочку FREERTOS. Всё что Вы показали про freertos для STM32 вне всякого сомнения очень интересно и работает, но вот область применения данной технологии, вернее полное её отсутствие, опечалила.

    • @VladimirMedintsev
      @VladimirMedintsev  5 месяцев назад

      Давайте я уточню, ну просто чтобы исключить неправильное понимание написанного вами. Правильно ли я вас понял что:
      1. Вы создали проект с использованием прерываний и FreeRTOS.
      2. Не потрудились или не смогли найти (путем отладки) причину зависания микроконтроллера.
      3. Сделали вывод что нет сферы применения FreeRTOS.
      Потрясающе.
      Причем вас ни на секунду не смутило, что большинство проектов всё-таки написаны с использованием ОСРВ.

    • @amischuk
      @amischuk 5 месяцев назад

      @@VladimirMedintsev Обижаете! Именно что потрудился найти причину подвисания контроллера. Один процесс читает данные, второй пишет. Определил моменты вызвавшие его подвисания и нашёл пути устранения данной причины, описал их в предыдущем комментарии. И конечно же меня смущает как такую штуку кто-то решается использовать в реальных проектах. В недалёкой перспективе предстоит заниматься ESP32, посмотрю там реализацию FreeRTOS. Но я бы посоветовал десять раз подумать над использованием FreeRTOS встроенного в STM32, если это проект чуть сложнее, чем моргать светодиодами. От себя замечу, каким бы кривым не был код. Контроллер "на ровном месте" уходить в состояние Z по настройкам портов и прерываний, из которого его выводит только перезагрузка, не должен. В Вашем ролике, всё показано верно и концепция использования ОСРВ описана замечательно - мне всё очень понравилось.

  • @proletarian
    @proletarian 5 месяцев назад

    Может кто сталкивался, в макос с arm куб иде не работает китайский st-link v2, говорит надо обновить и даже определяет его и пишет update successfully но ничего не меняется

    • @proletarian
      @proletarian 5 месяцев назад

      При этом platformio прошивает через него

    • @rxlroman
      @rxlroman 5 месяцев назад

      Ютуб не разрешает ссылки. Потому так: Али /item/32861705452.html
      Бывают свистки как у вас, а бывают нормальные. По ссылке выше прошился на V2.J37.S7 и даже SWV удалось спаять.

    • @proletarian
      @proletarian 5 месяцев назад

      @@rxlroman спасибо, заказал

  • @alexandrivanov2197
    @alexandrivanov2197 5 месяцев назад

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

    • @VladimirMedintsev
      @VladimirMedintsev  5 месяцев назад

      Ну вот об этом и речь. Как правило мы увеличиваем стек или когда имеем проблемы или путем оценки, а сколько же места там осталось.

    • @rxlroman
      @rxlroman 5 месяцев назад +1

      Есть статический анализ вызовов, он позволяет оценить потребный стек для вызова конкретной функции со всему ее вложенными вызовами. Но надо учесть обработчики еще и прерываний: максимальный расход постоянных задач + максимальный расход обработчиков + немного на всякий случай.

  • @WWolf_13
    @WWolf_13 5 месяцев назад +1

    тема не раскрыта полностью :)
    в частности, отработка переполнения стэка во FreeRTOS.

    • @VladimirMedintsev
      @VladimirMedintsev  5 месяцев назад

      Во FreeRTOS это отдельная тема. Невозможно в один ролик вместить все знания мира.

    • @WWolf_13
      @WWolf_13 5 месяцев назад +1

      @@VladimirMedintsev , есть к чему стремится :) как минимум для новичков рассказать что кладётся в стэк, а что в кучу... почему так и чем страшно перетирание стэка...

  • @user-tz2gx7ow7p
    @user-tz2gx7ow7p 5 месяцев назад

    Только я кейл перестал пользоваться...
    #1Перерос...
    #2 пароли генераторы😮 перестали работать.

  • @chipsoft1
    @chipsoft1 5 месяцев назад +2

    Как по мне проблема высосана из пальца. Не совсем понятно зачем красить стек. Если хотите отследить выход за пределы стека, то измените в ld файле нижнюю границу стека на 0x20000000. Тогда сразу же при выходе за границы стека вы получите HardFault, И не нужно ничего красить и потом в отладчике на это смотреть. В реальной системе скорее всего не получится этого сделать, когда за 1 секунду приходят десятки или сотни событий которые нужно обрабатывать.

    • @alexandrgonzales6503
      @alexandrgonzales6503 5 месяцев назад

      Это если задача одна, без ртос. С ртос у каждой задачи свой стек будет

    • @chipsoft1
      @chipsoft1 5 месяцев назад

      @@alexandrgonzales6503 Это от RTOS зависит. Некоторые используют общий стек.

  • @Alex_Fedotov
    @Alex_Fedotov 5 месяцев назад

    В кубе с этим проще, там и "красить" ничего не надо, там и так подсвечивается...

  • @user-tz2gx7ow7p
    @user-tz2gx7ow7p 5 месяцев назад

    Мало.

  • @Tunec_s_hlebom
    @Tunec_s_hlebom 5 месяцев назад

    у меня возник вопрос по поводу стека, возможно нубский. Если локальные переменные хранятся на стеке, то как мы тогда можем вернуть из функции указатель на локальную переменную этой функции и получить её в том же main? Функция ведь закончила свое выполнение и должна уйти из стека вместе со своей переменной

    • @VladimirMedintsev
      @VladimirMedintsev  5 месяцев назад +1

      Где вы видели чтобы из функции возвращали указатель на локальную переменную? В функцию передают указатель и функция модифицирует данные по ссылке. Это разные вещи.

    • @Tunec_s_hlebom
      @Tunec_s_hlebom 5 месяцев назад

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

    • @chipsoft1
      @chipsoft1 5 месяцев назад +1

      Вопрос как раз довольно интересный. И если вы его задаете, значит уже не нуб. Вернуть указательна локальную переменную можно, но значение по указателю может быть некорректным, потому как стек разрушился уже. С позволяет таким образом выстрелить себе в ногу. Тоже самое на Rust не даст такое сделать.

    • @user-qk1vf9cg9i
      @user-qk1vf9cg9i 5 месяцев назад

      Парень, с таким знанием Си ролики Мединцева Тебе очень рано смотреть. Указатель на локальную переменную функции

    • @user-qk1vf9cg9i
      @user-qk1vf9cg9i 5 месяцев назад

      Зачем нужно возвращать указатель на локальную функцию при выходе из функции? Каков практический смысл указателя на мусор?

  • @CrazyGeeks
    @CrazyGeeks 5 месяцев назад +2

    Мужчина, у Вас память кричит! Успокойте её, что-ли...

  • @danilmurashkin5145
    @danilmurashkin5145 5 месяцев назад +1

    Только CMSIS только IAR только Хардкор

    • @sozdatelEd
      @sozdatelEd 5 месяцев назад

      а вы случайно не только собственноразработанные контроллеры используете на только своих платах изготовленных из своего текстолита? 😂😂