IAR Embedded Workbench for AVR (IAR EW AVR) - устранение ошибок компиляции |
![]() |
Добавил(а) microsin |
Здесь решил разместить разбор ошибок, которые у меня происходили при компиляции и методы их устранения. Решение - меню Project -> Options... -> General Options -> закладка System -> поставить галочку Enable bit definitions in I/O-Include files. В файле iom32.h стоит такой блок, который генерит это сообщение: #if TID_GUARD(3)#error This file should only be compiled with iccavr or Чтобы поправить, нужно корректно выбрать тип процессора. Меню Project -> Options... -> General Options -> закладка Target -> из выпадающего списка Processor configuration выбрать "--cpu=m32, ATmega32". Error[Pe104]: struct or union is too large c:\asm\polymuson\FlashFile\file_sys.h 114 Решение - меню Project -> Options... -> General Options -> закладка Target -> Memory model -> выбрать из выпадающего списка Small. Решение: a) Project -> Options... -> General Options -> закладка Heap Configuration -> меняем CLIB heap size со значения 0x10 на 0x300. The debugging session could not be started. Either the debugger initialization failed, or else the file "C:\asm\polymuson\Debug\Exe\1.cof" was corrupt or of an unsupported format. There might be more information in the Debug Log window. Лог отладки показывает следующее: Sat Jan 10 20:15:29 2009: Failed to load debugee: C:\asm\polymuson\Debug\Exe\1.cof Решение - Project -> Options... -> Linker -> закладка Output -> в поле формат выбрать Debug information for C-SPY и поставить галки With runtime control modules и With I/O emulation modules. После первой установки и запуска появилось следующее сообщение: Это произошло после того, как я изменил целевую папку установки. Новое месторасположение файла CodeTemplates.txt оказалось по адресу C:\Program Files\IAR Embedded Workbench 4.0 Evaluation\common\config\CodeTemplates.txt. Осталось открыть, как и предлагалось, меню Tools\Options..., перейти на закладку Editor Setup Files и исправить путь Use Code Templates (должна стоять галочка) на правильный. У меня при компиляции проекта, содержавшего смешанный код (ассемблер и C - это был проект с использованием библиотеки V-USB. Ассемблер был нужен для кода, критичного к времени выполнения), происходила следующая ошибка: Error[e18]: Range error, Проблема была в том, что команда rjmp USB_INTR_VECTOR в таблице векторов прерываний не доставала до нужной её метки (адрес метки был слишком большой для перехода по rjmp). Метода устранения ошибки два: a) Заменить команду rjmp на команду jmp - у неё нет тех ограничений, по дальности перехода, как у rjmp, но выполняется jmp на 1 такт дольше. В моем случае это нежелательно - код критичен к времени выполнения прерывания. b) Поместить код, который находится по метке USB_INTR_VECTOR, ближе к началу памяти, чтобы достала команда rjmp. Второй способ можно реализовать, добавив перед кодом с меткой, куда прыгает rjmp, директиву назначения сегмента, который размещается линкером ближе к началу памяти, чем сегмент CODE. Порядок сегментов, которого линкер по умолчанию придерживается, следующий (подсмотрел в листинге *.map): -Z(CODE)INTVEC=0-(_..X_INTVEC_SIZE-1) Самый лучший кандидат на нужный сегмент для размещения кода по метке USB_INTR_VECTOR - сегмент NEAR_F. Ошибка пропала, когда я размести перед этим кодом директиву RSEG NEAR_F, вот так (метка USB_INTR_VECTOR как раз та, которая стоит в команде rjmp): RSEG NEAR_F USB_INTR_VECTOR: Эта ошибка срабатывала у меня на следующий кусок файла C:\Program Files\IAR Systems\Embedded Workbench 5.3\avr\INC\iom32.h (или iom16.h): .. Ошибка пропадает, если перенести строку #pragma language=restore перед последним #endif, вот так: .. Segment ABSOLUTE (seg part no 5, symbol "_A_GPIOR1" in module "hid_task", address [4a-4a]) overlaps segment ABSOLUTE (seg part no 3, symbol "_A_OCR1A" in module "icp", address [4a-4b]) Error while running Linker Происходит потому, что один из модулей проекта ошибочно использует заголовочный файл < iom64.h >, а другой < iousb162.h > Ошибка возникала в IAR Embedded Workbench for AVR (проект на микроконтроллере ATmega8) при попытке выделить память из 128 байт в модели памяти Tiny. На эту строчку выдавалась ошибка [Pe095]: char buffer[128]; После того, как поменял модель памяти на Small, ошибка пропала. Error[e133]: The output format raw-binary cannot handle multiple address spaces. Use format variants (-y -O) to specify which address space is wanted Error while running Linker Вместо raw-binary может быть intel-standart или другой формат, который не поддерживает вывод в один файл нескольких адресных пространств памяти. Такая ошибка может возникнуть, если в проекте с AVR используете память eeprom (в коде для атрибутов переменных или массивов присутствует атрибут __eeprom), и хотите получить прошивку в обычном HEX-формате, или в двоичном файле. Ошибка может наблюдаться на IAR версий от 4.41 до 6.12, и может быть даже в других версиях. Устранить ошибку можно, если настроить вывод в дополнительные файлы для разных типов памяти с помощью опции линкера -O. Для этого откройте свойства проекта, зайдите в раздел настроек Linker, откройте закладку Output, выберите разделе Format радиокнопку Other, в выпадающем списке Output format выберите формат ubrof 8 (этот формат позволяет в один файл запихивать данные всех секций; его надо выбрать просто для того, чтобы линкер отработал без ошибок). Теперь проект начнет нормально компилироваться, без ошибок, но нам этого мало - надо еще получить файл прошивки в Intel HEX или сыром двоичном. Для этого применим дополнительную опцию -O. Снова откройте свойства проекта, зайдите в раздел настроек Linker, откройте закладку Extra Output, убедитесь, что снята галочка "Generate extra output file". Откройте закладку Extra Options (из всех закладок она последняя), поставьте галочку "Use command line options" и добавьте туда следующий текст: -Ointel-extended,(CODE)=$PROJ_DIR$\\Release\\Exe\\$PROJ_FNAME$_flash.hex Тут задано вывести в файл код программы (указана секция памяти CODE) в формате intel-extended (это и есть стандартный Intel HEX). Файл будет лежать в подпапке проекта Release\Exe\, и получит имя файла имяпроекта_flash.hex. То есть, к примеру, если корневой каталог проекта c:\TEMP\AVR245, и проект называется AVR245, то файл прошивки в формате HEX будет c:\TEMP\AVR245\Release\Exe\AVR245_flash.hex. Сюда же можно добавить еще несколько опций -O (по одну на строке) для вывода разных файлов в разные форматы. В качестве примера приведу вывод в двоичный формат (raw-binary) секций кода программы и секции памяти eeprom: -Ointel-extended,(XDATA)=$PROJ_DIR$\\Release\\Exe\\$PROJ_FNAME$_eeprom.hex -Oraw-binary,(XDATA)=$PROJ_DIR$\\Release\\Exe\\$PROJ_FNAME$_eeprom.bin -Ointel-extended,(CODE)=$PROJ_DIR$\\Release\\Exe\\$PROJ_FNAME$_flash.hex -Oraw-binary,(CODE)=$PROJ_DIR$\\Release\\Exe\\$PROJ_FNAME$_flash.bin |