Программирование SDK 4.0

Re: Программирование SDK 4.0

Сообщение EuroElessar » 09 июн 2011, 09:37

kluchev писал(а):
EuroElessar писал(а):К сожалению, при попытке собрать (при помощи Watcom 11c) пример из исходников возник ряд проблем: ...


1. О каком из примеров идет речь? О том, что был выложен мной недавно на этом форуме?
2. Попробуйте оставить в проекте только то, что вам нужно. Например, только управление светодиодами. Если вы будете начинать сразу со сложного проекта, то вы никогда и ни в чем не разберетесь...


Написал следующее мелкое приложение, попытался собрать при помощи Watcom 11c и загрузить на sdk-4, но эффект тот же - загружаются только первые 452 байта. Вот лог выполнения build.bat, если он чем-нибудь может помочь: http://paste.kde.org/80089/

Похоже ошибся где-то в самом процессе сборки, правильно ли я делаю, что указываю путь к clibs.dll от dos i286?
EuroElessar
 
Сообщения: 6
Зарегистрирован: 08 июн 2011, 12:45
Откуда: Ekb

Re: Программирование SDK 4.0

Сообщение kluchev » 09 июн 2011, 13:45

EuroElessar писал(а):
kluchev писал(а):
EuroElessar писал(а):Написал следующее мелкое приложение, попытался собрать при помощи Watcom 11c и загрузить на sdk-4, но эффект тот же - загружаются только первые 452 байта. Вот лог выполнения build.bat, если он чем-нибудь может помочь: http://paste.kde.org/80089/

Похоже ошибся где-то в самом процессе сборки, правильно ли я делаю, что указываю путь к clibs.dll от dos i286?


По поводу приложения:
1. Инициализация I2C, а также функции Start и Stop для работы со светодиодами вам не нужны.
2. В конце программы нужен бесконечный цикл, иначе ваша программа повиснет.
3. Не забывайте про сброс сторожевого таймера с помощью функции ResetWDT()

Теперь, хотелось бы посмотреть на содержимое build.bat.
В споре рождается коллективное заблуждение, а истиной мы его называем для краткости
Аватара пользователя
kluchev
 
Сообщения: 995
Зарегистрирован: 04 апр 2008, 13:31
Откуда: SPb

Re: Программирование SDK 4.0

Сообщение EuroElessar » 09 июн 2011, 16:32

kluchev писал(а):
EuroElessar писал(а):
kluchev писал(а):
EuroElessar писал(а):Написал следующее мелкое приложение, попытался собрать при помощи Watcom 11c и загрузить на sdk-4, но эффект тот же - загружаются только первые 452 байта. Вот лог выполнения build.bat, если он чем-нибудь может помочь: http://paste.kde.org/80089/

Похоже ошибся где-то в самом процессе сборки, правильно ли я делаю, что указываю путь к clibs.dll от dos i286?


По поводу приложения:
1. Инициализация I2C, а также функции Start и Stop для работы со светодиодами вам не нужны.
2. В конце программы нужен бесконечный цикл, иначе ваша программа повиснет.
3. Не забывайте про сброс сторожевого таймера с помощью функции ResetWDT()

Теперь, хотелось бы посмотреть на содержимое build.bat.


Вот содержимое build.bat: http://paste.kde.org/80161/
Насколько я понимаю логика работы не может стать инициализатором проблемы с заливкой образа в микроконтроллер.. Но замечания учту
EuroElessar
 
Сообщения: 6
Зарегистрирован: 08 июн 2011, 12:45
Откуда: Ekb

Re: Программирование SDK 4.0

Сообщение kluchev » 10 июн 2011, 12:59

EuroElessar писал(а):Насколько я понимаю логика работы не может стать инициализатором проблемы с заливкой образа в микроконтроллер.. Но замечания учту


Естественно не может, просто бросились в глаза явные неточности.

Build.bat посмотрел, никакого криминала так сходу не заметил. Нужно видимо весь проект смотреть. Кстати, может с версией компилятора проблема? Загрузчик проверялся на совместимость с компилятором Watcom 11.0 1997 года выпуска. Заливка образа может сломаться, если формат exe по какой-либо причине не нравится загрузчику. Попробуйте более древнюю версию компилятора.

