Jump to content

    
Sign in to follow this  
jenya7

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

Recommended Posts

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

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)! и ничего не работает после рисета.

Edited by jenya7

Share this post


Link to post
Share on other sites
37 minutes ago, jenya7 said:

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

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

37 minutes ago, jenya7 said:

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

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

 

Share this post


Link to post
Share on other sites
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;

 

 

Edited by jenya7

Share this post


Link to post
Share on other sites

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

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

 

Share this post


Link to post
Share on other sites
2 minutes ago, VladislavS said:

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


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

 

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

Share this post


Link to post
Share on other sites
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;

 

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites
7 minutes ago, Kabdim said:

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

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

Share this post


Link to post
Share on other sites
30 минут назад, VladislavS сказал:

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

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

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

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

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

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

Share this post


Link to post
Share on other sites
Just now, jcxz said:

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

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

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

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

Share this post


Link to post
Share on other sites
16 minutes ago, Kabdim said:

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

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

Share this post


Link to post
Share on other sites
6 минут назад, Arlleex сказал:

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

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

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

 

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

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

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

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

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

Share this post


Link to post
Share on other sites
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;

 

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.

Sign in to follow this