Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.95/39: Рейтинг темы: голосов - 39, средняя оценка - 4.95
4 / 4 / 1
Регистрация: 24.04.2022
Сообщений: 79

Реальные адреса из МК

05.05.2022, 11:00. Показов 9548. Ответов 99
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как найти реальные адреса под которыми всё находится в МК?
Ассемблер я не понимаю.

Две программы (STM32 ST-LINK Utility и STM32CubeProgrammer) показывают один и тот же результат. Не похоже на то чтоб это была только интерпретация отдельной программы.
Может это реальные адреса и расположение внутри МК?
Миниатюры
Реальные адреса из МК  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.05.2022, 11:00
Ответы с готовыми решениями:

Показывать реальные IP адреса пользователей
Добро день ув. знатоки. Вопрос по настройке open servera или CMS Drupal. У меня есть сайт, который работает на Open servre, все...

Можно ли отдавать реальные IP адреса при проксировании в Apache?
Здравствуйте. Имеется Ubuntu Server, на нём Apache2. Apache2 проксирует некое веб-приложение, которое находится на другом сервере в...

Реальные/ виртуальные
Купил ноутбук. там процессор Intel core i5 460M 2.53 ГГц. Продовец-консультант сказал что процессор четырёх ядерный, дома посмотрел...

99
 Аватар для COKPOWEHEU
4146 / 2724 / 433
Регистрация: 09.09.2017
Сообщений: 12,065
07.05.2022, 15:27
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от locm Посмотреть сообщение
Разве это значение для SP не является указателем на начало стека? Тогда зачем было разводить столько оффтопа?
Еще раз: это значение инициализации, а не указатель.
А про оффтоп у вас спросить надо, вы же его разводите, не я.
Цитата Сообщение от locm Посмотреть сообщение
То что упоминание вершины стека тоже некорректно. Правильнее - адрес начала стека.
Чем вам не нравится стандартная терминология "вершина" и "дно" стека? Гораздо лучше, чем какое-то "начало".
Но вы не ответили на вопрос: зачем вы одно и то же повторили столько раз?
Цитата Сообщение от locm Посмотреть сообщение
Если стек растет снизу в верх (увеличиваются адреса, а не уменьшаются). По сути нужно передавать адрес на "дно"
Еще раз спрашиваю: кому нужно дно стека? Оно же не меняется. Меняется вершина - неважно, в какую сторону стек растет.
Цитата Сообщение от locm Посмотреть сообщение
Вершина внизу а дно сверху?
Конечно. А вы этого не знали?!
Цитата Сообщение от locm Посмотреть сообщение
Когда я написал про указатель вам это сильно не понравилось. Налицо политика двойных стандартов!
Цитату в студию. Я не понимаю о чем вы сейчас говорите.
0
Эксперт по электронике
7150 / 3329 / 342
Регистрация: 28.10.2011
Сообщений: 13,138
Записей в блоге: 7
07.05.2022, 16:38
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Еще раз: это значение инициализации, а не указатель.
Вы сами написали что указатель
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
по адресу 0x0800`0000 лежит указатель на стек. Ну а поскольку единственный указатель на стек, который нужен для его работы - вершина, логично сделать вывод, что по адресу 0x0800`0000
Как по вашему понимать 0x20005000? Это адрес начала стека, т. е. указатель.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А про оффтоп у вас спросить надо, вы же его разводите, не я.
Еще напишите что это мое сообщение! Реальные адреса из МК

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Чем вам не нравится стандартная терминология "вершина" и "дно" стека?
А чем вам не нравится термин "начало стека"?

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Гораздо лучше, чем какое-то "начало".
Почему лучше? Сразу понятно что с этого адреса начинается стек. А в случае вершины и роста стека вверх, получается абсурд, т. к. вершина внизу а дно сверху. Это нелогично.
А вообще это вы прикопались к фразе "начало стека". Реальные адреса из МК
Видимо тупо потролить захотелось.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Еще раз спрашиваю: кому нужно дно стека?
Видимо вам. Я про него ничего не писал. Я писал про начало стека!

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Цитату в студию.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Только не указатель на стек, а дефолтное значение вершины стека.
0
 Аватар для COKPOWEHEU