Код: Выделить всё
wcc -v
Watcom C16 Optimizing Compiler  Version 11.0
Copyright by Sybase, Inc., and its subsidiaries, 1984, 1997.
All rights reserved.  Watcom is a trademark of Sybase, Inc.
В споре рождается коллективное заблуждение, а истиной мы его называем для краткости
Аватара пользователя
kluchev
 
Сообщения: 995
Зарегистрирован: 04 апр 2008, 13:31
Откуда: SPb

Re: Программирование SDK 4.0

Сообщение kriogenoz » 16 июн 2011, 20:12

А версия 11B подойдёт, просто чисто 11 версии похоже нет нигде, даже на сайте производителя.
У вас случайно его нет?
kriogenoz
 
Сообщения: 3
Зарегистрирован: 03 июн 2011, 12:23

Re: Программирование SDK 4.0

Сообщение kluchev » 17 июн 2011, 17:05

kriogenoz писал(а):А версия 11B подойдёт, просто чисто 11 версии похоже нет нигде, даже на сайте производителя.
У вас случайно его нет?


На счет 11B не знаю, не пробовал. Попробуйте найти локатор для x86 или напишите его сами, с учетом изменений внесенных в новую версию компилятора...
В споре рождается коллективное заблуждение, а истиной мы его называем для краткости
Аватара пользователя
kluchev
 
Сообщения: 995
Зарегистрирован: 04 апр 2008, 13:31
Откуда: SPb

Re: Программирование SDK 4.0

Сообщение EuroElessar » 20 июн 2011, 08:52

kluchev писал(а):
kriogenoz писал(а):А версия 11B подойдёт, просто чисто 11 версии похоже нет нигде, даже на сайте производителя.
У вас случайно его нет?


На счет 11B не знаю, не пробовал. Попробуйте найти локатор для x86 или напишите его сами, с учетом изменений внесенных в новую версию компилятора...


Правильно ли я понимаю, что под "локатором для x86" понимается поиск точки старта приложения?
Не могли бы Вы сказать, за что в скрипте run.t2 в примере отвечает строчка:
Код: Выделить всё
29f400bb_MPC1
?
Не является ли это некоторым захардкоденным значением точки старта? Если да, то каким образом он получался? В документации не нашел про это даже упоминаний

Бинарники, полученные с помощью Watcom 11.0c прикреплены во вложениях. Не могли бы Вы их посмотреть? Может будут какие-нибудь идеи по решению задачи.

P.S. Сейчас проверяю компилятор версии 11.0b
P.P.S. С Watcom 11.0b ситуация аналогична
Вложения
example.rar
Архив с примерами, собранный Watcom 11.0c
(13.81 Кб) Скачиваний: 646
EuroElessar
 
Сообщения: 6
Зарегистрирован: 08 июн 2011, 12:45
Откуда: Ekb

Re: Программирование SDK 4.0

Сообщение kluchev » 20 июн 2011, 11:29

EuroElessar писал(а):Правильно ли я понимаю, что под "локатором для x86" понимается поиск точки старта приложения?


Нет. Посмотрите структуру exe файла для DOS. Там нет абсолютных ссылок. Локатор преобразует все относительные ссылки в абсолютные.

Не могли бы Вы сказать, за что в скрипте run.t2 в примере отвечает строчка:
Код: Выделить всё
29f400bb_MPC1
?
Не является ли это некоторым захардкоденным значением точки старта? Если да, то каким образом он получался? В документации не нашел про это даже упоминаний


29f400bb - название FLASH памяти фирмы AMD. Эта строчка определяет распределение секторов. Если не знать структуру FLASH, то неизвестно какие сектора нужно стирать перед записью.

Код: Выделить всё
0x80000, 0x83FFF, RW     
0x84000, 0x85FFF, RW     
0x86000, 0x87FFF, RW     
0x88000, 0x8FFFF, RW     
0x90000, 0x9FFFF, RW     
0xA0000, 0xAFFFF, RW     
0xB0000, 0xBFFFF, RW     
0xC0000, 0xCFFFF, RW     
0xD0000, 0xDFFFF, RW     
0xE0000, 0xEFFFF, RW     
0xF0000, 0xFFFFF, BOOTBLOCK


