kategoria: ANSI C
[#1] Kompilacja programu C dla WarpOS
Mam prosty programik w C używający tylko stdio.h.

W jaki sposób skompilować go pod WarpOS tak aby działał pod OS 3.x ale na procesorze PPC?
Czy pod AmiDevCPP dam radę? Jaki target wybrać?
[#2] Re: Kompilacja programu C dla WarpOS

@pong777, post #1

ja korzystalem z vbcc i tam bylo dosc prosto
[#3] Re: Kompilacja programu C dla WarpOS

@pong777, post #1

W jaki sposób skompilować go pod WarpOS tak aby działał pod OS 3.x ale na procesorze PPC?


1. Instalujesz vbcc, jeśli masz WarpOSa to najlepiej zarówno binarkę m68k jak i WarpOS (nie ma konfliktu, obie się instalują do tego samego katalogu i można używać zamiennie). Stąd.
2. Instalujesz target ppc-warpos. Stąd.


Target posiada standardową bibliotekę C pod WarpOSa, ale przyda się jeszcze API AmigaOS (NDK AmigaOS 3.9) i WarpOSa (SDK WarpOSa z AmiNetu).

Możesz kompilować poleceniem vc jak zazwyczaj z dodanym parmetrem +warpos, np.:

vc +warpos mojprogram.c



AmiDevCPP




Ostatnia aktualizacja: 06.01.2016 20:50:02 przez strim_
[#4] Re: Kompilacja programu C dla WarpOS

@strim_, post #3

A czym różni się VBCC zaszyty w AmiDevCPP a ten natywny dla Amigi? Czy ten i ten korzystają z ixemul.library?
[#5] Re: Kompilacja programu C dla WarpOS

@pong777, post #4

amidevcpp bazuje na gcc a nie vbcc (o ile dobrze pamiętam)..
[#6] Re: Kompilacja programu C dla WarpOS

@MaaG^dA, post #5

Dokładnie. AmiDevCpp niczego pod WarpOSa nie skompilujesz.

VBCC ani domyślnie nie instaluje ani nie używa ixemul. Jak ktoś bardzo chce może doinstalować oczywiście.
[#7] Re: Kompilacja programu C dla WarpOS

@strim_, post #6

Nabazgrałem sobie taki programik do obliczania liczby PI (może posłużyć jako benchmark, specjalnie nieoptymalizowany)

#include <stdio.h>

int main()
{
    double a=4;
    double i;
    int sign=0;
    
    for (i=3.0;i<10000.0;i=i+2.0)
    {
     if (sign==0) 
     { 
      a=a-(4.0/i);
      sign=1;
     } 
     else
     {
      a=a+(4.0/i);
      sign=0;  
     }
    }
    printf("%1.20f",a);
    return 0;
}


Niestety nie może się skompilować pod VBCC. Co ciekawe zauważyłem też, że printf nie obsługuje formatowania liczb w stylu "%1.20f" ?

VC sdh1:pi2.c -o sdh1:pi2.exe


t_3_0.o: In "l6":
Error 21: t_3_0.o (CODE+0x2a): Reference to undefined symbol __ieeedivd.
t_3_0.o: In "l7":
Error 21: t_3_0.o (CODE+0x56): Reference to undefined symbol __ieeedivd.
t_3_0.o: In "l6":
Error 21: t_3_0.o (CODE+0x38): Reference to undefined symbol __ieeesubd.
t_3_0.o: In "l7":
Error 21: t_3_0.o (CODE+0x64): Reference to undefined symbol __ieeeaddd.
t_3_0.o: In "l5":
Error 21: t_3_0.o (CODE+0x80): Reference to undefined symbol __ieeeaddd.
t_3_0.o: In "l3":
Error 21: t_3_0.o (CODE+0x9a): Reference to undefined symbol __ieeecmpd.
vlink failed returncode 20
vlink -bamigahunk -x -Bstatic -Cvbcc -nostdlib vlibos3:startup.o "T:t_3_0.o"   -s -Rshort -Lvlibos3: -lvc -o sdh1:pi2.exe failed


VBCC i target dla m68k mam zainstalowane z instalatora. Assigny też się zrobiły w S-S. Proste hello world się kompiluje i działa. Problem pojawia się jak w kodzie jest pętla "for".
Ten program kompiluje się na PC pod innym kompilatorem i liczy PI poprawnie.

Ostatnia aktualizacja: 07.01.2016 11:47:00 przez pong777
[#8] Re: Kompilacja programu C dla WarpOS

@pong777, post #7

printf nie obsługuje formatowania liczb w stylu "%1.20f" ?


Obsługuje... aż sam to sprawdze.

Reference to undefined symbol __ieee


Nie linkujesz z biblioteką matematyczną. Dla 68k paramter -lmieee, dla WarpOS -lm podczas linkowania. Np.

vc -c pi.c 
vc -lmieee -o pi pi.o
[#9] Re: Kompilacja programu C dla WarpOS

@strim_, post #8

Super działa. Formatowanie też już działa. A gdzie można przeczytać jakie biblioteki linkujemy do jakich includów? Np. do time.h/math.h ?

Skompilowałem już z parametrem -fpu=6882 i działa pod FPU a bez niego GURU :)

Chcę sobie potestować szybkość generowania PI na różnych maszynach z różnymi FPU oraz z różnymi bibliotekami matematycznymi typu HSMathLib i ocenić szybkość pracy. Dodatkowo wersja m68k oraz WOS dla PPC oraz natywnie PPC dla AOS4.1.

Na PC oraz Androidzie jest taki program SuperPI który jest benchmarkiem dla CPU.

Teraz zostaje dodać obsługę czasu start/koniec obliczeń oraz pobieranie argumentu z konsoli o ilości inkrementacji/dokładności obliczeń.

W jaki sposób najlepiej na dzień dobry wykryć brak FPU i poinformować użytkownika o jego braku aby nie generować GURU po odpaleniu exeka na maszynie bez FPU?

Ostatnia aktualizacja: 07.01.2016 12:26:03 przez pong777
[#10] Re: Kompilacja programu C dla WarpOS

@pong777, post #9

Super działa. Formatowanie też już działa. A gdzie można przeczytać jakie biblioteki linkujemy do jakich includów? Np. to time.h/math.h ?


To powinno być w autodocach, ale jak wszystko w Amidze - dokumentacja albo nie istnieje, albo jest niekompletna. Jeśli ktoś wie gdzie to jest udokumentowane to niech napisze...

W systemach UNIXowych to jest zwykle w manualu od danej funkcji. Dla przykładu man funkcji cos w NetBSD. Widać od razu jakie pliki nagłówkowe są potrzebne i jaka biblioteka zawiera tą funkcję.

W jaki sposób najlepiej na dzień dobry wykryć brak FPU i poinformować użytkownika o jego braku aby nie generować GURU po odpaleniu exeka na maszynie bez FPU?


Patrz attnflags w execbase.

Swoją drogą, wydaje mi się, że target m68k VBCC ma bibliotekę msoft, która jest implementacją biblioteki matematycznej nie wymagającą FPU (linkujesz z -lmsoft zamisat -lmieee).


Ostatnia aktualizacja: 07.01.2016 12:29:47 przez strim_
[#11] Re: Kompilacja programu C dla WarpOS

@strim_, post #10

Ok dla potomnych jest w archiwum vbcc.pdf i nazwy bibliotek jakie można podawać.
[#12] Re: Kompilacja programu C dla WarpOS

@pong777, post #11

Może zrobimy w ramach PPA gałąź na githubie i będziemy tam wrzucać przydatne informacje oraz dokumentację wraz z przykładami dla nowicjuszy (lub w innym miejscu gdzie można wygodnie pobierać przykłady i strona ta nie zniknie). Podział na asm i c/c++, ze szkółkami chłopaków i innymi przykładami, żeby ludzie łatwiej mogli się wdrażać. Ja bym mógł coś w weekendy poogarniać i dodać przykłady wyświetlania obrazów w asm, zabezpieczenie systemu, obsługi przerwań. Przysiądę się też do C i otwierania ekranu pod RTG, bo mam jakiś przykładzik który sam napisałem, ale nie ma obsługi komunikatów i trzeba go ubijać, żeby wyjść.
Są różne gotowe toolchainy np. Cahira, zebrać wszystko w jednym miejscu, instrukcje instalacji, kompilacji, spore ułatwienie. Wiele osób się zniechęca na starcie, bo często próbuje coś prostego skompilować i jest problem, bez doświadczenia odbija się od ściany.
Taki zbiór przykładów mógłby dać niezłego kopa naszemu środowisku. Przykłady opisane od podstaw, razem jak się da z skonfigurowanymi środowiskami, bo ze swojego doświadczenia właśnie najwięcej problemów jest z zestawieniem wszystkiego i z wiedzą jak coś skompilować, co z czym. Bo sama składnia C jest wszędzie opisana.

Ostatnia aktualizacja: 07.01.2016 14:40:19 przez flops
[#13] Re: Kompilacja programu C dla WarpOS

@flops, post #12

Jestem za, to jest godny uwagi pomysł, ale proponuje zrobić do tego osobny wątek .

Tutaj.
[#14] Re: Kompilacja programu C dla WarpOS

@pong777, post #7

Działająca benchmarkowa wersja programu do własnych eksperymentów.
Przyjmuje z konsoli parametr określający dokładność/liczbę wykonań pętli - im więcej tym dłużej i dokładniej liczy i pozwala zobaczyć różnicę pomiędzy różnymi procesorami.
Podaje dokładny czas wykonania pętli.

#include <stdio.h>
#include <time.h>
int main(double arg)
{
double a=4.0;
double i;
short int sign=0;
float start;
float stop;
float results;
if (arg<10000.0) 
{
 arg=100000.0;
 printf("Usage: PI [10000.0-10000000.0]\n\n");
}    
start=(float)clock()/CLOCKS_PER_SEC;
for (i=3.0;i<arg;i+=2.0)
{
if (sign==0)
{
a-=(4.0/i);
sign=1;
}
else
{
a+=(4.0/i);
sign=0;
}
}
stop=(float)clock()/CLOCKS_PER_SEC;
results=(stop-start);
printf("PI = %1.20f \n",a);
printf("Cycles = %f \n",arg);
printf("Calculation time: %4.10f sec.\n",results);
return 0;
}


Ostatnia aktualizacja: 08.01.2016 12:11:55 przez pong777
[#15] Re: Kompilacja programu C dla WarpOS

@pong777, post #14

Wersja poprawiona:

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
double a=4.0;
double i;
double arg=0.0;
short int sign=0;
float start;
float stop;
float results;
if (argc>1) arg=strtod(argv[1], NULL);
if (arg<10000.0) 
{
 arg=10000.0;
 printf("Usage: PI [10000.0-10000000.0]\n\n");
}    
printf("Calculating using %f cycles. Please wait and dont move a mouse... \n\n",arg);
start=(float)clock()/CLOCKS_PER_SEC;
for (i=3.0;i<arg;i+=2.0)
{
if (sign==0)
{
a-=(4.0/i);
sign=1;
}
else
{
a+=(4.0/i);
sign=0;
}
}
stop=(float)clock()/CLOCKS_PER_SEC;
results=(stop-start);
printf("PI = %1.20f \n",a);
printf("Cycles = %f \n",arg);
printf("Calculation time: %4.10f sec.\n",results);
return 0;
}


Co ciekawe nie liczy po skompilowaniu w VBCC a działa poprawnie tutaj:
link

Ostatnia aktualizacja: 08.01.2016 12:45:34 przez pong777
[#16] Re: Kompilacja programu C dla WarpOS

@pong777, post #15

Co ciekawe nie liczy po skompilowaniu w VBCC


Ale co to dokładnie znaczy "nie liczy" ?
[#17] Re: Kompilacja programu C dla WarpOS

@strim_, post #16

Calculation time mam zawsze "000.0000".
PI się wylicza poprawnie.
[#18] Re: Kompilacja programu C dla WarpOS

@pong777, post #17

Wydaje mi się, że clock() nie jest zaimplementowane w biblitece C, która jest w VBCC. Musisz liczyć upływający czas w inny sposób.
[#19] Re: Kompilacja programu C dla WarpOS

@strim_, post #18

Chciałem skompilować pod AmiDevCPP ten program ale mam błąd linkera. Prawdopodobnie chodzi o to, że muszę dorzucić podczas linkowania jakąś bibliotekę tylko którą?

Używam time.h i stdlib.h

Linkuję tylko z "-noixemul"
[#20] Re: Kompilacja programu C dla WarpOS

@pong777, post #19

Wygląda na to, że pod VBCC stała działa a nie działa funkcja clock().
Zawsze zwraca wartość -0.02.

Niestety pod AmiDevCPP nadal nie skompilowałem bo nie wiem jaką bibliotekę zlinkować.

#include <stdio.h>

#include <time.h>

#include <stdlib.h>

int main(int argc, char *argv[])

{

double a=4.0;

double i;

double arg=0.0;

short int sign=0;

float start;

float stop;

float results;

if (argc>1) arg=strtod(argv[1], NULL);

if (arg<10000.0) 

{

 arg=10000.0;

 printf("Usage: PI [10000.0-10000000.0]\n\n");

}    

printf("Calculating using %f cycles. Please wait and dont move a mouse... \n\n",arg);

start=(float)clock()/CLOCKS_PER_SEC;

printf("Start time: %f\n",start);

for (i=3.0;i<arg;i+=2.0)

{

if (sign==0)

{

a-=(4.0/i);

sign=1;

}

else

{

a+=(4.0/i);

sign=0;

}

}

stop=(float)clock()/CLOCKS_PER_SEC;
results=(stop-start);
printf("End time = %f\n",stop);
printf("Clocks per sec = %f\n",(float)CLOCKS_PER_SEC);
printf("Clock = %f\n",(float)clock());
printf("PI = %1.20f \n",a);
printf("Cycles = %f \n",arg);
printf("Calculation time =  %4.10f sec. \n",results);

return 0;

}



Ostatnia aktualizacja: 09.01.2016 22:33:36 przez pong777
[#21] Re: Kompilacja programu C dla WarpOS

@pong777, post #20

nie działa funkcja clock()


Tak jak napisałem wyżej... nie jest zaimplementowana, więc nie będzie działać.

Proponuje użyć do tego natywnego dla Amigi API timera. Więcej tutaj.

Dlaczego clock() pod AmiDevCpp nie działa tego nie wiem, zwłaszcza, że nie podałeś konkretnego komunikatu błędu. Może ta funkcja nawet nie jest zdefiniowana.
[#22] Re: Kompilacja programu C dla WarpOS

@strim_, post #18

@ strim_
Wydaje mi się, że clock() nie jest zaimplementowane w biblitece C, która jest w VBCC.


Hmmm... dziwne. Myślałem, że VBCC dostarcza wszystkie standardowe biblioteki C w całości, a time.h jest przecież standardową biblioteką.
[#23] Re: Kompilacja programu C dla WarpOS

@R-Tea, post #22

Nie wszystkie, stąd wynika, że clock i tmpname nie działają. Pong też by dostał -1 z clock() gdyby nie castował na floata .

Tutaj też jest trochę na ten temat.

Ostatnia aktualizacja: 10.01.2016 00:35:24 przez strim_

Ostatnia aktualizacja: 10.01.2016 00:35:53 przez strim_
[#24] Re: Kompilacja programu C dla WarpOS

@strim_, post #23

A błąd w AmiDevCPP

[Linker Error] undefined reference to `_strtod'


spowodowany jest brakiem linkowania jakiejś biblioteki? Której (to przed stdlib.h)?
[#25] Re: Kompilacja programu C dla WarpOS

@pong777, post #24

Ta strona sugeruje, że musisz linkować z libnix i libm (-lm -lnix).
[#26] Re: Kompilacja programu C dla WarpOS

@strim_, post #25

To prawda i się kompiluje poprawnie. Natomiast coś nie tak jest z formatowaniem %f.

Np. PI wyświetla jako: 3.142,-3-+4./0..100000

Clock per sec dobrze wyświetla - 100.000000

Cycles natomiast zamiast 100000.0 to 100000.000001
[#27] Re: Kompilacja programu C dla WarpOS

@pong777, post #26

Np. PI wyświetla jako: 3.142,-3-+4./0..100000




Cycles natomiast zamiast 100000.0 to 100000.000001


Mniemam, że wynika to z niedokładności zmiennoprzecinkowej reprezentacji tej liczby. PROTIP: nigdy nie używaj liczb zmiennoprzecinkowych, gdy nie jest to potrzebne. Ilość cykli u Ciebie jest liczbą całkowitą i nie widzę szczególnego powodu, żeby robić ją zmiennoprzecinkową.

Tak swoją drogą, to gcc w AmiDevCpp używa FPU czy soft-float? A może jest to konfigurowalne?
[#28] Re: Kompilacja programu C dla WarpOS

@strim_, post #27

Z ciekawości sprawdziłem bo na NetSurfie pod libnixem też mi %f działało.
O dziwo z tym programem działa. Zlinkowałem -lm z libnixa 2.2.

Żeby skompilować bez FPU trzeba chyba użyć opcji "-msoft-float" a z FPU "-m68881".
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem