[an error occurred while processing this directive]
прогнал с разными уровнями оптимизации (+)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

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

Отправлено O.L. 19 сентября 2003 г. 08:02
В ответ на: Что может быть, парадокс! если не трудно можешь прогнать у себя этот кусок (+) отправлено Vlad77 18 сентября 2003 г. 18:12

Как бы все работает правильно.
Вот текст:
// -----------------------------------/ test f.w. /-
// ---- .def variables for test flash write --------
unsigned char xdata *pwrite;
unsigned char code *pread;
// test string
unsigned char code test_string[] = "Hello Vlad77!";
// -----------------------------------/ test f.w. /-

// -----------------------------------/ test f.w. /-
LED = 0;
puts("\r Write string to programm flash \n");

// initialize write/erase pointer
pwrite = (unsigned char xdata *) 0x3600;
pread = &test_string;
PSCTL = 0x03; // MOVX writes erase FLASH page

FLKEY = 0xA5; // FLASH lock and key sequence 1
FLKEY = 0xF1; // FLASH lock and key sequence 2
*pwrite = 0xff; // initiate page erase

PSCTL = 0; // MOVX writes target XRAM

pwrite = 0x3600; // initialize FLASH write pointer
PSCTL = 0x01; // MOVX writes target FLASH memory

while (*pread != '\0') { // copy until NULL is detected
FLKEY = 0xA5; // FLASH lock and key sequence 1
FLKEY = 0xF1; // FLASH lock and key sequence 2
*pwrite = *pread; // copy byte
pread++; // advance pointers
pwrite++;
}

FLKEY = 0xA5; // FLASH lock and key sequence 1
FLKEY = 0xF1; // FLASH lock and key sequence 2
//
data_temp = '\0';
*pwrite = data_temp;
//
// *pwrite = '\0'; // NULL-terminate string
PSCTL = 0x00; // MOVX writes target XRAM
pread = (unsigned char code *) 0x3600;

// data_temp = *pread++;

while ((data_temp = *pread)!= '\0')
{
//
data_temp = *pread++;
//
putchar (data_temp);
}
putchar ('\n');
LED = 1;
// -----------------------------------/ test f.w./-
и уже в самом конце программы
UART0_Init ();

pread = (unsigned char code *) 0x3600;
while ((data_temp = *pread)!= '\0')
{
//
data_temp = *pread++;
//
putchar (data_temp);
}
putchar ('\n');
while (1) continue;

в дизасме получается следующее:
Стираем память
77: pread = &test_string;
C:0x0056 751404 MOV 0x14,#0x04
C:0x0059 751531 MOV 0x15,#0x31
C:0x005C 758F03 MOV PSCTL(0x8F),#0x03
C:0x005F 75B7A5 MOV FLKEY(0xB7),#0xA5
C:0x0062 75B7F1 MOV FLKEY(0xB7),#P0MDIN(0xF1)
C:0x0065 8F82 MOV DP(0x82),R7
C:0x0067 8E83 MOV DPH(0x83),R6
C:0x0069 74FF MOV A,#0xFF
C:0x006B F0 MOVX @DPTR,A
//-------------------------------------!
Пишем последний 0:
103: data_temp = '\0';
C:0x009F E4 CLR A
C:0x00A0 F511 MOV 0x11,A
C:0x00A2 8F82 MOV DP(0x82),R7
C:0x00A4 8E83 MOV DPH(0x83),R6
C:0x00A6 E511 MOV A,0x11
C:0x00A8 F0 MOVX @DPTR,A
//-------------------------------------!
ну и читаем, кусок из самого конца:

229: while ((data_temp = *pread)!= '\0')
C:0x0279 851582 MOV DP(0x82),0x15
C:0x027C 851483 MOV DPH(0x83),0x14
C:0x027F E4 CLR A
C:0x0280 93 MOVC A,@A+DPTR
C:0x0281 F511 MOV 0x11,A
C:0x0283 6019 JZ C:029E
230: {
231: //
232: data_temp = *pread++;
233: //
C:0x0285 0515 INC 0x15
C:0x0287 E515 MOV A,0x15
C:0x0289 AE14 MOV R6,0x14
C:0x028B 7002 JNZ C:028F
C:0x028D 0514 INC 0x14
C:0x028F 14 DEC A
C:0x0290 F582 MOV DP(0x82),A
C:0x0292 8E83 MOV DPH(0x83),R6
C:0x0294 E4 CLR A
C:0x0295 93 MOVC A,@A+DPTR
//----------------- так и должно быть так как читаем область code --!
C:0x0296 F511 MOV 0x11,A
C:0x0298 FF MOV R7,A
C:0x0299 120003 LCALL PUTCHAR(C:0003)
235: }

Вот результат на терминале:

Hello Vlad77!
// --- дальше работа с eeprom ---
Sample read EEPROM 24c256
я© Copyright Old Lin TM ® 2003 -- finish
0x40

load data to buffer


0123456789:ABCDEFGHIJKLMNOPQRSTUVWXYZ
//--- вот и конец программы ---
яHello Vlad77!

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

Ответы



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

E-mail: info@telesys.ru