Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Задание карты памяти для компилятора и линкера в одном месте
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Dog Pawlowa
Сложность увязок проектов бутлоадера и приложения для контроллера и программы подготовки файла для загрузки зашкаливает.
В каждом проекте имеются адреса контрольных сумм, названий, области заполнения, еще адрес команды безусловного перехода на приложение типа:

Код
#define DEBUG_BEGIN_32                    0x8000
#define DEBUG_END_32                    0x87FF
#define APPLICATION_CHECKSUM_BEGIN_32    0x8800
#define APPLICATION_CHECKSUM_END_32        0x8801
#define APPLICATION_NAME_BEGIN_32        0x8802
#define APPLICATION_NAME_END_32            0x881F
#define APPLICATION_PROG_BEGIN_32        0x8820
#define APPLICATION_PROG_END_32            0xBFFB
#define JUMP_BEGIN_32                    0xBFFC
#define JUMP_END_32                        0xBFFF
#define APPLICATION_FILL_BEGIN            0x8802
#define APPLICATION_FILL_END            0xBFBD

#define BOOTLOADER_CHECKSUM_BEGIN_32    0xC000
#define BOOTLOADER_CHECKSUM_END_32        0xC001
#define BOOTLOADER_NAME_BEGIN_32        0xC002
#define BOOTLOADER_NAME_END_32            0xC02F
#define BOOTLOADER_PROG_BEGIN_32        0xC020
#define BOOTLOADER_PROG_END_32            0xFFDB
#define INTVECTORS_BEGIN_32                0xFFDC
#define INTVECTORS_END_32                0xFFFF


Разумеется, количество определений можно сократить, но это непринципиально.
А сейчас нужно сделать еще и для 32/64 кБ контроллера.
Для компиляторов ИАРа и PC я еще могу включать один хэдер, но линкер хочет получить -D<name>=<value>

Как я понимаю, еще можно определения адресов в командную строку подсунуть, но так быстро написать такое приложение я не смогу.
Как вообще-то люди делают? Тупо ручками? Левой правим хэдур, а правой - xcl, и потому вручную отслеживаем соответствие?

Речь о Renesas R8C, если что.
demiurg_spb
У меня вся эта красота задаётся лишь в одном месте в Makefile и далее что-то передаётся линкеру, а что-то в приложение в виде дефайнов:
Код
ADD_COMPILE_FLAGS += -DBOOTLOADER_START_ADDRESS=$(SECTION_BOOTLOADER_START)
ADD_COMPILE_FLAGS += -DBOOTLOADER_SIZE=$(BOOTLOADER_SIZE)
ADD_COMPILE_FLAGS += -DLOW_LEVELX_H=$(LOW_LEVELX_H)
ADD_COMPILE_FLAGS += -DDEVICE_DESCRIPTOR=$(BOOT_HARDWARE_ID_HEX)
ADD_COMPILE_FLAGS += -DPROJECT_NAME=$(PROJECT_NAME)
ADD_COMPILE_FLAGS += -DPROJECT_MAJOR_REV=$(PROJECT_MAJOR_REV)
ADD_COMPILE_FLAGS += -DPROJECT_MINOR_REV=$(PROJECT_MINOR_REV)

Таким образом один проект билдится для кучи вариантов железа и кучи модификаций (всего около 40 штук), в том числе и для контроллеров с разным объёмом памяти программ.
Запускаю сборку и иду пить чай:-)

Правда это не для IAR а под gcc, но я уверен, что тоже самое можно реализовать и для Вашего компилятора.
dxp
Цитата(demiurg_spb @ Feb 2 2011, 14:59) *
У меня вся эта красота задаётся лишь в одном месте в Makefile и далее что-то передаётся линкеру, а что-то в приложение в виде дефайнов:

+1. Только у меня не make, а SCons.

Dog Pawlowa
Основная идея в том, чтобы конфигурировать сборку на уровне сборочной тулзы, которая и управляет всем процессом. Оттуда можно и компилятору передавать параметры, и ассемблеру, и линкеру... да хоть программатору. Кроме того, там можно и значения не только задавать, но и вычислять. Помнится, был казус на фидоэхе ru.embedded, там человеку надо было логарифм константы подставлять, он написал что-то вроде: a = log(3);, компилятор ему тут взял и на рантайме функцию эту вызвал (а она с плавучкой) - скушало ресурса. А правильно сделать (как ему и посоветовали) - это вычислить значение этого логарифма на уровне сборочного скрипта и передать компилятору через командную строку.
Dog Pawlowa
Понятно, спасибо.
Надеялся, что не придется в жизни этим заниматься, но, если все сводится к изучению инструментов, выглядит не очень смертельным.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.