Бинарники, полученные с помощью Watcom 11.0c прикреплены во вложениях. Не могли бы Вы их посмотреть? Может будут какие-нибудь идеи по решению задачи.

P.S. Сейчас проверяю компилятор версии 11.0b
P.P.S. С Watcom 11.0b ситуация аналогична


Боюсь, что у меня на такой подвиг не хватит времени. Я занимался последний раз этой темой 10 лет назад.
В споре рождается коллективное заблуждение, а истиной мы его называем для краткости
Аватара пользователя
kluchev
 
Сообщения: 995
Зарегистрирован: 04 апр 2008, 13:31
Откуда: SPb

Re: Программирование SDK 4.0

Сообщение EuroElessar » 20 июн 2011, 18:50

kluchev писал(а):
EuroElessar писал(а):Правильно ли я понимаю, что под "локатором для x86" понимается поиск точки старта приложения?


Нет. Посмотрите структуру exe файла для DOS. Там нет абсолютных ссылок. Локатор преобразует все относительные ссылки в абсолютные.


Сравнил файлы в hexedit'е, заголовки у файлов немного отличаются, каким образом mpcloader ищет начало исполняемого кода в файле? Возможно какие-то моменты не были учтены при создание loader'а. Я понимаю, что это интеллектуальная собственность, но может быть возможно получить исходники mpcloader'а? Тогда я смог бы, скорее всего, исправить (доработать) загрузчик.
EuroElessar
 
Сообщения: 6
Зарегистрирован: 08 июн 2011, 12:45
Откуда: Ekb

Re: Программирование SDK 4.0

Сообщение EuroElessar » 20 июн 2011, 21:03

Хм, блин, кажется я сам "молодец".
Поизучал внимательнее hex dump файла - он по ходу от Windows 16bit получился. Надо разобраться тогда, почему не от dos'а
EuroElessar
 
Сообщения: 6
Зарегистрирован: 08 июн 2011, 12:45
Откуда: Ekb

Re: Программирование SDK 4.0

Сообщение kriogenoz » 22 июн 2011, 08:42

Одна из ошибок действительно была в том, что собиралось под Windows 16bit, после исправления исполняемый код стал заливаться целиком. Но работать он все равно не стал, как пример собранный из исходника, как и мелкий self-developed примеры ведут себя одинаково:

Код: Выделить всё
Open script file run.t2

Open channel:com1 57600
Erase FLASH [100.0%]
Write FLASH [100.0%]
Done
D:\sdk40_test\bin>term
** T2 monitor v 1.3.11 (12-11-2001)  LMT Ltd

Open script file term.t2

Open channel:com1 57600
TERM on in Bin mode...
MPC-1 Cold Loader
Determining memory available... Done
Testing available memory... ...............................Done
MPC-1 Cold Loader
Determining memory available... Done
Testing available memory... ...............................Done


Команду линковки довел до:
Код: Выделить всё
wlink op q sys dos name test.exe @test.lk1


То есть исполняемый код не запускается на SDK. Что примечательно - получаемый test.exe из исходников примера при помощи Watcom 11b и взятый бинарник из примера весят одинаково с точностью до байта, но содержимое - различное. Проверил на Watcom 11b, 11c, OpenWatcom 1.9, со всеми линкуется, заливается, но не работает
kriogenoz
 
Сообщения: 3
Зарегистрирован: 03 июн 2011, 12:23

Re: Программирование SDK 4.0

Сообщение kluchev » 24 июн 2011, 14:55

Можно попробовать упростить программу до пары ассемблерных команд. Или вообще бинарь в кодах сделать.
В споре рождается коллективное заблуждение, а истиной мы его называем для краткости
Аватара пользователя
kluchev
 
Сообщения: 995
Зарегистрирован: 04 апр 2008, 13:31
Откуда: SPb

Re: Программирование SDK 4.0

Сообщение kluchev » 24 июн 2011, 15:32

Вообще, самый простой тест это 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;
}

В споре рождается коллективное заблуждение, а истиной мы его называем для краткости
Аватара пользователя
kluchev
 
Сообщения: 995
Зарегистрирован: 04 апр 2008, 13:31
Откуда: SPb

Пред.

Вернуться в SDK 5.0 , SDK 4.0 и др.

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron