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 
aavr with processor option -v3
#endif /* TID_GUARD(3) */

Чтобы поправить, нужно корректно выбрать тип процессора. Меню 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
Error[Pe104]: struct or union is too large c:\asm\polymuson\FlashFile\file_sys.h 117
Error[Pe095]: array is too large c:\asm\polymuson\FlashFile\sd_cmd.c 51
Error[Pe095]: array is too large c:\asm\polymuson\FlashFile\file_sys.c 101
Error[Pe095]: array is too large c:\asm\polymuson\FlashFile\file_sys.c 2299

Решение - меню Project -> Options... -> General Options -> закладка Target -> Memory model -> выбрать из выпадающего списка Small.

Решение:

a) Project -> Options... -> General Options -> закладка Heap Configuration -> меняем CLIB heap size со значения 0x10 на 0x300.
b) Project -> Options... -> General Options -> закладка System, меняем размер CSTACK c 0x20 на 0x100, а RSTACK можно оставить как было равным 16. 

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.

После первой установки и запуска появилось следующее сообщение:
Failed to read the Code Template file "C:\Program Files\IAR Systems\Embedded Workbench 4.0 Evaluation\common\config\CodeTemplates.txt". C:\Program Files\IAR Systems\Embedded Workbench 4.0 Evaluation\common\config\CodeTemplates.txt contains an invalid path. To select another file choose the menu Tools->Options and select the Editor Setup Files tab.

Это произошло после того, как я изменил целевую папку установки. Новое месторасположение файла 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,  
PC offset out of range. Valid range is -4096 (-0x1000) to 4094 (0x0FFE). 
File: C:\asm\AVR910-protoss\usbdrv\usbdrvasm.S, Line: 54  
Source:     rjmp    USB_INTR_VECTOR 

Where $ = __ATmega128__ + 0x4  [0x4] 
            in module "usbdrvasm" (c:\asm\AVR910-protoss\Debug\Obj\usbdrvasm.r90), 
            offset 0x4 in segment part 0, segment INTVEC 
What: (usbCrc16 + 0x32) - ($ + 2) [0x1182] 
Allowed range: 0xFFFFF000 - 0xFFF 
Operand: usbCrc16Append [0x1188] 
           in module usbdrvasm (c:\asm\AVR910-protoss\Debug\Obj\usbdrvasm.r90), 
           Offset 0x32 in segment part 1, segment CODE

Проблема была в том, что команда 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)
-Z(CODE)TINY_F=_..X_FLASH_BASE-FF
-Z(CODE)NEAR_F=_..X_FLASH_BASE-_..X_FLASH_NEND
-Z(CODE)SWITCH=_..X_FLASH_BASE-_..X_FLASH_NEND
-Z(CODE)DIFUNCT=_..X_FLASH_BASE-_..X_FLASH_NEND
-Z(CODE)CODE=_..X_FLASH_BASE-_..X_FLASH_END
-Z(CODE)FAR_F=[_..X_FLASH_BASE-_..X_FLASH_END]/10000
-Z(CODE)INITTAB=_..X_FLASH_BASE-_..X_FLASH_END
-Z(CODE)HUGE_F=_..X_FLASH_BASE-_..X_FLASH_END
-Z(CODE)TINY_ID=_..X_FLASH_BASE-_..X_FLASH_END
-Z(CODE)NEAR_ID=_..X_FLASH_BASE-_..X_FLASH_END
-Z(CODE)CHECKSUM#_..X_FLASH_END

Самый лучший кандидат на нужный сегмент для размещения кода по метке USB_INTR_VECTOR - сегмент NEAR_F. Ошибка пропала, когда я размести перед этим кодом директиву RSEG NEAR_F, вот так (метка USB_INTR_VECTOR как раз та, которая стоит в команде rjmp):

    RSEG    NEAR_F
USB_INTR_VECTOR:
;order of registers pushed: YL, SREG [sofError], YH, shift, x1, x2, x3, cnt push YL ;2 [35] push only what is necessary to sync with edge ASAP in YL, SREG ;1 [37] push YL ;2 [39] ..

Эта ошибка срабатывала у меня на следующий кусок файла C:\Program Files\IAR Systems\Embedded Workbench 5.3\avr\INC\iom32.h (или iom16.h):

..
#endif /* ENABLE_BIT_DEFINITIONS */
#endif /* __IOM32_H (define part) */
#endif /* __IOM32_H (SFR part) */
#pragma language=restore //тут появлялась ошибка [Pa075]

Ошибка пропадает, если перенести строку #pragma language=restore перед последним #endif, вот так:

..
#endif /* ENABLE_BIT_DEFINITIONS */
#endif /* __IOM32_H (define part) */
#pragma language=restore#endif /* __IOM32_H (SFR part) */

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 (этот формат позволяет в один файл запихивать данные всех секций; его надо выбрать просто для того, чтобы линкер отработал без ошибок).

IAR AVR fix linker error e133 output

Теперь проект начнет нормально компилироваться, без ошибок, но нам этого мало - надо еще получить файл прошивки в 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

IAR AVR fix linker error e133 extra options