Jump to content
    

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

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

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

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

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

 

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

 

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

Download-ер и отдадчик могут же пользовательские макросы исполнять, не?

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

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:

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...