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

    

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

Есть бутлоадер. Его линкер файл

Quote

define symbol __ICFEDIT_region_ROM_start__      = 0x00000410;

define symbol __ICFEDIT_region_ROM_end__        = 0x00000AFF;

define symbol __ICFEDIT_region_RAM_start__      = 0x1fffff00;

define symbol __ICFEDIT_region_RAM_end__        = 0x1fffffff;

define symbol __ICFEDIT_region_RAM1_start__     = 0x20000000;

define symbol __ICFEDIT_region_RAM1_end__       = 0x200001ff;

define symbol IntVectTable_start__              = 0x00000000;

define symbol IntVectTable_end__                = 0x0000003f;

define symbol FlashConfig_start__               = 0x00000400;

define symbol FlashConfig_end__                 = 0x0000040f;

То есть начинается как положено с 0 адреса.

Я его прожигаю с J-Link.

В главном проекте я устанавливаю

define symbol __ICFEDIT_region_ROM_start__   = 0x00000В00; //следующий за AFF

define symbol __ICFEDIT_region_ROM_end__   = 0x07FFFFFF;

и генерирую бинарный файл srec.

Я запускаю утилиту буллодера нажимаю Connect и она мне пишет

Quote

Bootloader protocol version: 0x08 (Kinetis, read command supported)

CRC protocol NOT supported)

Bootloader version string: K10

System device ID: 0x10A [Kinetis K10] rev. 13

Kinetis Package: 144-pin

Number of memory blocks: 1

Memory block #1: 0x00004000-0x0007FFFF

Erase block size: 2048 bytes

Write block size: 128 bytes

Original vector table: 0x00000000-0x000003FF

New vector table: 0x00004000-0x000043FF

 

S19 Image Control.

Parsed S-record lines: 3577  Bytes total: 57192

Source address range: 0x0000-0xDF67

The S19 image also contains redirected vectors. The automatic redirection is skipped now.

WARNING! S19 image will not fit into available memory (at address 0x00000000)!

Несмотря на WARNING! S19 image will not fit into available memory (at address 0x00000000)! бинарный файл прожигается но ничего не работает.

В коде бутлодера есть такое

 JumpToUserApplication(*((unsigned long*)RELOCATED_VECTORS), *((unsigned long*)(RELOCATED_VECTORS+4))); 

RELOCATED_VECTORS почему то 0x4000. Получается главный прект я должен начать с 0x4000? Я пробовал но получаю тот же WARNING! S19 image will not fit into available memory (at address 0x00000000)! и ничего не работает после рисета.

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

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


Ссылка на сообщение
Поделиться на другие сайты
37 minutes ago, jenya7 said:

Получается главный прект я должен начать с 0x4000?

Да, верно! обычно это обусловенно размером загрузчика и выравниванием страниц для возможности стирания App.
 

37 minutes ago, jenya7 said:

ничего не работает после рисета.

Не знаю что там у Вас в загрузчике и приложении но еще нужно убедиться чтобы корректно выставлялся Vector table (SCB->VTOR = 0x4000), это может делать как bootloder так и app зависит от реализации.
В линкере также нужно поправить IntVectTable_start__  и IntVectTable_end__   для App.

 

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


Ссылка на сообщение
Поделиться на другие сайты
7 minutes ago, Integro said:

Да, верно! обычно это обусловенно размером загрузчика и выравниванием страниц для возможности стирания App.
 

Не знаю что там у Вас в загрузчике и приложении но еще нужно убедиться чтобы корректно выставлялся Vector table (SCB->VTOR = 0x4000), это может делать как bootloder так и app зависит от реализации.
В линкере также нужно поправить IntVectTable_start__  и IntVectTable_end__   для App.

 

функция такая

void JumpToUserApplication(LWord userSP, LWord userStartup)
{
  // set up stack pointer
  __asm("msr msp, r0");
  __asm("msr psp, r0");

  // Jump to PC (r1)
  __asm("mov pc, r1"); 
}

а какой должен быть IntVectTable_start__ - 0x400? если учесть что перед JumpToUserApplication есть SCB_VTOR = RELOCATED_VECTORS;

 

 

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

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


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

Не надо VTOR в загрузчике править. Лучше в самом приложении установите - оно лучше знает где у него таблица векторов. Я правильно понимаю, что это в IAR всё собирается судя по скрипту линкера? Тогда в __low_level_init() основного приложения добавь

  #pragma section = ".intvec"
  SCB->VTOR = (uint32_t) __section_begin(".intvec");

 

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


Ссылка на сообщение
Поделиться на другие сайты
2 minutes ago, VladislavS said:

Не надо VTOR в загрузчике править. Лучше в самом приложении установите - оно лучше знает где у него таблица векторов. Я правильно понимаю, что это в IAR всё собирается судя по скрипту линкера? Тогда в __low_level_init() основного приложения добавь


  #pragma section = ".intvec"
  SCB->VTOR = (uint32_t) __section_begin(".intvec");

 

Главный проект пишется не в IAR а в MCUXpresso. а там все через ж...GUI.

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


Ссылка на сообщение
Поделиться на другие сайты
7 минут назад, VladislavS сказал:

Тогда в __low_level_init() основного приложения добавь


  #pragma section = ".intvec"
  SCB->VTOR = (uint32_t) __section_begin(".intvec");

 

Вообще более корректно:

u32 j;
if ((j = (u32)&__vector_table) >= 0x20000000u) j |= 1u << 29;
NVIC.VTOR = j;

 

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


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

Имхо лучше делать и там и там.

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

В прошивке которая сама всё знает, что бы быть уверенным что всё выставленно правильно с любой версией бутлоадера.

Вообще я люблю код который полагается на окружение как можно меньше.

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


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

jcxzЗачем? Если таблица в SRAM, то у неё адрес и так начинается с 0x20000000, то есть 1<<29 автоматом выполнен.

 

jenya7

MCUXpresso, похоже на GCC сделан. В нём можно так сделать

  extern void *__vtor;
  SCB->VTOR = (uint32_t)&__vtor;

А в скрипте линкера

	.isr_vector :
	{
		. = ALIGN(4);
		PROVIDE(__vtor = .);
		KEEP(*(.isr_vector))
		. = ALIGN(4);
	} > SRAM

 

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


Ссылка на сообщение
Поделиться на другие сайты
7 minutes ago, Kabdim said:

Вообще я люблю код который полагается на окружение как можно меньше.

В опенсорсах так не принято.
Нормальная практика бутлодер сразу с приложением писать, находят они друг друга через специальные сектора во Flash, линкуются одновременно. 
Помню писал загрузчик для линукса, так там целые связные списки бесконечного числа опций передавались из бутлодера в линукс. 

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


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

Это все таки совсем другой мир, слабо пересекающийся Kinetis'ами.

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


Ссылка на сообщение
Поделиться на другие сайты
30 минут назад, VladislavS сказал:

jcxzЗачем? Если таблица в SRAM, то у неё адрес и так начинается с 0x20000000, то есть 1<<29 автоматом выполнен.

Впрочем и правда.

33 минуты назад, Kabdim сказал:

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

Как такое возможно? Если прошивка была написана на работу stand-alone, то её таблица векторов должна располагаться начиная со стартового адреса flash. Но там же должна находиться таблица векторов  бутлоадера, иначе он бы не запускался.

И такую прошивку, которой "в запаре" что-то не так сделали, бутлоадер просто не должен прошивать во флешь или запускать. Мало ли что там ещё "в запаре" сделали или не сделали....

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


Ссылка на сообщение
Поделиться на другие сайты
Just now, jcxz said:

Как такое возможно? Если прошивка была написана на работу stand-alone, то она должна располагаться начиная со стартового адреса flash. Но там же должен находится бутлоадер, иначе он бы не запускался.

Имеется в виду, видимо, что если лишь слинковать приложение со смещенного адреса, без сдвига таблицы векторов, то установка VTOR в загрузчике поможет.

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

Я настраиваю все в загрузчике. Приложению остается только быть необходимым собранным с нужного адреса.

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


Ссылка на сообщение
Поделиться на другие сайты
16 minutes ago, Kabdim said:

Это все таки совсем другой мир, слабо пересекающийся Kinetis'ами.

В Zephyr project так же делается. Там даже драйвера через линкер подключаются.  

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


Ссылка на сообщение
Поделиться на другие сайты
6 минут назад, Arlleex сказал:

Имеется в виду, видимо, что если лишь слинковать приложение со смещенного адреса, без сдвига таблицы векторов, то установка VTOR в загрузчике поможет.

Запускаемое приложение в любом случае знает где у него находится таблица векторов, так что в любом случае может выставить VTOR на неё. Хоть под что оно написано.

Да и VTOR оно обязательно должно устанавливать.

 

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

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

Я настраиваю все в загрузчике. Приложению остается только быть необходимым собранным с нужного адреса.

А откуда загрузчик знает где у загружаемой программы находится таблица векторов? Вобщем случае она может быть и не в начале образа. И их может быть несколько разных.

Всё-таки - VTOR лучше явно устанавливать в самой программе.

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


Ссылка на сообщение
Поделиться на другие сайты
21 minutes ago, Arlleex said:

Я настраиваю все в загрузчике. Приложению остается только быть необходимым собранным с нужного адреса.

Поддерживаю! Это менее инвазивный путь при смене адреса старта.
Кроме того нужно не забывать что приложение может быть собрано как PIC(Program Independent Code), в этом случае не нужна перелинковка, а загрузчик может положить его туда куда считает нужным.

Но оба подхода(установка таблицы векторов в bootloader или app) могу быть верными, все зависит от задачи

По делу,

1 hour ago, jenya7 said:

а какой должен быть IntVectTable_start__ - 0x400? если учесть что перед JumpToUserApplication есть SCB_VTOR = RELOCATED_VECTORS;

да, но не 0х400 а 0х4000, не сделайте подобную описку в линкере

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

 

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация