dimka76 42 5 февраля, 2020 Опубликовано 5 февраля, 2020 · Жалоба Уважаемые знатоки ! Есть микроконтроллер LPC18xx, у которого два банка FLASH памяти. Хотелось бы собрать проект так, чтобы часть кода была слинкована для одного банка памяти, а чать для другово. Это добавляет некоторые удобство, когда в первом банке находится основная программа, а во втором - всякие шрифты и картинки. Шрифты и картинки практически постоянны и могут занимать объем больший, чем сама программа. И поэтому их удобней один раз залить во второй банк, а основную программу переписывать в первом банке. И соответственно, за счет меньшего объема записываемого кода будет согращаться время программирования, что особенно важно на этапе разработки и отладки. Как разбить код по секциям я знаю, а вот как получить два выходных файла - один для первого банка памяти, другой для второго ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 5 февраля, 2020 Опубликовано 5 февраля, 2020 · Жалоба Для этого надо: * в скрипте линкера создать отдельную секцию для второго банка: MEMORY { RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 6K BANK1 (rx) : ORIGIN = 0x08000000, LENGTH = 32K BANK2 (rx) : ORIGIN = 0x08100000, LENGTH = 32K .... } ... SECTIONS { .bank2_data : { *(.bank2) *(.bank2.*) } >BANK2 ... * в исходниках указать для объектов эту секцию: int foo __attribute__((section(".bank2"))); * собрать проект, проверить работоспособность при заливке целиком * при помощи утилиты srec_cat сформировать два бинарника для двух банков. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 42 5 февраля, 2020 Опубликовано 5 февраля, 2020 · Жалоба 8 minutes ago, AHTOXA said: Для этого надо: * в скрипте линкера создать отдельную секцию для второго банка: * в исходниках указать для объектов эту секцию: * собрать проект, проверить работоспособность при заливке целиком * при помощи утилиты srec_cat сформировать два бинарника для двух банков. Спасибо. С первыми тремя пунктами я знаком и это мне понятно. А вот ваше предложение в четвертом пункте мне кажется ошибочным, т.к. Quote The srec_cat program is used to assemble the given input files into a single output file Я пытался смотреть в сторону objcopy. В ней есть опция удаления секций. По имени секции я могу удалить секцию для второго банка памяти. А вот наоборот ? Перечислять все секции, используемые компилятором трудоемка и велика вероятность ошибки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aaron 1 5 февраля, 2020 Опубликовано 5 февраля, 2020 · Жалоба Может создать отдельную цель сборки в makefile, и для этой цели сборки подсунуть отдельный ld-файл, где будет только секция BANK2 прописана? В этом ld-файле указать KEEP для всех данных из объектников, т.к. формально к ним обращений не будет, и оптимизатор может их выпилить при сборке. Ну и тогда объявление самих объектов надо вынести в отдельные файлы, не связанные с файлами для первой цели сборки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 42 5 февраля, 2020 Опубликовано 5 февраля, 2020 · Жалоба 5 minutes ago, Aaron said: Может создать отдельную цель сборки в makefile, и для этой цели сборки подсунуть отдельный ld-файл, где будет только секция BANK2 прописана? В этом ld-файле указать KEEP для всех данных из объектников, т.к. формально к ним обращений не будет, и оптимизатор может их выпилить при сборке. Я тоже думал над какой-то целью в makefile, но ничего не надумал. Скорее всего из-за недостатка знаний в этой области. С отдельным файлом линкера интересна ямысль, только вот KEEP вроде наоборот указывает не удалять секцию, даже если она не используется. Quote When link-time garbage collection is in use (-gc-sections), it is often useful to mark sections that should not be eliminated. This is accomplished by surrounding an input section's wildcard entry with KEEP(), as in KEEP(*(.init)) or KEEP(SORT(*)(.ctors)). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 5 февраля, 2020 Опубликовано 5 февраля, 2020 · Жалоба 50 минут назад, dimka76 сказал: Как разбить код по секциям я знаю, а вот как получить два выходных файла - один для первого банка памяти, другой для второго ? А зачем получать 2? Получайте один. При прошивке, например IAR, сначала сверяет текущее содержимое флешь с зашиваемым образом и не шьёт те сектора, содержимое которых совпадает с содержимым флешь. Да и бутлоадеры если по уму - нужно так же строить. Все мои бутлоадеры тоже так делают. А время считывания (для сверки) - оно незначительно по сравнению со временем записи/стирания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 42 5 февраля, 2020 Опубликовано 5 февраля, 2020 · Жалоба 4 minutes ago, jcxz said: А зачем получать 2? Получайте один. При прошивке, например IAR, сначала сверяет текущее содержимое флешь с зашиваемым образом и не шьёт те сектора, содержимое которых совпадает с содержимым флешь. Да и бутлоадеры если по уму - нужно так же строить. Все мои бутлоадеры тоже так делают. А время считывания (для сверки) - оно незначительно по сравнению со временем записи/стирания. Я использую FlashMagic и кажется он так не умеет. И этот раздел форума про GCC, а не про IAR. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aaron 1 5 февраля, 2020 Опубликовано 5 февраля, 2020 · Жалоба По поводу KEEP ещё раз: вы создаёте ld-файл с секцией BANK2. Далее в цели сборки перечисляете только те зависимости, которые должны попасть в BANK2. Типа такого: bank2.bin: graphics.o constans.o bank2_script.ld $(LD) graphics.o constans.o $(LDFLAGS) -Tbank2_script.ld -o "bank2.bin" Поскольку переменные/константы в привязываемых объектниках из этих же файлов не вызываются никак, то для них в ld-файле должно быть слово KEEP. SECTIONS { .bank2_data : { KEEP(*(.bank2)) KEEP(*(.bank2.*)) } >BANK2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 42 5 февраля, 2020 Опубликовано 5 февраля, 2020 · Жалоба 1 minute ago, Aaron said: По поводу KEEP ещё раз: вы создаёте ld-файл с секцией BANK2. Далее в цели сборки перечисляете только те зависимости, которые должны попасть в BANK2. Понятно. Спасибо. Попробую. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 5 февраля, 2020 Опубликовано 5 февраля, 2020 · Жалоба 23 минуты назад, dimka76 сказал: И этот раздел форума про GCC, а не про IAR. Мне кажется все современные отладчики должны так уметь. Разве не так? Насчёт FlashMagic-а не знаю - 100500 лет уж им не пользовался. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 42 5 февраля, 2020 Опубликовано 5 февраля, 2020 · Жалоба 13 minutes ago, jcxz said: Мне кажется все современные отладчики должны так уметь. Разве не так? Не знаю ((( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 5 февраля, 2020 Опубликовано 5 февраля, 2020 · Жалоба 1 час назад, dimka76 сказал: А вот ваше предложение в четвертом пункте мне кажется ошибочным, т.к. Цитата The srec_cat program is used to assemble the given input files into a single output file И тем не менее srec_cat умеет вырезать нужные кусочки. http://srecord.sourceforge.net/man/man1/srec_examples.html#CROPPING THE DATA Я точно помню, что использовал её для этих целей. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aaron 1 5 февраля, 2020 Опубликовано 5 февраля, 2020 · Жалоба Можно ликбез провести по поводу srec_cat? bin файлы же не обладают встроенной информацией о секциях адресов. Проводится подготовка промежуточных файлов .srec и из них далее из одного файла могут генерироваться несколько bin? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 42 5 февраля, 2020 Опубликовано 5 февраля, 2020 · Жалоба 2 minutes ago, Aaron said: Можно ликбез провести по поводу srec_cat? bin файлы же не обладают встроенной информацией о секциях адресов. Проводится подготовка промежуточных файлов .srec и из них далее из одного файла могут генерироваться несколько bin? В данном случае, наверное имеется ввиду, что у секции BANK2 будет известное фиксированное смещение относительно начала bin файла. И да, если вы на форуме пишите с цитированием, то у автора цитируемого сообщения будет уведомление. А если без цитаты, то автор сообщения, которому вы задаете вопрос может и не узнать о вашем вопросе, если не решит заглянуть снова в эту тему. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 5 февраля, 2020 Опубликовано 5 февраля, 2020 · Жалоба 20 минут назад, Aaron сказал: Можно ликбез провести по поводу srec_cat? bin файлы же не обладают встроенной информацией о секциях адресов. Проводится подготовка промежуточных файлов .srec и из них далее из одного файла могут генерироваться несколько bin? Для bin-файлов приходится задавать смещение вручную. Вот, например, как вырезать из двоичного файла app.bin 4 байта по адресу 0x1000 и записать их в файл app_crc.bin: srec_cat app.bin -binary -crop 0x1000 0x1004 -offset -0x1000 -o app_crc.bin -binary Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться