|
Народ, все картошку посадили? Вот напоролся я на глюк - хотелось бы узнать, это у всех так или только у меня? Кто-нибудь знает способ создать большой массив в IAR AVR 3.10, чтобы в этот массив можно было бы явно, напрямую, класть байты по старшим адресам? Компилер сует линкеру отрицательные смещения! Ж8-О. Например:
-Z(DATA)EXTRAM=1100-FFFF (сегмент данных во внешнем ОЗУ Меги128, XCL-файл)
Объявляем массив:
__no_init char IOBuf [60000] @ "EXTRAM";
В основной проге:
IOBuf [0] = 1;
IOBuf [32767] = 1;
IOBuf [32768] = 1;
Получаем:
312 IOBuf [0] = 1;
\ 00000000 E001 LDI R16,1
\ 00000002 9300.... STS IOBuf,R16
313 IOBuf [32767] = 1;
\ 00000006 9300.... STS (IOBuf + 32767),R16
314 IOBuf [32768] = 1;
\ 0000000A 9300.... STS (IOBuf - 32768),R16
Естественно, линкер орет:
Error[e18]: Range error,
Address out of range. Valid range is 0 to 65535 (0xFFFF).
Source: STS (IOBuf - 32768),R16
What: (IOBuf + 0xFFFF8000) [0xFFFF9100]
Allowed range: 0x0 - 0xFFFF
Operand: IOBuf [0xffff9100]
Вот такая, блин, бредятина...
Допустимый диапазон 0-FFFF, компилер же оперирует 32-битными смещениями (ну это понятно - общее процессоронезависимое ядро), путает старшую единицу со знаком и сам на себя ругается.
Вопрос - расслабиться и получать "удовольствие"?
Или есть может какой способ "настроить" компилятор?
(про то, что можно класть косвенно, через указатели, через волятиле, через кардан и выхлопную трубу - я знаю.)
E-mail: info@telesys.ru