jcxz 240 5 августа, 2022 Опубликовано 5 августа, 2022 · Жалоба Вопрос к знатокам IAR: Можно ли как-то IAR-у задать стартовый адрес (с которого начнётся прошагивание или выполнение программы) = произвольный? Например: равный некой константе или метке из программы? Стартовый - после подключения IAR к CPU через эмулятор и загрузки программы. Естественно "run to main" - отключено. Также через .mac-файл получается задать начальное желаемое значение для регистра PC. Но, хоть в PC и содержится введённое туда желаемое значение, всё равно - окно "Disassembly" установлено на адрес, считанный из RESET-вектора таблицы прерываний (а не на адрес, находящийся в PC). И, соответственно, выполнение начинается с адреса из таблицы прерываний, а не с адреса находящегося в PC. ЗЫ: Уже все мануалы перерыл, но ничего нужного не находится..... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 5 августа, 2022 Опубликовано 5 августа, 2022 · Жалоба В контекстном меню "Move to PC" не помогает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 240 5 августа, 2022 Опубликовано 5 августа, 2022 · Жалоба В 05.08.2022 в 12:51, VladislavS сказал: В контекстном меню "Move to PC" не помогает? Хочется, чтобы сразу после загрузки прошивки в МК, для старта выполнения надо было просто нажать одну кнопку "RUN". А не нажимать много кнопок каждый раз после загрузки прошивки. Это то конечно работает - примерно так и приходиться делать (только через editbox "Go to" в "Disassembly"-окне). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 183 5 августа, 2022 Опубликовано 5 августа, 2022 · Жалоба Нужно, чтобы поменялась сама точка входа? Или чтобы отладчик вместо main() входил в какую-то Вашу функцию? Если просто поменять точку входа, у Keil есть команда линкера --entry(address). Может, у IAR тоже есть такая? Или прямо в среде ее задать (скрин не мой) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 240 5 августа, 2022 Опубликовано 5 августа, 2022 · Жалоба entry стоит как надо - указывает на ту функцию, с которой и надо начать выполнение. Но выполнение начинается не с неё, а с адреса находящегося в RESET-векторе таблицы прерываний. Приходится ещё руками вбивать имя этой функции в поле "Go to" окна "Disassembly" и делать переход на неё (Set Next Statement). PS: entry кстати вообще ни на что не влияет. Выполнение всегда стартует с адреса из RESET-вектора. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 183 5 августа, 2022 Опубликовано 5 августа, 2022 · Жалоба То, что выполнение в Cortex-M начинается с адреса вектора сброса - понятно. Не понятно, как Вам нужно. То ли, чтобы как раз при сбросе там был "другой" адрес (тогда не понимаю, в чем проблема в startup-файле в таблице векторов сразу занести нужное значение в позицию вектора сброса). Или же Вам нужно, чтобы после сброса CPU произошла вся нужная инициализация Си-окружения (вызов __iar_program_start()), но __iar_program_start() далее перешла не на main(), а на Вами указанный адрес? Или же Вы вовсе отлаживаете какой-то бинарник, заливая его в МК и подключаясь отладчиком "налету"? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 240 5 августа, 2022 Опубликовано 5 августа, 2022 · Жалоба Вопрос был не про Cortex-M (хотя "IAR for ARM" ведёт себя аналогично). А про STM8. Таблица векторов там прибита гвоздями к фиксированному адресу FLASH (а не как в ARM). Загружаю прошивку в ОЗУ, хочу там выполнять. А IAR читает стартовый адрес из вектора сброса FLASH. В котором естественно некий мусор не относящийся к прошивке. И если после загрузки сразу нажать "Run" - выполнение улетает в тар-тарары. Приходится после каждой загрузки прошивки вводить имя стартовой функции программы (__iar_program_start) в поле "Go to" окна "Disassembly" и устанавливать PC на полученный адрес. Это напрягает когда приходится повторять это десятки раз. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 183 5 августа, 2022 Опубликовано 5 августа, 2022 · Жалоба Я с STM8 связывался лишь однажды, и насколько помню там нельзя просто отладчиком залить код в ОЗУ и запустить на исполнение, т.к. таблица векторов не перемещается и единственный выход здесь - перепрограммировать Flash-область таблицы векторов. Это, скорее всего, придется делать в любом случае, если используются вообще какие-либо прерывания. Либо прошить один раз эти вектора во Flash, а в программе (та, что компилится для выполнения из ОЗУ) как-то зафиксировать значения этих векторов (что может быть немного проблематично). Например, атрибутами размещения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 240 5 августа, 2022 Опубликовано 5 августа, 2022 · Жалоба 4 часа назад, Arlleex сказал: Я с STM8 связывался лишь однажды, и насколько помню там нельзя просто отладчиком залить код в ОЗУ и запустить на исполнение Можно. Прерывания не нужны. И вообще вопрос был не об этом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 38 5 августа, 2022 Опубликовано 5 августа, 2022 · Жалоба Download-ер и отдадчик могут же пользовательские макросы исполнять, не? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 240 5 августа, 2022 Опубликовано 5 августа, 2022 · Жалоба Макрос исполнить можно. Только как в макросе установить адрес исполнения? PC - знаю как макросом установить (писал выше), но это не помогает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 183 6 августа, 2022 Опубликовано 6 августа, 2022 · Жалоба В 05.08.2022 в 12:40, jcxz сказал: И, соответственно, выполнение начинается с адреса из таблицы прерываний, а не с адреса находящегося в PC... А как такое возможно? На всякий случай уточню: Вы к вручную забитому адресу опкод 0x82 (вроде он?) добавили? P.S. Только что нашел, что, вроде как, в STM8 таки можно перемещать таблицу векторов (бит FV_RAM регистра DM_CR2) в ОЗУ. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 240 6 августа, 2022 Опубликовано 6 августа, 2022 · Жалоба 1 час назад, Arlleex сказал: А как такое возможно? На всякий случай уточню: Вы к вручную забитому адресу опкод 0x82 (вроде он?) добавили? Немного соврал, так как писал по памяти: IAR начинает выполнение не с адреса, прописанного в векторе сброса, а с адреса начала boot-ROM =0x6000. А уже boot-код, расположенный по этому адресу, делает переход на адрес вектора сброса (0x8000). Состояние сразу после загрузки прошивки в ОЗУ STM8: В PC видно значение (0x6DC) загруженное туда моим .mac-файлом. С этого адреса мне и нужно начать выполнение. Но если сразу сделать Refresh (из меню Debug), то картинка обновляется: Здесь виден код boot-ROM (0x6000), который проверит содержимое вектора сброса (на наличие в начале вектора кода команды 0x82 или 0xAC) и выполнит переход по нему. И видно, что содержимое PC стало =0x6000 ! Похоже IAR грузит туда 0x6000 уже после выполнения моего макроса загрузки PC: 1 час назад, Arlleex сказал: P.S. Только что нашел, что, вроде как, в STM8 таки можно перемещать таблицу векторов (бит FV_RAM регистра DM_CR2) в ОЗУ. Это похоже мануал SWIM? В мануале на свой (STM8L "medium density") я описания этого регистра и бита не вижу. Есть только упоминание о существовании регистров DM_... в datasheet. Но без описания. Надо будет поискать подробностей и поковырять эти регистры (если они реально есть). Спасибо за наводку! PS: Кстати - регистры эти (DM_...) у меня были прописаны среди регистров периферии. Только я про них забыл, так как в мануале они нигде не упоминаются почему-то. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 183 6 августа, 2022 Опубликовано 6 августа, 2022 · Жалоба Да там в мануале на МК в разделе отладочных портов они лишь ссылаются на доку выше. Поэтому напрямую не найти. Я тоже только увидел. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 240 6 августа, 2022 Опубликовано 6 августа, 2022 · Жалоба Вобщем: получилось хоть не совсем как хотел (без порчи FLASH), но всё же более-менее: В reset-вектор флешь (0x8000) прописал команду дальнего перехода на фиксированный адрес в ОЗУ. А в этом адресе прибил гвоздями одну команду перехода на __iar_program_start. Т.е. - один раз прошиваются 4 байта в reset-вектор FLASH, а остальная прошивка - в ОЗУ. Далее - удаляем из программы 4 байта прошивающие flash (они уже там есть и константные), а прошивку компилим и грузим в ОЗУ. Всё - теперь при каждой новой перезагрузке прошивки она стартует с вектора 0x8000, а далее выполняется в ОЗУ. Без дополнительных телодвижений и без перепрошивки FLASH. reset-вектор конечно потёрт. Но по-другому похоже никак. FV_RAM никак не поможет - boot-ROM на него даже не смотрит и никак не зависит от него. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться