Arlleex 183 14 ноября, 2018 Опубликовано 14 ноября, 2018 · Жалоба Ну как я понял (приблизительно). 1. Код загрузчика Таблица векторов прерываний, а также самое первое слово в образе ПО загрузчика располагается, как и положено, в самом начале. Постольку-поскольку Cortex-Mx после сброса аппаратно загружает первое слово в MSP, а второе - в PC. 2. Код приложения По сути может иметь любую структуру образа хранения во Flash. Например, можно разместить таблицу служебных данных в самом начале Flash, где будет сказано о размере прошивки, ее контрольной сумме, и, в том числе, значении MSP/PSP, адреса точки входа и адреса начала таблицы векторов (если она вообще есть - ведь она может быть динамически расположена в ОЗУ). 3. Как это работает Почему позволительно расположить какую-то странную таблицу в начале Flash клиентского ПО, когда по идее там должен быть размещен образ таблицы векторов? Потому что в клиентское ПО мы попадаем из загрузчика, где явно есть инструкции установки MSP и точки входа. Соответственно, их положение в образе клиентского ПО может быть абсолютно произвольным в допустимых физических пределах. Вижу это примерно так. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Integro 0 14 ноября, 2018 Опубликовано 14 ноября, 2018 · Жалоба Уважаемый @jcxz, как Вы прокоментируете рекомендации авторитетного для вас IAR?https://www.iar.com/support/tech-notes/general/creating-a-bootloader-for-cortex-m/ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 14 ноября, 2018 Опубликовано 14 ноября, 2018 · Жалоба Integro, а как вы прокомментируете отсутствие VTOR на части Cortex-M? Кому верим? ARM или IAR? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 14 ноября, 2018 Опубликовано 14 ноября, 2018 · Жалоба относительно моего случая если это адрес таблицы define symbol IntVectTable_start__ = 0x00004000; define symbol IntVectTable_end__ = 0x0000403f; то адрес начала - конца кода ? define symbol __ICFEDIT_region_ROM_start__ = 0x0000443F; define symbol __ICFEDIT_region_ROM_end__ = 0x007FFFFF; так что ли? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 14 ноября, 2018 Опубликовано 14 ноября, 2018 · Жалоба 1 час назад, Arlleex сказал: 1. Код загрузчика Таблица векторов прерываний, а также самое первое слово в образе ПО загрузчика располагается, как и положено, в самом начале. Постольку-поскольку Cortex-Mx после сброса аппаратно загружает первое слово в MSP, а второе - в PC. Не факт что аппаратно. Где-то это может делать код из BootROM. А где-то - аппаратно. И не факт что "в самом начале". Опять-же - в самом начале чего? 1 час назад, Arlleex сказал: Почему позволительно расположить какую-то странную таблицу в начале Flash клиентского ПО, когда по идее там должен быть размещен образ таблицы векторов? Потому что в клиентское ПО мы попадаем из загрузчика, где явно есть инструкции установки MSP и точки входа. Соответственно, их положение в образе клиентского ПО может быть абсолютно произвольным в допустимых физических пределах. "Странная таблица" может быть не только в клиентском ПО, но и в загрузчике. См. например семейство Infineon XMC4xxx. Т.е. - эта аксиома, что: "любое пользовательское ПО во флешь должно начинаться там с начала чего-то и управление передаётся на адрес из 0-го вектора и SP устанавливается туда-же" которую пропагандируют тут некоторые товарищи - вовсе не аксиома, а всего-лишь частный случай. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Integro 0 14 ноября, 2018 Опубликовано 14 ноября, 2018 · Жалоба 47 minutes ago, VladislavS said: Integro, а как вы прокомментируете отсутствие VTOR на части Cortex-M? Кому верим? ARM или IAR? Вы бы еще спросили где он на PIC'ах или AVR'ах. Мы ведь обсуждаем как можно\нужно обходиться с VTOR, а это уже подрозумевает конкретную архитектуру. И кстати KEIL поддерживает IAR: http://www.keil.com/support/docs/3913.htm 13 minutes ago, jenya7 said: define symbol __ICFEDIT_region_ROM_start__ = 0x0000443F; define symbol __ICFEDIT_region_ROM_end__ = 0x007FFFFF; так что ли? нет, ROM start должен быть 0x00004000 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 14 ноября, 2018 Опубликовано 14 ноября, 2018 · Жалоба 1 час назад, Integro сказал: Уважаемый @jcxz, как Вы прокоментируете рекомендации авторитетного для вас IAR? никак. читать лень. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 14 ноября, 2018 Опубликовано 14 ноября, 2018 · Жалоба 1 час назад, Arlleex сказал: Таблица векторов прерываний, а также самое первое слово в образе ПО загрузчика располагается, как и положено, в самом начале. Постольку-поскольку Cortex-Mx после сброса аппаратно загружает первое слово в MSP, а второе - в PC. Например XMC4xxx в режиме загрузки ABM-0 читает некую структуру данных (заголовок прошивки), начинающуюся с адреса 0x0C00FFE0, которая выглядит как: Magic Key (32 bits) Start address of code (32 bits) Length of the code (32 bits) CRC-32 code for code range (32 bits) CRC-32 code for above 4 (32 bits) проверяет её и, если она некорректна, то "execution is aborted and a diagnostics monitor mode (DMM) is entered.", а если корректна, то запускает прошивку с адреса 0x0C000000. Но, для того чтобы определить режим загрузки, BootROM до этого может читать ещё "User Configuration Block" из другого места флеши и распарсить его. PS: Так что всё может быть очень причудливо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 183 14 ноября, 2018 Опубликовано 14 ноября, 2018 (изменено) · Жалоба Только что, jcxz сказал: Не факт что аппаратно. Где-то это может делать код из BootROM. А где-то - аппаратно. И не факт что "в самом начале". Опять-же - в самом начале чего? Если отбросить все BootROM и посмотреть на работу процессора, в сухом остатке получим, что всегда CPU стартует следующей последовательностью: 1. Загружает слово по адресу 0x00000000 и помещает его в MSP. 2. Загружает слово по адресу 0x00000004 и помещает его в PC. С этого момента выполняется код. То, что в данном конкретном МК может быть реализован нестираемый загрузчик (BootROM и т.д.) всего лишь означает, что CPU сначала будет выполнять код этого загрузчика. И применительно к пользовательскому приложению да, вполне вероятно, что формат образа прошивки диктуется производителем МК, либо разработчиком, если он же сам и пишет этот BootROM. Но изначально процессор всегда и полностью аппаратно выполняет шаги 1 и 2 при сбросе, поэтому в начале образа прошивки (собственный загрузчик, или же BootROM) обязаны быть корректные значения MSP и ResetVector. Остальные - уже по желанию можно будет перемещать как душе заблагорассудится. Также, нужно отметить, что конкретное отображение адресов 0x00000000 и 0x00000004 зависит от настроек системы (BootROM, Flash, RAM и т.д.), например, внешними уровнями на лапках МК. http://infocenter.arm.com/help/topic/com.arm.doc.dui0553a/DUI0553A_cortex_m4_dgug.pdf, страница 17: Цитата Stack Pointer The Stack Pointer (SP) is register R13. In Thread mode, bit[1] of the CONTROL register indicates the stack pointer to use: • 0 = Main Stack Pointer (MSP). This is the reset value. • 1 = Process Stack Pointer (PSP). On reset, the processor loads the MSP with the value from address 0x00000000. Program Counter The Program Counter (PC) is register R15. It contains the current program address. On reset, the processor loads the PC with the value of the reset vector, which is at address 0x00000004. Bit[0] of the value is loaded into the EPSR T-bit at reset and must be 1. Цитата PS: Так что всё может быть очень причудливо. Именно Изменено 14 ноября, 2018 пользователем Arlleex Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 14 ноября, 2018 Опубликовано 14 ноября, 2018 · Жалоба 13 минут назад, Arlleex сказал: Но изначально процессор всегда и полностью аппаратно выполняет шаги 1 и 2 при сбросе, поэтому в начале образа прошивки (собственный загрузчик, или же BootROM) обязаны быть корректные значения MSP и ResetVector. Но мы же здесь в основном - не разработчики МК, а скорее - их пользователи. А значит нам не важно что там процессор аппаратно выполняет до входа в BootROM, если наше приложение во флешь получит управление только после BootROM. Нам важнее требования этого самого BootROM-а. В некоторых МК кстати и заход или незаход в BootROM определяется не лапками МК, а только флешью. Например в Tiva процедура старта МК прописана так: 1. The BOOTCFG register is read. If the EN bit is clear, the ROM Boot Loader is executed. 2. In the ROM Boot Loader, the status of the specified GPIO pin is compared with the specified polarity. If the status matches the specified polarity, the ROM is mapped to address 0x0000.0000 and execution continues out of the ROM Boot Loader. 3. If the EN bit is set or the status doesn't match the specified polarity, the data at address 0x0000.0004 is read, and if the data at this address is 0xFFFF.FFFF, the ROM is mapped to address 0x0000.0000 and execution continues out of the ROM Boot Loader. 4. If there is data at address 0x0000.0004 that is not 0xFFFF.FFFF, the stack pointer (SP) is loaded from Flash memory at address 0x0000.0000 and the program counter (PC) is loaded from address 0x0000.0004. The user application begins executing. Изначально (на чистых МК из магазина) будет запускаться BootROM или из-за EN-бит==0 или из-за того что во флешь все 0xFFFFFFFF. Здесь как видно вход в BootROM - опционален и определяется аппаратно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 183 14 ноября, 2018 Опубликовано 14 ноября, 2018 (изменено) · Жалоба Жаль, конечно... Плохо, когда что-то уже написали за тебя, при этом никого не спросив. Мне, например, не совсем нравится подход Tiva - потому как он слишком тривиален, и даже в элементарном загрузчике руками можно проверить значение SP на более-менее адекватное значение. Причем как-нибудь более хитро. А тут просто на 0xFFFFFFFF проверили, типа есть там вообще прошивка или нет. А если мне надо прямо в начале Flash разместить свои константные таблицы и данные о прошивке, собственно? Уже Tiva будет в пролете, получается... P.S. BootROM можно как-нибудь аппаратно отключить совсем? Я как-нибудь переживу его отсутствие (чтобы код загрузчика из BootROM не выполнялся)Тем более, время загрузки увеличивает. Это мне сегодня не важно - а завтра будет критически важно, например. Изменено 14 ноября, 2018 пользователем Arlleex Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 14 ноября, 2018 Опубликовано 14 ноября, 2018 · Жалоба 4 минуты назад, Arlleex сказал: P.S. BootROM можно как-нибудь аппаратно отключить совсем? Я как-нибудь переживу их полное отсутствиеТем более, время загрузки увеличивает. Это мне сегодня не важно - а завтра будет критически важно, например. Отключить даже если во флешь неправильная/отсутствующая прошивка? Не знаю. Думаю зависит от конкретного МК. Просто непонятно - что тогда процессору делать, если BootROM выключен и прошивки во флешь нет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 14 ноября, 2018 Опубликовано 14 ноября, 2018 · Жалоба Вобщем все прописи в линкер файле не возимели эффекта. пришлось прописывать имплиситли void main (void) { SCB->VTOR = 0x4000; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 183 14 ноября, 2018 Опубликовано 14 ноября, 2018 (изменено) · Жалоба Только что, jcxz сказал: Отключить даже если во флешь неправильная/отсутствующая прошивка? Не знаю. Думаю зависит от конкретного МК. Просто непонятно - что тогда процессору делать, если BootROM выключен и прошивки во флешь нет? Ну, наверное, ничего не делать. Одна песня все равно будет - идти и вскрывать, подключаться шнурочком по UART-у или чему-нибудь еще. Изменено 14 ноября, 2018 пользователем Arlleex Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 14 ноября, 2018 Опубликовано 14 ноября, 2018 · Жалоба 4 minutes ago, jenya7 said: Вобщем все прописи в линкер файле не возимели эффекта. пришлось прописывать имплиситли Да что же с вами со всем сегодня? Вообще-то эксплиситли :-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться