Помогите разобраться начинающему c IAR AVR.
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено PS 27 апреля 2004 г. 13:24

Помогите разобраться начинающему c IAR AVR.
Это мой первый проект на C.

Что имеем:
IAR EWAAVR 2.28a
AVRStudio v4.07
Chip Mega128

unsigned char __eeprom eeprom_string[9] = "12345678\xCA";
unsigned char ram_string[9];

Смотрим в AVRStudio EEPROM addr 0x0:
1,2,3,4,5,6,7,8,0xCA,0xFF,0xFF и т.д...

В программе:

for (a = 0; a < 9; a++) ram_string[a] = eeprom_string[a];

Смотрим результат в RAM:

2,3,4,5,6,7,8,0xCA,0,0xFF

Смотрим в AVRStudio ASM trasser:

+00000769: E020 LDI R18,0x00 // Это счетчик "a"
+0000076A: C00E RJMP +0x000E
: for (a = 0; a < 9; a++) ram_string[a] = eeprom_string[a];
+0000076B: E061 LDI R22,0x01 // Это смещение на eeprom_string
+0000076C: E070 LDI R23,0x00 // Почему не с нуля?!!!
+0000076D: E030 LDI R19,0x00
+0000076E: 0F62 ADD R22,R18
+0000076F: 1F73 ADC R23,R19
+00000770: 01AB MOVW R20,R22
+00000771: 940E09A8 CALL 0x000009A8 // Естесс-но после первого вызова
+00000773: E030 LDI R19,0x00 // имеем R16 = '2' а не '1'
+00000774: 01F9 MOVW R30,R18
+00000775: 59E3 SUBI R30,0x93
+00000776: 4FFB SBCI R31,0xFB
+00000777: 8300 STD Z+0,R16
: for (a = 0; a < 9; a++) ram_string[a] = eeprom_string[a];
+00000778: 9523 INC R18
: for (a = 0; a < 9; a++) ram_string[a] = eeprom_string[a];
+00000779: 3029 CPI R18,0x09
+0000077A: F380 BRCS +0x70

Не могу понять, почему линкер (в строках 76В и 76С) подставляет
адрес 0х1, хотя массив лежит с 0х0.
Если проинитить еще одну строчку, она тоже будет читаться
со смещением 1.
Через указатели такая же хрень.
Подскажите, что не так.

И еще, если не трудно, поясните бестолковому - как поместить
массив eeprom_string на конкретный физический адрес в EEPROM.


Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru