Board.KolibriOS.org

Official KolibriOS board
It is currently Mon Apr 22, 2019 1:35 am

All times are UTC+03:00




Post new topic  Reply to topic  [ 56 posts ]  Go to page Previous 1 2 3 4 Next
Author Message
 Post subject: Re: Open Watcom
PostPosted: Sat Jan 26, 2008 8:28 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
andrew_programmer

У тебя ошибка в коде. Правильно fputc('a',f);


Top
   
 Post subject: Re: Open Watcom
PostPosted: Sat Jan 26, 2008 9:48 pm 
Offline
User avatar

Joined: Thu May 19, 2005 4:43 pm
Posts: 896
Quote:
У тебя ошибка в коде. Правильно fputc('a',f);


Точно. Я перепутал с функцией fprintf() :)

Quote:
OPTION OFFSET=0


А где в IDE такая опция? Я что-то не нашёл.

Quote:
pe2kos <file.exe> file


Нужно использовать pe2kos_path.exe или pe2kos_nopath.exe ?

_________________
KolibriOS-перспективная ос!
Kolibri is best operation system in the world!


Top
   
 Post subject: Re: Open Watcom
PostPosted: Sat Jan 26, 2008 9:56 pm 
Offline
User avatar

Joined: Mon Apr 16, 2007 6:38 pm
Posts: 1222
а ты попробуй оба, на двух копиях файла..

_________________
И мы уже давно не пешки,
Мы пули, мы орлы, и решки!
Война ютит бинарный код,
Умри, или иди вперед!


Top
   
 Post subject: Re: Open Watcom
PostPosted: Sun Jan 27, 2008 12:59 am 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
andrew_programmer

Открываешь меню Options->Windows Linking Switches. Первая вкладка "Basic switches" в поле "Other options" пишешь OPTION OFFSET=0
В опциях компиляции выбираешь Register based calling.

Я сделал обработку математических исключений. Теперь в С можно устанавливать обработчик SIGFPE.
Добавил в библиотеку ваткомовский тест. В Win и Колибри результаты одинаковые. В Боше неправильно считается atan, в Qemu нет математических исключений. ftp://kolibrios.org/upload/clibr_02.7z


Top
   
 Post subject: Re: Open Watcom
PostPosted: Sun Jan 27, 2008 1:32 pm 
Offline
User avatar

Joined: Thu May 19, 2005 4:43 pm
Posts: 896
Ура! Заработало!

Serge, большое спасибо за помощ.
Любопытствующий вопрос. Какие функции содержатся в kolibc.lib ?

Поэкспериментирую с оптимизациями в OpenWatcom.
P.S.
Рабочим оказался вариант с pe2kos_path.exe , а вариант с pe2kos_nopath.exe неработает.

_________________
KolibriOS-перспективная ос!

Kolibri is best operation system in the world!


Top
   
 Post subject: Re: Open Watcom
PostPosted: Sun Jan 27, 2008 1:55 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
andrew_programmer
kolibc.lib попала по ошибке. Там был небольшой набор файловых С функций для компиляции Doom. Теперь она не нужна.


Top
   
 Post subject: Re: Open Watcom
PostPosted: Sun Jan 27, 2008 5:14 pm 
Offline
User avatar

Joined: Thu May 19, 2005 4:43 pm
Posts: 896
Пытался скомпилировать при помощи OpenWatcom свою научную программу.
Естественно пришлось переделать компиляторо-зависимые вещи в программе.
Всё переделал.Компилирую. И тут возникает непредвиденная проблема.

В файле libGUI.h объявляются функции из libGUI. Например:
Code:
void*  (_stdcall *CraeteBookmark)(struct HEADER *Parend,void *Control);


Потом в libGUI.c эти функции линкуются. В программе вышеприведённая функция
вызывается так:
Code:
CraeteBookmark( arguments )


Компиляция всех C файлов происходит нормально и создаются соответствующие obj
файлы. Но на этапе линковки возникает проблема. К именам функций из libGUI
добавляется символ "-". Поэтому линковщик пишет:
Code:
Warning! W1027: file interface.obj(C:\kolibri\watcom\projects\CMspectra\interface.c): redefinition of _CraeteBookmark ignored



И так для всех функций libGUI, встречающихся в других obj файлах.
Ну и соответственно собрать эти obj файлы в exe файл он неможет.

Как решить проблему ?

_________________
KolibriOS-перспективная ос!

Kolibri is best operation system in the world!


Top
   
 Post subject: Re: Open Watcom
PostPosted: Sun Jan 27, 2008 10:44 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
andrew_programmer

Ты объявил CraeteBookmark как указатель на функцию, то есть это переменная. При компиляции в каждом файле где есть строка #include "libgui.h" создаётся своя переменная а при линковке лишние игнорируются. Если CraeteBookmark действительно указатель объяви её extern void* (_stdcall *CraeteBookmark)(struct HEADER *Parend,void *Control); Если функция написана на асме то должна сохранять значения ebx ecx edx esi edi ebp. Ватком очень на это расчитывает.


Top
   
 Post subject: Re: Open Watcom
PostPosted: Sun Jan 27, 2008 11:59 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Посмотрел документацию, ecx и edx сохранять не надо.


Top
   
 Post subject: Re: Open Watcom
PostPosted: Mon Jan 28, 2008 7:29 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
pe2kos больше не нужен. Теперь можно линковать в программы в формате Колибри.

Это опции для линка: output raw op offset=0 op OBJALIGN=16 op STACK=4096 name имя_файла.exe

В меню Targets->Target options->Execute after добавить kpack.exe имя_файла.exe имя_файла

Размер стека можно устанавливать по необходимости, но меньше 4Кб не стоит. Проверку стека можно включить в опциях компиляции. Если не указать name имя_файла.exe то линковщик создаст файл с расширением .bin, а wmake сообщит что не удалось создать .exe

Я поправил заголовочные файлы, 1.7а теперь компилирует библиотеки


Top
   
 Post subject: Re: Open Watcom
PostPosted: Tue Jan 29, 2008 2:37 am 
Offline
User avatar

Joined: Thu May 19, 2005 4:43 pm
Posts: 896
Quote:
Я поправил заголовочные файлы, 1.7а теперь компилирует библиотеки


Действительно компилируются! Здорово!

Quote:
pe2kos больше не нужен. Теперь можно линковать в программы в формате Колибри.

Это опции для линка: output raw op offset=0 op OBJALIGN=16 op STACK=4096 name имя_файла.exe

В меню Targets->Target options->Execute after добавить kpack.exe имя_файла.exe имя_файла

Размер стека можно устанавливать по необходимости, но меньше 4Кб не стоит. Проверку стека можно включить в опциях компиляции. Если не указать name имя_файла.exe то линковщик создаст файл с расширением .bin, а wmake сообщит что не удалось создать .exe


Опробовал. Работает!

P.S.
Разрабатывать при помощи Watcom-а стало также удобно, как и при помощи GCC. А если ещё учесть, что у Watcom-а libC более приличная, то его можно считать самым лучшим инструментом для разработки на C под KolibriOS.
Serge, желаю удачи.

_________________
KolibriOS-перспективная ос!

Kolibri is best operation system in the world!


Top
   
 Post subject: Re: Open Watcom
PostPosted: Tue Jan 29, 2008 5:20 pm 
Offline

Joined: Thu Dec 21, 2006 10:51 am
Posts: 88
Такой вопрос, можно ли юзать STL в при компиляции с OpenWatcom. А конкретно меня интересует map.
В gcc пока что нельзя если не юзать minuetLibC, который откровенно ужаный. В нем праблы заключаются в отсутвии new.h и Allocator не компилится.

_________________
Если бы строители строили здания, так же как программисты пишут программы первый же залетевший дятел разрушил бы цивилизацию.


Top
   
 Post subject: Re: Open Watcom
PostPosted: Wed Jan 30, 2008 12:14 am 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
SHREDER

Я не знаю. Для Колибри наверное потребуется портировать часть runtime-кода. Одной Clib скорее всего не хватит.


Top
   
 Post subject: Re: Open Watcom
PostPosted: Fri Feb 01, 2008 3:46 am 
Offline
User avatar

