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