Вообще, самый простой тест это jmp на себя. Пишем программу в HEX редакторе. В кодах. Загружаем. Затем, берем осциллограф и смотрим как выбирается команда из памяти. Смотрим состояние шины адреса, состояние шины данных и шины управления. Дальше тест усложняем. Берем, программируем какой-нибудь порт на вывод и подаем на него меандр (то 0, то 1 ) и смотрим осциллографом. Получилось - пытаемся разобраться с локатором. Как вариант - пишем свой.
Еще, не забывайте про дизассемблеры. Попробуйте дизассемблировать и посмотреть, что наваял ваш компилятор. Проверьте, есть такие команды у 186 процессора или нет.
Попробуйте загрузить полученную программу в отладчик. Старый отладчик для MSDOS подойдет, например
AFD.
Для загрузки бинаря можно попробовать вот такую команду:
- Код: Выделить всё
0x80000 data2flash test.bin
Если не получится, протокол там примитивнейший, можете наваять свой загрузчик. Информация передается пакетами, в бинарном виде. Каждый пакет идущий от кросс системы снабжен CRC16 (x^16+x^15+x^2+1). Контроллер принимает пакет и в случае совпадения CRC16 интерпретирует его. В случае удачного завершения операции контроллер выдает символ ‘+’, а в случае неудачи символ ‘-’. При подсчете CRC16 массивов с нечетной длиной необходимо производить дополнение массива 0xFF. Данные передаются по принципу «младший байт в перед».
TLA - целевой линейный адрес, 32 бита.
- Код: Выделить всё
Стирание сектора FLASH целевой системы
Преамбула Команда TLA CRC16
4 байта (“q04y”) 1 байт (0x31) 4 байта 2 байта
- Код: Выделить всё
Запись блока данных во FLASH целевой системы
Преамбула Команда TLA Длина Данные CRC16
4 байта (“q04y”) 1 байт (0x32) 4 байта 2 байта До 4 Кб 2 байта
Ниже, фрагмент загрузчика. Самое интересное, формирование пакетов и функция для подсчета CRC.
- Код: Выделить всё
int EraseSector(DWORD TLA)
{
int count=0,i;
unsigned short crc16;
BYTE ch;
ResetCom();
memset(Buffer,0xFF,100);
Buffer[count++]=Preambula0; // Преамбула
Buffer[count++]=Preambula1;
Buffer[count++]=Preambula2;
Buffer[count++]=Preambula3;
Buffer[count++]=ERASE_SECTOR; // Команда
Buffer[count++]=(BYTE)TLA; TLA>>=8; // TLA
Buffer[count++]=(BYTE)TLA; TLA>>=8;
Buffer[count++]=(BYTE)TLA; TLA>>=8;
Buffer[count++]=(BYTE)TLA;
crc16=CRC16(Buffer,count,0); // CRC16
Buffer[count++]=(BYTE)crc16; crc16>>=8;
Buffer[count++]=(BYTE)crc16;
for(i=0;i<count;i++) Wsio( Buffer[i] );
if(rsiot(&ch)) { ABORT=1; return MPC_TIMEOUT; }
if(ch != '+') { ABORT=1; return MPC_BAD_ANSWER; }
return 0;
}
int WriteBlock(BYTE * Buf, DWORD TLA, WORD Len)
{
int count=0,i;
unsigned short crc16;
BYTE ch;
WORD iTmp;
ResetCom();
memset(Buffer,0xFF,Len+100);
Buffer[count++]=Preambula0; // Преамбула
Buffer[count++]=Preambula1;
Buffer[count++]=Preambula2;
Buffer[count++]=Preambula3;
Buffer[count++]=WRITE_FLASH; // Команда
Buffer[count++]=(BYTE)TLA; TLA>>=8; // TLA
Buffer[count++]=(BYTE)TLA; TLA>>=8;
Buffer[count++]=(BYTE)TLA; TLA>>=8;
Buffer[count++]=(BYTE)TLA;
iTmp=Len;
Buffer[count++]=(BYTE)iTmp; iTmp>>=8;
Buffer[count++]=(BYTE)iTmp;
for(i=0;i<Len;i++)
{
Buffer[count++]=Buf[i];
}
crc16=CRC16(Buffer,count,0); // CRC16
Buffer[count++]=(BYTE)crc16; crc16>>=8;
Buffer[count++]=(BYTE)crc16;
for(i=0;i<count;i++) Wsio( Buffer[i] );
return 0;
}
// -------------------------------------------------------------------------------------------------------------------------------
#define POLY16 0xA001
//Расчет комбинированного полинома для контрольного байта
FCS16 calc_term16( FCS16 c_byte ) {
FCS16 term;
char n;
for ( n = 0, term = 0; n < 8; n++ )
if ( c_byte & 0x0001 ) c_byte=(c_byte>>1)^POLY16, term=(term>>1)^POLY16;
else c_byte>>=1, term>>=1;
return term;
}
FCS16 CRC16( crc_item huge * data, unsigned long Length, FCS16 start_crc ) {
while ( Length-- )
start_crc = calc_term16(start_crc^(FCS16)*data++)^(start_crc>>8);
return start_crc;
}