Joined: Thu May 19, 2005 4:43 pm
Posts: 896
Уже несколько дней пытаюсь заставить работать скомпилированную OpenWatcom-ом мою
научную программу. Для работы программы используются функции из libC и минимум
прямых обращений к системным функциям(функции из файла kolibrisys.h)
Необходимые обёртки системных функций я переделал под OpenWatcom. Это объектные
файлы формата MS COFF.Регистры в ассемблерных функциях сохраняются в стеке, чтобы
не возникало конфликтов с кодом, генерируемым Watcom-ом.Структуры упакованы через
#pragma pack(1). Я компилировал Watcom-ом тестовую программу, использующую libGUI,
она работает.
В коде моей программы нет ничего специфичного для компилятора.C код программы
платформенно независим.
Сама программа компилируется.Я открываю ей файл со спектром и программа вылетает.
Я выискивал место вылета программы. И пришёл к выводу - дело не в моей программе,а
в компиляторе OpenWatcom или в libC...

Вот в чём дело.
Загрузка спектра и вычсисление начальных параметров из спектра происходит в функции
LoadSpectra. Если раскоментировать часть кода, выводящую проверочную информацию в
файл и скомпилировать, то проверочная информация показывает, что спектр загружается
правильно и начальные параметры из него опрееляются правильно. Вот код функции:
Code:
void LoadSpectra(char *file,struct lorents_information *info,struct PLOTINFO *plot,struct SCREEN *scr)
{
       int    i;
       FILE* f;
       
        info->spectr=malloc(SPECTRA_BUFFER_SIZE);
        info->spectr_theoretical=malloc(SPECTRA_BUFFER_SIZE);
        info->spectr_restored=malloc(SPECTRA_BUFFER_SIZE);
        info->P_H=malloc(SPECTRA_BUFFER_SIZE);

        LoadSpectr(file,info);
        GetParametersLoadedSpectr(info);
        //f=fopen("spectra.txt","wb");
       //for(i=0;i<1000;i++) {fprintf(f,"\n\r%d = |%6.1f|",i,info->spectr[i]);}
       
        plot->type_plot=PLOT_SPECTRA_N_EXPERIMENTAL;
        plot->Nmin=info->Nmin;
        plot->Naverege=info->Nbusis;
        plot->Nmax=info->Nmax;
        plot->Nspectr=info->spectr;
        plot->Nspectr_theoretical=info->spectr_theoretical;
        plot->ChannelMax=info->length_spectr-1;
        plot->ChannelMin=0;
        plot->ChannelNull=info->ChannelNull;
        plot->VelosityMax=info->vmax;
        plot->VelosityMin=info->vmin;
        plot->Pmax=1.0;
        plot->Pmin=info->Nmin/info->Nmax;
       
        scr->PlotP_H=MODE_SHOW_SPECTR;
   /*
       fprintf(f,"\n info->Nmin=%6.6f",info->Nmin);
       fprintf(f,"\n info->Nbusis=%6.6f",info->Nbusis);
       fprintf(f,"\n info->Nmax=%6.6f",info->Nmax);
       fprintf(f,"\n plot->ChannelMax=%6.6f",plot->ChannelMax);
       fprintf(f,"\n plot->ChannelNull=%6.6f",plot->ChannelNull);
       fprintf(f,"\n plot->VelosityMax=info->vmax;=%6.6f",info->vmax);
       fprintf(f,"\n plot->VelosityMin=info->vmin=%6.6f",info->vmin);

       fprintf(f,"\n plot->Nmin=%6.6f",plot->Nmin);
       fprintf(f,"\n plot->Naverege=%6.6f", plot->Naverege);
       fprintf(f,"\n plot->Nmax=%6.6f",plot->Nmax);
       fprintf(f,"\n plot->ChannelMax=%6.6f",plot->ChannelMax);
       fprintf(f,"\n plot->ChannelNull=%6.6f",plot->ChannelNull);
       fprintf(f,"\n plot->VelosityMax=info->vmax;=%6.6f",plot->VelosityMax);
       fprintf(f,"\n plot->VelosityMin=info->vmin=%6.6f",plot->VelosityMin);
       
       fclose(f);
   */
}


Но! Если сразу же после вызова функции LoadSpectra вывести этиже параметры(из тех же
структур) в другой файл, то они окажутся совершенно другими. Это значит, что чтение
данных происходит из другой области памяти. При компиляции GCC такой проблемы не
возникает. Как вы видели программа нормально работает.
Вот код, где происходит вызов функции LoadSpectra и запись параметров в другой файл:
Code:
int main(int argc, char **argv)
{
  char                                          exit_status;
  struct        WINDOW                          *win;
  struct        SCREEN                          *scr;
  struct        PLOTINFO                        *plot;
  struct        lorents_information             *lorents;
  struct        X                               *x_c;
  struct        HEADER                          *Parend;
  struct        MESSAGE                         *Message;
  struct        process_table_entry             *ProcessInformation;
  struct        ControlBookmark2                *Bookmark2;
  struct        ControlProgressbar              *CalculationProgress;

  dword                                         *controls;
  dword  x,y,mouse_buttons;
  int                                           i;
  int                                           key;
  int                                           count_iteration;
  float                                         step_iteration;
  unsigned      char                            sound_end_calculation[]={150,64,0,0,0};
  char                                          *pathspectr;
  FILE*                                          f;

  pathspectr=argv[1];
  printf("\n\rpath=%s",pathspectr);
  _ksys_set_wanted_events(0x67);
 
  count_iteration=0;

  printf("\n\rbegin init libGUI");
  Init_libGUI();
  printf("\n\rlibGUI initialized succesfull.");
 
  win=malloc(sizeof(struct WINDOW));
  lorents=malloc(sizeof(struct lorents_information));
  x_c=malloc(sizeof(struct X));
  scr=malloc(sizeof(struct SCREEN));
  plot=malloc(sizeof(struct PLOTINFO));

  win->posx=WINDOW_POSX;
  win->posy=WINDOW_POSY;
  win->sizex=WINDOW_SIZEX;
  win->sizey=WINDOW_SIZEY;

  printf("\n\rbegin load spectra");
  LoadSpectra(pathspectr,lorents,plot,scr); //------------------------------------------------

    f=fopen("info.txt","wb");
       fprintf(f,"\n info->Nmin=%6.6f",lorents->Nmin);
       fprintf(f,"\n info->Nbusis=%6.6f",lorents->Nbusis);
       fprintf(f,"\n info->Nmax=%6.6f",lorents->Nmax);
       fprintf(f,"\n plot->ChannelMax=%6.6f",plot->ChannelMax);
       fprintf(f,"\n plot->ChannelNull=%6.6f",plot->ChannelNull);
       fprintf(f,"\n plot->VelosityMax=info->vmax;=%6.6f",plot->VelosityMax);
       fprintf(f,"\n plot->VelosityMin=info->vmin=%6.6f",plot->VelosityMin);

       fclose(f);
       
  printf("\n\rspectra loaded");
  draw_window(win);
 
  controls=malloc(TOTAL_NUMBERS_OF_CONTROLS*100);
  Parend=(struct HEADER *)malloc(sizeof(struct HEADER));
  Message=(struct MESSAGE *)malloc(sizeof(struct MESSAGE));
  ProcessInformation=malloc(sizeof(struct process_table_entry));

  printf("\n\rbegin create interface");
  CraeteInterface(controls,Parend,win,scr,plot);
  printf("\n\rinterface created");
  printf("\n\rbegin display information");
  DisplayInformation(controls,lorents);
  printf("\n\rinformation displayed");
 
  Message->type=MESSAGE_FULL_REDRAW_ALL;
  Message->arg1=0;
  Message->arg2=0;
  Message->arg3=0;

  printf("\n\rbegin send first message");
  SendMessage(Parend,Message);
  printf("\n\rmessage sended");


Как видно вызов функции LoadSpectra происходит ещё до создания интерфейса, поэтому
функции libGUI тут непричём.

_________________
KolibriOS-перспективная ос!

Kolibri is best operation system in the world!


Top
   
 Post subject: Re: Open Watcom
PostPosted: Fri Feb 01, 2008 7:55 am 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
А что делают
LoadSpectr(file,info);
GetParametersLoadedSpectr(info); ?

если lorents ( наверное Lorentz ?) хранится в регистре то значение может теряться внутри вызовов. Проверь значение указателя до и после вызовова LoadSpectra.


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 56 posts ]  Go to page Previous 1 2 3 4 Next

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 2 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
Powered by phpBB® Forum Software © phpBB Limited