4146 / 2724 / 433
Регистрация: 09.09.2017
Сообщений: 12,065
07.05.2022, 16:51
Цитата Сообщение от locm Посмотреть сообщение
Как по вашему понимать 0x20005000?
В общем случае это просто число. В конкретном - значение инициализации.
Цитата Сообщение от locm Посмотреть сообщение
Еще напишите что это мое сообщение! Реальные адреса из МК
Еще скажите, что оно оффтоп!
Цитата Сообщение от locm Посмотреть сообщение
А чем вам не нравится термин "начало стека"?
Тем, что он обычно не используется при работе со стеком, в отличие от дна и вершины.
Цитата Сообщение от locm Посмотреть сообщение
Почему лучше? Сразу понятно что с этого адреса начинается стек. А в случае вершины и роста стека вверх, получается абсурд, т. к. вершина внизу а дно сверху. Это нелогично.
Что поделать, вот такая сложилась терминология.
Цитата Сообщение от locm Посмотреть сообщение
Видимо тупо потролить захотелось.
Я уже выше повторил всю суть нашего обсуждения: вы с умным видом написали вводящий в заблуждение пост. Я вас поправил. Вы начинаете спорить и ругаться на ровном месте.
Пока что мы выяснили, что вы совсем недавно узнали как может быть организован стек (интересно, то, что его можно в том числе на основе связного списка сделать, для вас тоже новость?); что совсем недавно узнали где у стека дно, а где вершина. Чем начальное значение указателя отличается от самого указателя вы, похоже, пока не узнали.
Ознакомьтесь, откуда в переменные попадают их значения инициализации. Учитывая, что сразу после ресета в оперативке находится только мусор.
Цитата Сообщение от locm Посмотреть сообщение
Сообщение от COKPOWEHEU
Цитата Сообщение от COKPOWEHEU
Я просил не рандомную цитату, а имнно ту, где вы углядели двойные стандарты.
0
4 / 4 / 1
Регистрация: 24.04.2022
Сообщений: 79
07.05.2022, 17:10  [ТС]
Я вообще ничего не понял. Указатель на стек во флеше, да ещё и в первом адресе.
Стек в процессе работы программы перезаписывается кучу раз. Так жизни МК не хватит чтоб Стек во флеше держать.
Не важно.
Вроде бы это немного не по теме.
0
Эксперт по электронике
7150 / 3329 / 342
Регистрация: 28.10.2011
Сообщений: 13,138
Записей в блоге: 7
07.05.2022, 17:46
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
В конкретном - значение инициализации.
Инициализации чего? Погоды на Марсе?
В данном случае это начальный адрес стека. Запомните это!

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Тем, что он обычно не используется при работе со стеком,
То что вы его не используете не значит что не используют другие.
Я думаю все должны понимать что означает фраза "начало стека".

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
вы с умным видом написали вводящий в заблуждение пост
Ничего подобного. Я написал
Цитата Сообщение от locm Посмотреть сообщение
по умолчанию по этому адресу находится указатель на стек
Именно указатель на начало стека обычно находится по адресу 0x08000000 (стертый МК или кривую прошивку в расчет не берем).

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
совсем недавно узнали где у стека дно, а где вершина.
Я прекрасно это знал, но применил более уместный и простой термин, который более понятный начинающим.
Если хотите можете объяснить ТС что такое стек.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Чем начальное значение указателя отличается от самого указателя вы, похоже, пока не узнали.
Я же написал что под указателем подразумевал адрес начала стека. Это логично т. к. указатель это адрес на то что указывает. Вы просто придираетесь к словам.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Ознакомьтесь, откуда в переменные попадают их значения инициализации. Учитывая, что сразу после ресета в оперативке находится только мусор.
Прикалываться (троллить) не надо, ладно!

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Я просил не рандомную цитату
Вы попросили цитату Я ее привел. Это не случайная цитата, а та с которой вы начали придирки.

Цитата Сообщение от getstm32 Посмотреть сообщение
Указатель на стек во флеше, да ещё и в первом адресе.
Документацию читайте. Там все написано.
Про таблицу векторов прерываний тоже не слышали?

Цитата Сообщение от getstm32 Посмотреть сообщение
тек в процессе работы программы перезаписывается кучу раз. Так жизни МК не хватит чтоб Стек во флеше держать.
Никто не писал что стек во флеше. В нем хранится указать не начало стека. COKPOWEHEU, называет его вершиной, но не суть. Смысл тот же.
0
4 / 4 / 1
Регистрация: 24.04.2022
Сообщений: 79
07.05.2022, 17:53  [ТС]
Что такое стек мне не надо объяснять, спс.
0
 Аватар для COKPOWEHEU
4146 / 2724 / 433
Регистрация: 09.09.2017
Сообщений: 12,065
07.05.2022, 20:11
Цитата Сообщение от getstm32 Посмотреть сообщение
Я вообще ничего не понял. Указатель на стек во флеше, да ещё и в первом адресе.
Стек в процессе работы программы перезаписывается кучу раз. Так жизни МК не хватит чтоб Стек во флеше держать.
Об этом я и говорю: locm ввел вас в заблуждение.
Стек расположен обычно в конце оперативной памяти и растет в сторону начала. Текущий указатель вершины стека хранится в регистре SP. При старте он инициализируется значением из флеша, лежащим по адресу по адресу 0x0800`0000. Собственно, на этом участие флеша в работе стека и заканчивается.
Цитата Сообщение от getstm32 Посмотреть сообщение
Что такое стек мне не надо объяснять, спс.
Да? В таком случае расскажите нам. Что значит "положить на стек", "снять со стека", какие возможны ошибки при его использовании? Можно ли им пользоваться в обход стандартных push/pop, если да, то как?
Цитата Сообщение от locm Посмотреть сообщение
Инициализации чего? Погоды на Марсе?
Прекращайте принимать вещества.
Цитата Сообщение от locm Посмотреть сообщение
Я думаю все должны понимать что означает фраза "начало стека".
Нет, максимум могут угадать. Но все понимают, что такое вершина стека.
Цитата Сообщение от locm Посмотреть сообщение
Именно указатель на начало стека обычно находится по адресу 0x08000000 (стертый МК или кривую прошивку в расчет не берем).
Еще раз: не указатель, а значение инициализации указателя. И в такой формулировке уже не приходится вводить "стертый МК и кривую прошивку". Начальное значение оно начальное значение и есть, имеет ли оно какой-то физический смысл ядро не волнует.
Цитата Сообщение от locm Посмотреть сообщение
Я же написал что под указателем подразумевал адрес начала стека.
Вы так и не ответили на вопрос кому и зачем нужен указатель на дно ("начало") стека. А если они никому не нужен, то что, производители МК идиоты, вводящие бесполезные сущности?
Цитата Сообщение от locm Посмотреть сообщение
Вы попросили цитату Я ее привел.
Из цитаты должно быть видно, к чему же конкретно вы пытаетесь придраться. Из вашей цитаты этого НЕ видно, поэтому эта цитата и названа рандомной.
0
87 / 86 / 4
Регистрация: 20.11.2016
Сообщений: 270
07.05.2022, 21:44
Я правильно понимаю что если при инициализации в указатель стека заносится значение 0x2000'5000, то его величина составляет 20 КБ и по мере заполнения стека его указатель приближается к значению 0x2000'0000 ?
0
4 / 4 / 1
Регистрация: 24.04.2022
Сообщений: 79
07.05.2022, 22:31  [ТС]
В контексте МК про стек конечно недостаточно знаю, но этим я буду позже заниматься.

Мне кажется или я неправильно понял или это бессмысленно.
По адресу 0x08000000 хранится указатель на вершину стека?
Адрес вершины стека постоянно разный, так как в стек приходят новые данные, то они ложатся сверху.
Цитата Сообщение от locm Посмотреть сообщение
Никто не писал что стек во флеше. В нем хранится указать не начало стека.
Получается и указатель по адресу во флеше 0x08000000 постоянно должен перезаписываться так как вершина стека постоянно смещается с приходом новых данных в стек.
Получается этот адрес 0x08000000 во флеше зарезервирован под указатель на начало стека?
Почему бы не защитить этот адрес 0x08000000 от записи раз он так важен?
У меня это находится по адресу 0x08000000:
00 20 00 10 ED 0F 00 08
Получается это hex адрес на начало стека? 200010ED0F0008

Нигде не видел я предупреждений о том что нельзя записывать во флеш по адресу 0x08000000
Я думал что начиная с адреса 0x08000000 можно писать свой код

Я видел где то статью об опасности когда стек становится слишком большим и затирает код.
Тоже странная ситуация что нет рамок у стека.
Миниатюры
Реальные адреса из МК  
0
4 / 4 / 1
Регистрация: 24.04.2022
Сообщений: 79
07.05.2022, 22:37  [ТС]
https://habr.com/ru/post/443030/
0
Эксперт по электронике
7150 / 3329 / 342
Регистрация: 28.10.2011
Сообщений: 13,138
Записей в блоге: 7
07.05.2022, 23:46
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Об этом я и говорю: locm ввел вас в заблуждение.
Я никого не вводил в заблуждение. Это ваши домыслы.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Вы так и не ответили на вопрос кому и зачем нужен указатель на дно ("начало") стека.
Почему вы решили что начало это дно? Я ничего подобного не писал. Вроде умный человек а элементарных вещей не понимаете. И просто хотите потролить?

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Из цитаты должно быть видно, к чему же конкретно вы пытаетесь придраться
Я ни к чему. Это вы придираетесь начиная с этого сообщения Реальные адреса из МК

Цитата Сообщение от getstm32 Посмотреть сообщение
Получается и указатель по адресу во флеше 0x08000000 постоянно должен перезаписываться так как вершина стека постоянно смещается с приходом новых данных в стек.
Я же написал
Цитата Сообщение от locm Посмотреть сообщение
Он хранится во флеше. Ведь согласитесь, когда нет питания, в регистре он хранится не может.
При старте копируется из флеша в регистр
Воспользуйтесь отладчиком и понаблюдайте за регистром SP процессора и за содержимым флеша.

Цитата Сообщение от getstm32 Посмотреть сообщение
Получается этот адрес 0x08000000 во флеше зарезервирован под указатель на начало стека?
4 байта по этому адресу по умолчанию используются под указатель на начало стека.

Цитата Сообщение от getstm32 Посмотреть сообщение
Почему бы не защитить этот адрес 0x08000000 от записи раз он так важен?
Оно и так защищено. Прямой записью как вы хотите, изменить содержимое флеша не получится. А если сделать по всем правилам с разблокировкой флеша и стиранием страницы, то ССЗБ тот кто намерено затрет таблицу векторов прерываний.

Цитата Сообщение от getstm32 Посмотреть сообщение
У меня это находится по адресу 0x08000000:
00 20 00 10 ED 0F 00 08
Первые 4 байта - адрес стека.
Следующие 4 байта - адрес начала выполнения прошивки, т. е. стартовая функция.
Какая модель МК?

Цитата Сообщение от getstm32 Посмотреть сообщение
Получается это hex адрес на начало стека? 200010ED0F0008
Сколько это байт?

Цитата Сообщение от getstm32 Посмотреть сообщение
Нигде не видел я предупреждений о том что нельзя записывать во флеш по адресу 0x08000000
Записывать не запрещено и при прошивке адрес стека и остальное переписывается. Но если вы в него запишите произвольные данные, МК не будет работать.

Цитата Сообщение от getstm32 Посмотреть сообщение
Я думал что начиная с адреса 0x08000000 можно писать свой код
В который раз пишу - читайте документацию.
1
4 / 4 / 1
Регистрация: 24.04.2022
Сообщений: 79
08.05.2022, 00:08  [ТС]
Ок, вот 4 Байт: 200010ED
Это в 64 разрядной системе адрес хранится в 8 Байтах.
С какого адреса во флеш можно писать, не опасаясь затереть что то нужное?
Цитата Сообщение от getstm32 Посмотреть сообщение
Получается и указатель по адресу во флеше 0x08000000 постоянно должен перезаписываться так как вершина стека постоянно смещается с приходом новых данных в стек.
В течении работы программы указатель на стек должен меняться, так как стек растёт и указатель на вершину всегда разный.
Значит по адресу 0x08000000 в течении работы программы должно быть постоянно новое значение.
Непонятно. Ок, разберусь.
0
Эксперт по электронике
7150 / 3329 / 342
Регистрация: 28.10.2011
Сообщений: 13,138
Записей в блоге: 7
08.05.2022, 00:20
Цитата Сообщение от getstm32 Посмотреть сообщение
С какого адреса во флеш можно писать, не опасаясь затереть что то нужное?
Причем здесь ОЗУ?
Пишите в свободную область. Обычно для этого используется последняя страница. Смотрите сколько флеш-памяти в МК, какой размер страницы и вычисляйте ее начальный адрес.

Цитата Сообщение от getstm32 Посмотреть сообщение
В течении работы программы указатель на стек должен меняться
Во флеше хранится начальный адрес. При старте он копируется в регистр процессора и в нем меняется.

Цитата Сообщение от getstm32 Посмотреть сообщение
Значит по адресу 0x08000000 в течении работы программы должно быть постоянно новое значение.
Отладчик вам в помощь раз не хотите читать документацию.
1
4 / 4 / 1
Регистрация: 24.04.2022
Сообщений: 79
08.05.2022, 00:44  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
Причем здесь ОЗУ?
Не понял. ОЗУ(SRAM) у меня в МК начинается с адреса 0x2000 0000
А флеш это не ОЗУ.
Флеш -это ПЗУ. В нём память хранится. В ОЗУ всё исчезает после завершения работы программы.
Цитата Сообщение от locm Посмотреть сообщение
Пишите в свободную область.
Флеш начинается с адреса 0x08000000, чем это не свободная область?
Цитата Сообщение от locm Посмотреть сообщение
Во флеше хранится начальный адрес. При старте он копируется в регистр процессора и в нем меняется.
Для регистров и портов отведены адреса, только стек не знает где начинаться?
Это ведь мне кажется такая системная информация о которой я ничего знать не должен, ибо зачем.
0
 Аватар для COKPOWEHEU
4146 / 2724 / 433
Регистрация: 09.09.2017
Сообщений: 12,065
08.05.2022, 09:33
Цитата Сообщение от Radikal_78 Посмотреть сообщение
Я правильно понимаю что если при инициализации в указатель стека заносится значение 0x2000'5000, то его величина составляет 20 КБ и по мере заполнения стека его указатель приближается к значению 0x2000'0000 ?
Да
Цитата Сообщение от getstm32 Посмотреть сообщение
Получается этот адрес 0x08000000 во флеше зарезервирован под указатель на начало стека?
Не совсем так. Начиная с адреса 0x0800`0000 находится таблица векторов прерываний. При желании ее можно переместить в другое место. Но первые два машинных слова отведены под служебные нужды: инициализацию SP и PC.
Если что, PC - program counter, адрес текущей выполняемой инструкции.
Само по себе значение инициализации обычно соответствует максимальному адресу оперативки. А в разных контроллерах количество памяти разное.
Кстати, подобные извращения с SP, PC это далеко не единственный способ. Чаще SP инициализируется в коде вручную, в PC начинается с нуля.
Цитата Сообщение от getstm32 Посмотреть сообщение
У меня это находится по адресу 0x08000000:
00 20 00 10 ED 0F 00 08
Получается это hex адрес на начало стека? 200010ED0F0008
Сдается мне, вы что-то неправильное прочитали. Вот дизасм одной из моих программ и ее же hex:
main.out: file format elf32-littlearm

