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

Бутлодер для Кинетис

Ну как я понял (приблизительно).

 

1. Код загрузчика

Таблица векторов прерываний, а также самое первое слово в образе ПО загрузчика располагается, как и положено, в самом начале. Постольку-поскольку Cortex-Mx после сброса аппаратно загружает первое слово в MSP, а второе - в PC.

 

2. Код приложения

По сути может иметь любую структуру образа хранения во Flash. Например, можно разместить таблицу служебных данных в самом начале Flash, где будет сказано о размере прошивки, ее контрольной сумме, и, в том числе, значении MSP/PSP, адреса точки входа и адреса начала таблицы векторов (если она вообще есть - ведь она может быть динамически расположена в ОЗУ).

 

3. Как это работает

Почему позволительно расположить какую-то странную таблицу в начале Flash клиентского ПО, когда по идее там должен быть размещен образ таблицы векторов? Потому что в клиентское ПО мы попадаем из загрузчика, где явно есть инструкции установки MSP и точки входа. Соответственно, их положение в образе клиентского ПО может быть абсолютно произвольным в допустимых физических пределах.

 

Вижу это примерно так.

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


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

Уважаемый @jcxz, как Вы прокоментируете рекомендации авторитетного для вас IAR?

https://www.iar.com/support/tech-notes/general/creating-a-bootloader-for-cortex-m/

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


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

Integro, а как вы прокомментируете отсутствие VTOR на части Cortex-M? Кому верим? ARM или IAR?

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


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

относительно моего случая

если это адрес таблицы

define symbol IntVectTable_start__              = 0x00004000;
define symbol IntVectTable_end__                = 0x0000403f;

то адрес начала - конца кода ?

define symbol __ICFEDIT_region_ROM_start__      = 0x0000443F;
define symbol __ICFEDIT_region_ROM_end__        = 0x007FFFFF;

так что ли?

 

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


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

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

1. Код загрузчика

Таблица векторов прерываний, а также самое первое слово в образе ПО загрузчика располагается, как и положено, в самом начале. Постольку-поскольку Cortex-Mx после сброса аппаратно загружает первое слово в MSP, а второе - в PC.

Не факт что аппаратно. Где-то это может делать код из BootROM. А где-то - аппаратно.

И не факт что "в самом начале". Опять-же - в самом начале чего?

 

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

Почему позволительно расположить какую-то странную таблицу в начале Flash клиентского ПО, когда по идее там должен быть размещен образ таблицы векторов? Потому что в клиентское ПО мы попадаем из загрузчика, где явно есть инструкции установки MSP и точки входа. Соответственно, их положение в образе клиентского ПО может быть абсолютно произвольным в допустимых физических пределах.

"Странная таблица" может быть не только в клиентском ПО, но и в загрузчике. См. например семейство Infineon XMC4xxx. Т.е. - эта аксиома, что: "любое пользовательское ПО во флешь должно начинаться там с начала чего-то и управление передаётся на адрес из 0-го вектора и SP устанавливается туда-же" которую пропагандируют тут некоторые товарищи - вовсе не аксиома, а всего-лишь частный случай.

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


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

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

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


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

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

Уважаемый @jcxz, как Вы прокоментируете рекомендации авторитетного для вас IAR?

никак. читать лень.

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


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

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: Так что всё может быть очень причудливо.  :russian_ru:

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


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

Только что, 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: Так что всё может быть очень причудливо.  :russian_ru:

Именно:smile:

Изменено пользователем Arlleex

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


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

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 - опционален и определяется аппаратно.

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


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

Жаль, конечно... Плохо, когда что-то уже написали за тебя, при этом никого не спросив.

Мне, например, не совсем нравится подход Tiva - потому как он слишком тривиален, и даже в элементарном загрузчике руками можно проверить значение SP на более-менее адекватное значение. Причем как-нибудь более хитро. А тут просто на 0xFFFFFFFF проверили, типа есть там вообще прошивка или нет. А если мне надо прямо в начале Flash разместить свои константные таблицы и данные о прошивке, собственно? Уже Tiva будет в пролете, получается...

P.S. BootROM можно как-нибудь аппаратно отключить совсем? Я как-нибудь переживу его отсутствие (чтобы код загрузчика из BootROM не выполнялся):don-t_mention:Тем более, время загрузки увеличивает. Это мне сегодня не важно - а завтра будет критически важно, например.

Изменено пользователем Arlleex

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


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

4 минуты назад, Arlleex сказал:

P.S. BootROM можно как-нибудь аппаратно отключить совсем? Я как-нибудь переживу их полное отсутствие:don-t_mention:Тем более, время загрузки увеличивает. Это мне сегодня не важно - а завтра будет критически важно, например.

Отключить даже если во флешь неправильная/отсутствующая прошивка? Не знаю. Думаю зависит от конкретного МК. Просто непонятно - что тогда процессору делать, если BootROM выключен и прошивки во флешь нет?

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


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

Вобщем все прописи в линкер файле не возимели эффекта. пришлось прописывать имплиситли

void main (void)
{
    SCB->VTOR = 0x4000;

 

 

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


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

Только что, jcxz сказал:

Отключить даже если во флешь неправильная/отсутствующая прошивка? Не знаю. Думаю зависит от конкретного МК. Просто непонятно - что тогда процессору делать, если BootROM выключен и прошивки во флешь нет?

Ну, наверное, ничего не делать. Одна песня все равно будет - идти и вскрывать, подключаться шнурочком по UART-у или чему-нибудь еще.

Изменено пользователем Arlleex

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


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

4 minutes ago, jenya7 said:

Вобщем все прописи в линкер файле не возимели эффекта. пришлось прописывать имплиситли

Да что же с вами со всем сегодня? Вообще-то эксплиситли :-)

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


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

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

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

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

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

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

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

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

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

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