Перейти к содержанию
    

Произвольный стартовый адрес

Вопрос к знатокам IAR:

Можно ли как-то IAR-у задать стартовый адрес (с которого начнётся прошагивание или выполнение программы) = произвольный? Например: равный некой константе или метке из программы?

Стартовый - после подключения IAR к CPU через эмулятор и загрузки программы.

Естественно "run to main" - отключено. Также через .mac-файл получается задать начальное желаемое значение для регистра PC. Но, хоть в PC и содержится введённое туда желаемое значение, всё равно - окно "Disassembly" установлено на адрес, считанный из RESET-вектора таблицы прерываний (а не на адрес, находящийся в PC). И, соответственно, выполнение начинается с адреса из таблицы прерываний, а не с адреса находящегося в PC.  :cray2:

 

ЗЫ: Уже все мануалы перерыл, но ничего нужного не находится..... :sad:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 05.08.2022 в 12:51, VladislavS сказал:

В контекстном меню "Move to PC" не помогает?

Хочется, чтобы сразу после загрузки прошивки в МК, для старта выполнения надо было просто нажать одну кнопку "RUN".

А не нажимать много кнопок каждый раз после загрузки прошивки. Это то конечно работает - примерно так и приходиться делать (только через editbox "Go to" в "Disassembly"-окне).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нужно, чтобы поменялась сама точка входа? Или чтобы отладчик вместо main() входил в какую-то Вашу функцию?

Если просто поменять точку входа, у Keil есть команда линкера --entry(address). Может, у IAR тоже есть такая?

Или прямо в среде ее задать (скрин не мой)

no definition for "__iar_program_start" [program entry] - Русские Блоги

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

entry стоит как надо - указывает на ту функцию, с которой и надо начать выполнение. Но выполнение начинается не с неё, а с адреса находящегося в RESET-векторе таблицы прерываний.

Приходится ещё руками вбивать имя этой функции в поле "Go to" окна "Disassembly" и делать переход на неё (Set Next Statement).

 

PS: entry кстати вообще ни на что не влияет. Выполнение всегда стартует с адреса из RESET-вектора.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

То, что выполнение в Cortex-M начинается с адреса вектора сброса - понятно. Не понятно, как Вам нужно. То ли, чтобы как раз при сбросе там был "другой" адрес (тогда не понимаю, в чем проблема в startup-файле в таблице векторов сразу занести нужное значение в позицию вектора сброса). Или же Вам нужно, чтобы после сброса CPU произошла вся нужная инициализация Си-окружения (вызов __iar_program_start()), но __iar_program_start() далее перешла не на main(), а на Вами указанный адрес? Или же Вы вовсе отлаживаете какой-то бинарник, заливая его в МК и подключаясь отладчиком "налету"?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вопрос был не про Cortex-M (хотя "IAR for ARM" ведёт себя аналогично). А про STM8.

Таблица векторов там прибита гвоздями к фиксированному адресу FLASH (а не как в ARM). Загружаю прошивку в ОЗУ, хочу там выполнять. А IAR читает стартовый адрес из вектора сброса FLASH. В котором естественно некий мусор не относящийся к прошивке. И если после загрузки сразу нажать "Run" - выполнение улетает в тар-тарары.

Приходится после каждой загрузки прошивки вводить имя стартовой функции программы (__iar_program_start) в поле "Go to" окна "Disassembly" и устанавливать PC на полученный адрес. Это напрягает когда приходится повторять это десятки раз.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я с STM8 связывался лишь однажды, и насколько помню там нельзя просто отладчиком залить код в ОЗУ и запустить на исполнение, т.к. таблица векторов не перемещается и единственный выход здесь - перепрограммировать Flash-область таблицы векторов. Это, скорее всего, придется делать в любом случае, если используются вообще какие-либо прерывания. Либо прошить один раз эти вектора во Flash, а в программе (та, что компилится для выполнения из ОЗУ) как-то зафиксировать значения этих векторов (что может быть немного проблематично). Например, атрибутами размещения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 часа назад, Arlleex сказал:

Я с STM8 связывался лишь однажды, и насколько помню там нельзя просто отладчиком залить код в ОЗУ и запустить на исполнение

Можно. Прерывания не нужны. И вообще вопрос был не об этом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Макрос исполнить можно. Только как в макросе установить адрес исполнения? PC - знаю как макросом установить (писал выше), но это не помогает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 05.08.2022 в 12:40, jcxz сказал:

И, соответственно, выполнение начинается с адреса из таблицы прерываний, а не с адреса находящегося в PC...

А как такое возможно? На всякий случай уточню: Вы к вручную забитому адресу опкод 0x82 (вроде он?) добавили?

P.S. Только что нашел, что, вроде как, в STM8 таки можно перемещать таблицу векторов (бит FV_RAM регистра DM_CR2) в ОЗУ.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Arlleex сказал:

А как такое возможно? На всякий случай уточню: Вы к вручную забитому адресу опкод 0x82 (вроде он?) добавили?

Немного соврал, так как писал по памяти: IAR начинает выполнение не с адреса, прописанного в векторе сброса, а с адреса начала boot-ROM =0x6000. А уже boot-код, расположенный по этому адресу, делает переход на адрес вектора сброса (0x8000).

Состояние сразу после загрузки прошивки в ОЗУ STM8:

stm8-ram-debug.1.thumb.png.8c66515656042c910631b3e127da467e.png

В PC видно значение (0x6DC) загруженное туда моим .mac-файлом. С этого адреса мне и нужно начать выполнение.

Но если сразу сделать Refresh (из меню Debug), то картинка обновляется:

image.thumb.png.e0ffdf401057c4abd4926047be2abc86.png

Здесь виден код boot-ROM (0x6000), который проверит содержимое вектора сброса (на наличие в начале вектора кода команды 0x82 или 0xAC) и выполнит переход по нему.

И видно, что содержимое PC стало =0x6000 !  Похоже IAR грузит туда 0x6000 уже после выполнения моего макроса загрузки PC:

image.thumb.png.48fdaeb816d036b2f04a0b26a7a3e7cb.png

:cray:

1 час назад, Arlleex сказал:

P.S. Только что нашел, что, вроде как, в STM8 таки можно перемещать таблицу векторов (бит FV_RAM регистра DM_CR2) в ОЗУ.

Это похоже мануал SWIM?

В мануале на свой (STM8L "medium density") я описания этого регистра и бита не вижу. Есть только упоминание о существовании регистров DM_... в datasheet. Но без описания.

Надо будет поискать подробностей и поковырять эти регистры (если они реально есть).

Спасибо за наводку!

PS: Кстати - регистры эти (DM_...) у меня были прописаны среди регистров периферии. Только я про них забыл, так как в мануале они нигде не упоминаются почему-то.  :umnik2:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да там в мануале на МК в разделе отладочных портов они лишь ссылаются на доку выше. Поэтому напрямую не найти. Я тоже только увидел.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вобщем: получилось хоть не совсем как хотел (без порчи FLASH), но всё же более-менее:

В reset-вектор флешь (0x8000) прописал команду дальнего перехода на фиксированный адрес в ОЗУ. А в этом адресе прибил гвоздями одну команду перехода на __iar_program_start. Т.е. - один раз прошиваются 4 байта в reset-вектор FLASH, а остальная прошивка - в ОЗУ. Далее - удаляем из программы 4 байта прошивающие flash (они уже там есть и константные), а прошивку компилим и грузим в ОЗУ. Всё - теперь при каждой новой перезагрузке прошивки она стартует с вектора 0x8000, а далее выполняется в ОЗУ. Без дополнительных телодвижений и без перепрошивки FLASH.

reset-вектор конечно потёрт. Но по-другому похоже никак.  :sad:  FV_RAM никак не поможет - boot-ROM на него даже не смотрит и никак не зависит от него.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...