jenya7 0 Posted November 14, 2018 (edited) · Report post Есть бутлоадер. Его линкер файл 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 November 14, 2018 by jenya7 Quote Ответить с цитированием Share this post Link to post Share on other sites
Integro 0 Posted November 14, 2018 · Report post 37 minutes ago, jenya7 said: Получается главный прект я должен начать с 0x4000? Да, верно! обычно это обусловенно размером загрузчика и выравниванием страниц для возможности стирания App. 37 minutes ago, jenya7 said: ничего не работает после рисета. Не знаю что там у Вас в загрузчике и приложении но еще нужно убедиться чтобы корректно выставлялся Vector table (SCB->VTOR = 0x4000), это может делать как bootloder так и app зависит от реализации. В линкере также нужно поправить IntVectTable_start__ и IntVectTable_end__ для App. Quote Ответить с цитированием Share this post Link to post Share on other sites
jenya7 0 Posted November 14, 2018 (edited) · Report post 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 November 14, 2018 by jenya7 Quote Ответить с цитированием Share this post Link to post Share on other sites
VladislavS 0 Posted November 14, 2018 · Report post Не надо VTOR в загрузчике править. Лучше в самом приложении установите - оно лучше знает где у него таблица векторов. Я правильно понимаю, что это в IAR всё собирается судя по скрипту линкера? Тогда в __low_level_init() основного приложения добавь #pragma section = ".intvec" SCB->VTOR = (uint32_t) __section_begin(".intvec"); Quote Ответить с цитированием Share this post Link to post Share on other sites
jenya7 0 Posted November 14, 2018 · Report post 2 minutes ago, VladislavS said: Не надо VTOR в загрузчике править. Лучше в самом приложении установите - оно лучше знает где у него таблица векторов. Я правильно понимаю, что это в IAR всё собирается судя по скрипту линкера? Тогда в __low_level_init() основного приложения добавь #pragma section = ".intvec" SCB->VTOR = (uint32_t) __section_begin(".intvec"); Главный проект пишется не в IAR а в MCUXpresso. а там все через ж...GUI. Quote Ответить с цитированием Share this post Link to post Share on other sites
jcxz 0 Posted November 14, 2018 · Report post 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; Quote Ответить с цитированием Share this post Link to post Share on other sites
Kabdim 0 Posted November 14, 2018 · Report post Имхо лучше делать и там и там. В бутлоадере что бы можно было загрузить прошивку которая изначально не была написана под бутлоадер, а ей в запаре поменяли начальный адрес и всё. В прошивке которая сама всё знает, что бы быть уверенным что всё выставленно правильно с любой версией бутлоадера. Вообще я люблю код который полагается на окружение как можно меньше. Quote Ответить с цитированием Share this post Link to post Share on other sites
VladislavS 0 Posted November 14, 2018 · Report post 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 Quote Ответить с цитированием Share this post Link to post Share on other sites
AlexandrY 0 Posted November 14, 2018 · Report post 7 minutes ago, Kabdim said: Вообще я люблю код который полагается на окружение как можно меньше. В опенсорсах так не принято. Нормальная практика бутлодер сразу с приложением писать, находят они друг друга через специальные сектора во Flash, линкуются одновременно. Помню писал загрузчик для линукса, так там целые связные списки бесконечного числа опций передавались из бутлодера в линукс. Quote Ответить с цитированием Share this post Link to post Share on other sites
Kabdim 0 Posted November 14, 2018 · Report post Это все таки совсем другой мир, слабо пересекающийся Kinetis'ами. Quote Ответить с цитированием Share this post Link to post Share on other sites
jcxz 0 Posted November 14, 2018 · Report post 30 минут назад, VladislavS сказал: jcxz, Зачем? Если таблица в SRAM, то у неё адрес и так начинается с 0x20000000, то есть 1<<29 автоматом выполнен. Впрочем и правда. 33 минуты назад, Kabdim сказал: В бутлоадере что бы можно было загрузить прошивку которая изначально не была написана под бутлоадер, а ей в запаре поменяли начальный адрес и всё. Как такое возможно? Если прошивка была написана на работу stand-alone, то её таблица векторов должна располагаться начиная со стартового адреса flash. Но там же должна находиться таблица векторов бутлоадера, иначе он бы не запускался. И такую прошивку, которой "в запаре" что-то не так сделали, бутлоадер просто не должен прошивать во флешь или запускать. Мало ли что там ещё "в запаре" сделали или не сделали.... Quote Ответить с цитированием Share this post Link to post Share on other sites
Arlleex 0 Posted November 14, 2018 · Report post Just now, jcxz said: Как такое возможно? Если прошивка была написана на работу stand-alone, то она должна располагаться начиная со стартового адреса flash. Но там же должен находится бутлоадер, иначе он бы не запускался. Имеется в виду, видимо, что если лишь слинковать приложение со смещенного адреса, без сдвига таблицы векторов, то установка VTOR в загрузчике поможет. Kabdim, так если бутлоадер все настроил как надо, то в приложении можно так надвигать, что работать ничего не будет, в том числе и программно предусмотренный механизм входа в загрузчик. Я настраиваю все в загрузчике. Приложению остается только быть необходимым собранным с нужного адреса. Quote Ответить с цитированием Share this post Link to post Share on other sites
AlexandrY 0 Posted November 14, 2018 · Report post 16 minutes ago, Kabdim said: Это все таки совсем другой мир, слабо пересекающийся Kinetis'ами. В Zephyr project так же делается. Там даже драйвера через линкер подключаются. Quote Ответить с цитированием Share this post Link to post Share on other sites
jcxz 0 Posted November 14, 2018 · Report post 6 минут назад, Arlleex сказал: Имеется в виду, видимо, что если лишь слинковать приложение со смещенного адреса, без сдвига таблицы векторов, то установка VTOR в загрузчике поможет. Запускаемое приложение в любом случае знает где у него находится таблица векторов, так что в любом случае может выставить VTOR на неё. Хоть под что оно написано. Да и VTOR оно обязательно должно устанавливать. 6 минут назад, Arlleex сказал: Kabdim, так если бутлоадер все настроил как надо, то в приложении можно так надвигать, что работать ничего не будет, в том числе и программно предусмотренный механизм входа в загрузчик. Я настраиваю все в загрузчике. Приложению остается только быть необходимым собранным с нужного адреса. А откуда загрузчик знает где у загружаемой программы находится таблица векторов? Вобщем случае она может быть и не в начале образа. И их может быть несколько разных. Всё-таки - VTOR лучше явно устанавливать в самой программе. Quote Ответить с цитированием Share this post Link to post Share on other sites
Integro 0 Posted November 14, 2018 · Report post 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; Quote Ответить с цитированием Share this post Link to post Share on other sites