Disassembly of section .isr_vector:

08000000 <g_pfnVectors>:
8000000: 20001000 andcs r1, r0, r0
8000004: 08000321 stmdaeq r0, {r0, r5, r8, r9}
8000008: 08000365 stmdaeq r0, {r0, r2, r5, r6, r8, r9}
800000c: 08000365 stmdaeq r0, {r0, r2, r5, r6, r8, r9}
8000010: 08000365 stmdaeq r0, {r0, r2, r5, r6, r8, r9}
:020000040800F2
:1000000000100020210300086503000865030008B4
:100010006503000865030008650300080000000 090
Все как положено, начальное значение 0x2000`1000 (4 кБ стека). То, что в hex оно записано наоборот, от молдшего байта к старшему, 00 10 00 20, это особенность представления многобайтных чисел в little-endian архитектурах.
Цитата Сообщение от getstm32 Посмотреть сообщение
Нигде не видел я предупреждений о том что нельзя записывать во флеш по адресу 0x08000000
Я думал что начиная с адреса 0x08000000 можно писать свой код
Так и есть. Вдруг вы пишете загрузчик, который получает новую прошивку по радиоканалу и заменяет ту, что в контроллере.
Цитата Сообщение от getstm32 Посмотреть сообщение
Я видел где то статью об опасности когда стек становится слишком большим и затирает код.
Тоже странная ситуация что нет рамок у стека.
В правильно написанной программе такой опасности нет.
Если же хотите защититься от говнокода, изучайте модуль MPU (memory protection unit), настраивайте разрешенные области памяти и обрабатывайте ошибки при выходе за их пределы.
Цитата Сообщение от locm Посмотреть сообщение
Я никого не вводил в заблуждение. Это ваши домыслы.
Это наблюдаемый факт.
Цитата Сообщение от locm Посмотреть сообщение
Почему вы решили что начало это дно? Я ничего подобного не писал. Вроде умный человек а элементарных вещей не понимаете. И просто хотите потролить?
По определению. То, что вы называете началом стека, это его дно. Тот адрес, куда кладется самый первый элемент, который никогда не меняется. Не уходите от ответа. Если вы назвали константу 0x0800`5000 указателем, доведите уже мысль до конца: куда он указывает и зачем вообще нужен как отдельная сущность?
Цитата Сообщение от locm Посмотреть сообщение
Из цитаты должно быть видно, к чему же конкретно вы пытаетесь придраться
Я ни к чему.
То есть цитаты не будет и свою придирку вы снимаете. Ладно.
Цитата Сообщение от getstm32 Посмотреть сообщение
Ок, вот 4 Байт: 200010ED
Лишнее вы зацепили: 4 байта из ваших данных это 00 20 00 10. Правда, повторяю, в каком-то странном порядке. Ладно число 0x2000`1000 там еще можно угадать (порядок байтов 2 - 1 - 4 - 3), но на чем-то более сложном точно запутаетесь.
Цитата Сообщение от getstm32 Посмотреть сообщение
Это в 64 разрядной системе адрес хранится в 8 Байтах.
А зачем вам 64-разрядная система?
Цитата Сообщение от getstm32 Посмотреть сообщение
В течении работы программы указатель на стек должен меняться, так как стек растёт и указатель на вершину всегда разный.
Значит по адресу 0x08000000 в течении работы программы должно быть постоянно новое значение.
Непонятно. Ок, разберусь.
Вот поэтому во флешке не указатель, а всего лишь значение инициализации. Грубо говоря, int SP = 0x20001000;. Вот SP это указатель, а 0x2000`1000 - только начальное значение. При работе программы меняться будет "переменная" (которая на самом деле регистр), а число 0x2000`1000 один раз использовали и тут же забыли, оно больше никому не нужно.
Цитата Сообщение от getstm32 Посмотреть сообщение
С какого адреса во флеш можно писать, не опасаясь затереть что то нужное?
С конца программы. А можно с конца доступной флешки. По-хорошему это можно сделать введением новой секции памяти, которая будет располагаться в конце, после векторов прерываний, стартап-кода и обычного кода. Но без знаний ассемблера будет сложно объяснить что такое секции памяти, зачем нужны и как с ними работать.
Лучше скажите, что именно вы туда собираетесь писать.
Цитата Сообщение от locm Посмотреть сообщение
Во флеше хранится начальный адрес.
Ну наконец-то!!!
Цитата Сообщение от getstm32 Посмотреть сообщение
Флеш -это ПЗУ. В нём память хранится. В ОЗУ всё исчезает после завершения работы программы.
Все правильно. Стек это ведь тоже временные данные, их нет смысла хранить после выключения питания. Поэтому стек располагается в ОЗУ.
Цитата Сообщение от getstm32 Посмотреть сообщение
Для регистров и портов отведены адреса, только стек не знает где начинаться?
Это ведь мне кажется такая системная информация о которой я ничего знать не должен, ибо зачем.
Стек это всего лишь способ работы с памятью. Более того, в многозадачных операционных системах стеков может быть несколько. Да банально стек ядра и стек юзерского кода. А если потоков много, то у каждого из них тоже свой стек. Соответственно, и выделять аппаратно какой-то фиксированный участок для хранения стека не выйдет. Лучше пусть ядерный код делает это программно.
Например, контроллер стартовал, ему в SP аппаратно приехало значение 0x2000`5000 - это дно стека ядра.
Потом ядро захотело запустить новый процесс, для него выделяется область памяти, например 0x2000`3000 - 0x2000`4000, в ней же располагается его стек (0x2000`4000). На эту же область накладываются ограничения доступа: по адресам от 0x2000`3000 до 0x2000`4000 данный процесс писать может, по любым другим - нет.
Потом запускается еще один процесс, ему тоже выделяется свой кусок памяти 0x2000`2000 - 0x2000`3000, там тоже создается стек начиная от 0x2000`3000, выдаются права доступа и все такое.
Вот у нас получилось три процесса и три стека.
На самом деле выделять ах 4 кБ памяти на процесс это довольно много, обычно выделяют куда меньше. Зато так числа получились нагляднее.
Цитата Сообщение от getstm32 Посмотреть сообщение
Флеш начинается с адреса 0x08000000, чем это не свободная область?
Эммм. Тем, что она используется под хранение вашего кода?
Цитата Сообщение от getstm32 Посмотреть сообщение
Для регистров и портов отведены адреса
Поправлю вашу терминологию.
Под регистрами обычно понимают регистры общего назначения. То, с чем работают инструкции процессора. Все эти r1, r5, sp, pc и прочике. Плюс специализированные регистры ядра (не помню есть ли они в ARM).
А то, что назвали регистрами вы это периферия. Она к ядру никакого отношения не имеет и может располагаться по большому счету где угодно - как пожелает производитель.

Добавлено через 8 минут
Да. Раз уж вы пытаетесь достаточно глубоко разобраться в устройстве контроллера, постарайтесь все же освоить ассемблер. Многие вещи там делаются гораздо нагляднее, чем в Си.
А если у вас нет какой-то конкретной цели и вы именно что изучаете низкоуровневое программирование, я бы даже посоветовал не ARM'овый ассемблер, а какой-нибудь более человекообразный. Например, AVR. Или есть интересный материал по RISC-V (видеолекция, моя статья на Хабре, в которой я рассматриваю gd32vf103, почти клон stm32f103, только чуть побыстрее и на RISC-V ядре вместо ARM).
Даже если сам по себе RISC-V не заинтересует, ознакомиться все равно полезно: принципы работы ведь по большому счету одни и те же что в AVR, что в ARM, что в x86, что в MIPS, что в RISC-V. Освоите один ассемблер, с другими будет просто.
1
Эксперт по электронике
7150 / 3329 / 342
Регистрация: 28.10.2011
Сообщений: 13,138
Записей в блоге: 7
08.05.2022, 10:04
Цитата Сообщение от getstm32 Посмотреть сообщение
Флеш начинается с адреса 0x08000000, чем это не свободная область?
Прошивка где находится?

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
То, что вы называете началом стека, это его дно.
Начало это начало, а не конец как вы пишите.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Если вы назвали константу 0x0800`5000 указателем, доведите уже мысль до конца
Я много раз писал что это указать на начало стека. Но вы продолжаете прикапыватся! Слишком умным себя считаете?

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
То есть цитаты не будет и свою придирку вы снимаете.
Я привел цитату с которой вы начали оффтоп и придирки на пустом месте. Реальные адреса из МК

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Но без знаний ассемблера будет сложно объяснить что такое секции памяти, зачем нужны и как с ними работать.
Зачем знание асма? Секция задается в ld файле и к асму отношения не имеет.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Ну наконец-то!!!
Я об этом 1500 раз писал! Вы видимо не замечали или не хотели замечать чтобы тупо потролить!

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Например, контроллер стартовал, ему в SP аппаратно приехало значение 0x2000`5000 - это дно стека
Так дно или вершина?

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Еще раз спрашиваю: кому нужно дно стека?
Видимо вам. У вас стек с дна начинается!
Вот чтобы не было путаницы, лучше писать "начальный адрес".
0
4 / 4 / 1
Регистрация: 24.04.2022
Сообщений: 79
08.05.2022, 13:46  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Лишнее вы зацепили: 4 байта из ваших данных это 00 20 00 10.
Да, первые нули не считал, поэтому другой адрес получался.
Порядок я думаю правильный, little endian для этого адреса выглядит так: 10002000

Что определяет какого размера будет стек? В этом случае у меня 16 бит стек.
Цитата Сообщение от getstm32 Посмотреть сообщение
С какого адреса во флеш можно писать, не опасаясь затереть что то нужное?
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
С конца программы. А можно с конца доступной флешки.
Здесь мне просто надо изменить трактовку своего вопроса.
Дo каких пор можно записывать свой код во флеш? Во флеш важными являются первые 8 Байт? Больше никаких сюрпризов там нет, которые затереть можно?

Цитата Сообщение от getstm32 Посмотреть сообщение
Флеш начинается с адреса 0x08000000, чем это не свободная область?
Цитата Сообщение от locm Посмотреть сообщение
Прошивка где находится?
Прошивка находится во флеше.
Флеш начинается с адреса 0x08000000
0
 Аватар для COKPOWEHEU
4146 / 2724 / 433
Регистрация: 09.09.2017
Сообщений: 12,065
08.05.2022, 14:14
Цитата Сообщение от locm Посмотреть сообщение
Начало это начало, а не конец как вы пишите.
Вот поэтому я обычно и использую общепринятую терминологию ("дно", "вершина"), а не вашу. Что вы понимаете под "началом" и "концом" стека?
Цитата Сообщение от locm Посмотреть сообщение
Я привел цитату с которой вы начали оффтоп и придирки на пустом месте.
Ничего вы не привели! Хотя бы потому что от меня придирок вообще не было, соответственно цитату вы не могли привести физически. А приведенная вами рандомная цитата вообще непонятно что должна символизировать.
Вы хотели привести цитату своих придирок, где вам не нравится использование мной термина "указатель".
Цитата Сообщение от locm Посмотреть сообщение
Зачем знание асма? Секция задается в ld файле и к асму отношения не имеет.
Потому что на асме использование относительных и абсолютных адресов - совершенно естественная операция. Соответственно, и шансов запутаться у ТСа будет меньше.
Цитата Сообщение от locm Посмотреть сообщение
Я об этом 1500 раз писал! Вы видимо не замечали или не хотели замечать чтобы тупо потролить!
Зачем вы врете? Здесь на форуме это слишком легко проверить. Вы упорно твердили про какой-то "указатель", хотя кому и зачем он нужен так и не придумали.
Цитата Сообщение от locm Посмотреть сообщение
Так дно или вершина?
Пока размер стека нулевой, это одно и то же значение. Просто стек так устроен, что дно у него не меняется. Это вершина будет уменьшаться.
Цитата Сообщение от locm Посмотреть сообщение
Видимо вам. У вас стек с дна начинается!
А у вас он начинается с вершины что ли?!
Цитата Сообщение от getstm32 Посмотреть сообщение
Порядок я думаю правильный, little endian для этого адреса выглядит так: 10002000
Но по этому адресу в контроллере ничего подходящего нет.
У вас есть адрес дна стека 0x2000`1000. Если его записать в little-endian, получится 00 10 00 20, во флешке контроллера он так и хранится (это я в прошлом посте показывал). Просто у вас то ли отладчик кривой, то ли еще что, но байты он здорово перемешал.
Цитата Сообщение от getstm32 Посмотреть сообщение
Что определяет какого размера будет стек? В этом случае у меня 16 бит стек.
Обычно размер стека не задается. Он просто растет сверху вниз. У вас десятки килобайт памяти, до срыва стека кодить и кодить.
16 бит стек это слишком мало, в него ни одного значения не влезет.
Цитата Сообщение от getstm32 Посмотреть сообщение
Дo каких пор можно записывать свой код во флеш? Во флеш важными являются первые 8 Байт? Больше никаких сюрпризов там нет, которые затереть можно?
Не понимаю вопрос. Писать вы можете в любое место флеша. Просто если вы перезапишете кусок своей программы, она уже не сможет правильно работать, вот и все. Ну как если бы вы читали книгу и пытались что-то записать на ту же страницу: там будет то, что вы только что записали, а не то, что хотели прочитать. И адрес 0x0800`0000 ничем не примечателен.
Лучше все же ответьте на вопрос: зачем вам сейчас что-то писать во флеш?
Если для проверки адресов или еще какой отладки, то это самый неудачный способ: есть же UART, через который вы в реальном времени можете передавать любую отладочную информацию.
1
Эксперт по электронике
7150 / 3329 / 342
Регистрация: 28.10.2011
Сообщений: 13,138
Записей в блоге: 7
08.05.2022, 15:01
Цитата Сообщение от getstm32 Посмотреть сообщение
Во флеш важными являются первые 8 Байт? Больше никаких сюрпризов там нет, которые затереть можно?
Если вы прошивку не считаете важными данными, то да, можно стирать все.

Цитата Сообщение от getstm32 Посмотреть сообщение
Прошивка находится во флеше.
Флеш начинается с адреса 0x08000000
Ну и? Если знаете что пршивка начинается с адреса 0x08000000 зачем в него пытаетесь что-то записать? Цель - повредить прошивку чтобы МК глючил или вовсе не работал?

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Что вы понимаете под "началом" и "концом" стека?
Много раз писал в теме.
Что по вашему означают слова "начало" и "конец" или нужно объяснять как ребенку?

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Ничего вы не привели! Хотя бы потому что от меня придирок вообще не было, соответственно цитату вы не могли привести физически.
Отрицаете реальность? Ну-ну!

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Потому что на асме использование относительных и абсолютных адресов - совершенно естественная операция.
К секциям в ld файле какое это имеет отношение?

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Соответственно, и шансов запутаться у ТСа будет меньше.
Уверены? Судя по вопросам ТС асм его еще больше запутает. Учится он принципиально не хочет и судя по вопросам документацию не читает.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Зачем вы врете? Здесь на форуме это слишком легко проверить.
Не вру. Проверяйте.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Пока размер стека нулевой, это одно и то же значение. Просто стек так устроен, что дно у него не меняется. Это вершина будет уменьшаться.
То есть хотите сказать что в STM32 дно стека обычно в конце ОЗУ? Сами хоть поняли какую глупость сморозили и сейчас выкручиваетесь?
Вам нужно переехать в другую страну где ложь выдают за правду, а черное у них - белое. Там много таких как вы!

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А у вас он начинается с вершины что ли?!
Он начинается с начального адреса, заданного при инициализации при запуске МК. Я об этом много раз писал. А вы все также продолжаете тролить!

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Но по этому адресу в контроллере ничего подходящего нет.
Почему нет? У многих МК по адресу 0x10000000 находится CCMRAM. Странно что вы этого не знаете.
Разве не видите на скринах ТС что МК F405 с CCMRAM?

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
У вас есть адрес дна стека 0x2000`1000.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Только не указатель на стек, а дефолтное значение вершины стека.
Вы путаетесь в показаниях и ТС запутываете!
То у вас адрес инициализации это вершина, то дно. Уж определитесь и не вводите ТС в заблуждение. Он и так погряз в заблуждениях относительно МК.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
У вас десятки килобайт памяти, до срыва стека кодить и кодить.
Откуда вы знаете? Может в коде глобальный массив(ы) на те же десятки КБ или используется куча или в какой-то функции есть локальный массив/структура большого размера.
Вы в очередной раз вводите ТС в залужение. Он расслабится и будет бумать что имеет право израсходовать всю оперативку и еще стек заполнит под завязку.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
16 бит стек это слишком мало
ТС подразумевает что стек 16-ти битный. Очередное заблуждение.
В STM32 ячейки стека 32-ух битные (4 байта).
1
4 / 4 / 1
Регистрация: 24.04.2022
Сообщений: 79
08.05.2022, 15:37  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Просто у вас то ли отладчик кривой, то ли еще что, но байты он здорово перемешал.
Две программы одно и то же значение выдают 00 20 00 10. Оно правильное
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Обычно размер стека не задается. Он просто растет сверху вниз. У вас десятки килобайт памяти, до срыва стека кодить и кодить.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Я правильно понимаю что если при инициализации в указатель стека заносится значение 0x2000'5000, то его величина составляет 20 КБ и по мере заполнения стека его указатель приближается к значению 0x2000'0000 ?
Да
Добавлено через 11 минут
Цитата Сообщение от locm Посмотреть сообщение
Ну и? Если знаете что пршивка начинается с адреса 0x08000000 зачем в него пытаетесь что-то записать? Цель - повредить прошивку чтобы МК глючил или вовсе не работал?
Да, точно. Значит мне надо узнать где заканчивается прошивка и туда писать?
Как это можно сделать?
Цитата Сообщение от locm Посмотреть сообщение
и судя по вопросам документацию не читает.
Читаю я документацию по мере понимания, но надо сначала понимать что читаешь.
Цитата Сообщение от locm Посмотреть сообщение
Почему нет? У многих МК по адресу 0x10000000 находится CCMRAM.
Это 10002000 и это 00 20 00 10 один и тот же адрес. Один в big endian другой в little endian
Цитата Сообщение от locm Посмотреть сообщение
ТС подразумевает что стек 16-ти битный.
Я подразумеваю что гарницы стека в которых он может расти составляют 16 бит судя по адресу 00 20 00 10
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Я правильно понимаю что если при инициализации в указатель стека заносится значение 0x2000'5000, то его величина составляет 20 КБ и по мере заполнения стека его указатель приближается к значению 0x2000'0000 ?
Да
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.05.2022, 15:37

Реальные скорости Wi-Fi
Реальные скорости Wi-Fi Хочется уточнить у владельцев роутров какие у них скоростя. То есть скорость внутри домашней сети (скорость...

Реальные надписи в маршрутках...
- Хлопнешь дверью - умрёшь от монтировки! - 10 минут страха и вы дома.Cтоимость атракциона 7 рублей. - Просьба семечки, орешки...

Как заработать реальные деньги?
Я хочу купить велосипед но мне не хватает 14356.48 рублей. Бабушку я напрягать не хочу. Я хочу сам заработать! Ребята как с помощю SEO...

Есть ли у уравнения реальные корни
даны a, b, c реальные цифры. Решать есть ли у ax^2 + bx+c=0 уравнения реальные корни

Реальные знаки и их HTML сущности
В работе встроенного в сайт редактора, с помощью которого производится занесение контента, обнаружились некоторые недостатки. Занимаясь их...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Закрытая тема Создать тему
Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru