NKC Forum |
Author | Topic: Projekt C-Crosscompiler | ||||
---|---|---|---|---|---|
andi Stammgast ID # 213 |
Posted on June 01, 2022 07:30 PM (#21)
Quote
PM E-mail
Hallo,
ich hab vor langer Zeit mal den GCC an den NKC angepasst (mit Newlib etc.). Für den Fall dass es jemanden Interessiert habe ich die Beschreibung (+ Download) hier https://github.com/avg67/nkc/wiki/GCC-Crosscompile-Framework-f%C3%BCr-den-NKC Damit hab ich auch schon erfolgreich einige Jados-Programme geschrieben. Zwei davon (Dhrystone-benchmark und 4-gewinnt Spiel) sind im Source dabei. |
||||
Posts: 188 | Member since: May 2021 | IP address: not saved | |||||
cerker68k Kennt sich schon aus ID # 219 |
Posted on June 01, 2022 09:28 PM (#22)
Quote
PM E-mail
Bei 68008 wirft er mir in der Ursprungsversion einen Haufen Fehler, erstmal weil er versucht den GCC mit -m68008 aufzurufen, was natürlich nix ist. Wenn ich das korrigiere und auch die ganzen #ifdefs anpasse, kompiliert er, aber wirft mir immer wieder "ADRESS FEHLER" weil offenbar öfter versucht mit Word- und Langwortzugriffen auf ungerade Adressen zu gehen. Warum versuche ich gerade rauszufinden. Nach meinem Gefühl gerne im Bereich der Debugausgaben. Vermutlich hat nur ein Makro ein Problem. Vielleicht sind es auch meine 68008 "Fixes" die was versaut haben Ich hab das Repo mal geforked und spiele etwas damit. (Bin gestern um 1 ins Bett gekommen, heute muss ich früher, brr) Ich hab die Änderungen mal in den Fork gepushed: https://github.com/cerker68k/NKC-CLIB Vermutlich sind ein paar von den LEA32A0 etc. auch überflüssig. Wenn ich CONFIG_DEBUG_MM anschalte, kackt er im dbg_walk_heap ab .. und zwar an der Stelle wo er "FREE" anzeigen sollte.
Im mm_lldbghex und offenbar passiert es beim dereferenzieren von location->free .. obwohl location ja auf _HEAP stehen sollte und _HEAP zuvor, mit mm_lldbghex, korrekt angezeigt wird. In D0 und A0 steht dann übrigens die gleiche ungerade Zahl .. die auch auf nichts sinnvolles zeigt.
Auch mal anschauen... Gruß, Christian |
||||
Posts: 71 | Member since: October 2021 | IP address: not saved | |||||
cerker68k Kennt sich schon aus ID # 219 |
Posted on June 02, 2022 07:12 AM (#23)
Quote
PM E-mail
Ich habe nochmal schnell das "j" hinter "BLOCK..." durch location ersetzt, um zu sehen ob der Pointer richtig ist.
Er ist es, steht auf Heap und ....C ist auch gerade. Warum kommt dann bei "location->free" Mist raus.
Im Fehlerscreen sind D0 und A0 beide auf 0x221F4E75, das ganze auf 0xF702 im Code (habe das Shell-Demoprojekt probiert) was laut mapfile in mm_free/dbg_walk_heap liegt. Mit Disassembly an folgender Instruktion:
Die 2 vorgehenden sind recht sicher die Dereferenzierung, die aber schiefläuft und dann schlägt move.l 12(%a0) fehl weil %a0 eben ungerade ist .. interessant ist, dass in -4(%fp) eben _HEAP stehen sollte, wurde ja am Anfang gesetzt? Macht irgendwas zwischendurch A6 (den Framepointer) kaputt (blöderweise hab ich den NKC gerade abgedreht und kann ned in A6 schauen und muss jetzt dringend los) .. Compilerfehler? (Ja ich weiß ists fast nie, aber da die uclinux-Seite down ist musste ich mir die vorgeschlagene Toolchain aus diversen Mirrors zusammenkratzen .. vielleicht buggy?) Ich glaub ich hab gerade erfolgreiches Rubber-Duck-Debugging betrieben. Ich hab mich erinnert, dass ich mal den Monitor gefilmt hatte um die kurz aufblinkenden Meldungen zu sehen und auf dem Video auch der Fehlerscreen war .. Jup. A6 steht auf $D4... irgendwas. Das ist im Grundprogramm. Und ja, Aufrufe von Grundprogrammroutinen über TRAP nutzen A6 um die Adresse zu berechnen, d.H. sie zerschießen den Framepointer und move.l -4(%fp),%d0 / move.l %d0,%a0 zieht nicht die Basisadresse der Location-Struct, sondern die ersten Befehle von CO2SER (glaube ich). Die Frage ist nun, ist das ein Problem in Compilersettings, oder muss man den einfach in den GP-Aufrufen auf den Stack retten? Die Lib lief ja so schonmal? Gruß, Christian |
||||
Posts: 71 | Member since: October 2021 | IP address: not saved | |||||
cerker68k Kennt sich schon aus ID # 219 |
Posted on June 02, 2022 11:01 AM (#24)
Quote
PM E-mail
So. Jetzt hab ich gerade Mittagspause und schau nochmal theoretisch in den Code, ausprobieren kann ich es vermutlich erst morgen.
Wirklich zuverlässig ist die Adressfehler-Stelle wie gesagt wenn man das Debugging über serielle Schnittstelle anschaltet. Dann p |
||||
Posts: 71 | Member since: October 2021 | IP address: not saved | |||||
hschuetz Administrator Seitenadmins ID # 3 |
Posted on June 17, 2022 03:44 PM (#25)
Quote
PM E-mail HP
test
----------------------- Ob 8bit oder 16 oder 32 ist doch egal, Haupsache selbstgebaut! |
||||
Posts: 913 | Member since: June 2004 | IP address: not saved | |||||
Torsten Kennt sich schon aus ID # 92 |
Posted on June 17, 2022 09:21 PM (#26)
Quote
PM E-mail
Hi Christian,
bitte poste doch deinen letzten Beitrag nochmal, irgendwie sind die letzten Beiträge in dem Thread verloren gegangen. LG Torsten |
||||
Posts: 78 | Member since: March 2008 | IP address: not saved | |||||
cerker68k Kennt sich schon aus ID # 219 |
Posted on June 18, 2022 06:40 PM (#27)
Quote
PM E-mail
Hmm, das hab ich schon wieder vergessen, was ich da geschrieben hatte, darum hatte ichs ja geschrieben
Muss ich rekonstruieren. |
||||
Posts: 71 | Member since: October 2021 | IP address: not saved | |||||
tuti Stammgast ID # 225 |
Posted on September 23, 2022 08:26 PM (#28)
Quote
PM E-mail
Hallo, andi (aber auch gerne alle anderen). Als erste kleine Programmierübung wollte ich mal einen Player für VGM-Dateien mit Ausgabe auf SOUND3 basteln (zumindest für solche Dateien mit Inhalt für "unseren" AY-3-8910). Leider scheitere ich schon beim Einlesen der Datei mit getc, fgetc oder auch fread. Die liefern letzten Endes alle das Gleiche. Aber es ist binäre Grütze! Das parallel auf einem "normalen" Linux-System compilierte Programm läuft dort einwandfrei. Frage: Hat schon jemand erfolgreich was mit diesen Funktionen gebaut? Ansonsten würde ich mich mal mit diesen Jados-Traps befassen und damit mein Glück versuchen. Da gibt es ja offensichtlich vielversprechende Routinen. Ich hatte nur eigentlich gehofft, dass diese Lib hier sich mit diesen Funktionen vielleicht schon selbst an die Traps dran hängt und ich mir das sparen kann... Gruß, Torsten (der für jedes funktionierende Fragment mit getc und Co. dankbar ist). ----------------------- Definitiv sind Frösche und Himbeeren am besten! |
||||
Posts: 266 | Member since: July 2022 | IP address: not saved | |||||
andi Stammgast ID # 213 |
Posted on September 23, 2022 10:02 PM (#29)
Quote
PM E-mail
Ah ja bei meinem GCC-Port sind leider (noch) nicht die Jados-Traps mit den file-Funktionen verbunden. Das steht auch auf meiner Todo-Liste. Mit fopen, read, write kannst derzeit nur auf die Ser lesen / schreiben (auch Interrupt-getrieben). Wenn du files lesen willst musst die Jafos-Traps direkt via Inline-Assembly verwenden.
LG Andi |
||||
Posts: 188 | Member since: May 2021 | IP address: not saved | |||||
tuti Stammgast ID # 225 |
Posted on September 29, 2022 06:44 AM (#30)
Quote
PM E-mail
Ich habe jetzt meine ersten Routinen zum Aufruf von Jados-Traps mit Inline-Assembler fertig. Ist aber noch nicht ganz rund. Insbesondere die Parameter-Übergabe in die Funktion - und damit in den Inline-Assembler - hinein habe ich sehr hausbacken gelöst: Böse böse die Bytes gezählt und zur Laufzeit eine Konstante in einer Speicherzelle des Inline-Assemblers modifiziert!
Ähnlich für die Rückgabe von Werten der Funktion. Hat da jemand schon Erfahrung mit und evtl. ein Code-Fragment, das das vielleicht sauber über den Stack löst? Ebenso für das Auslesen der Kommandozeilen-Parameter beim Aufruf des Progrämmchens ("argc" und "argv")? Bei Nutzung der Lib bekam ich immerhin argc und argv[1]; argv[0] war immer leer). Ohne Lib muss man das auch noch selbst machen. Will als Nächstes den Stack beim Aufruf untersuchen und habe mir dafür eine Routine zur Ermittlung des SP bei Aufruf und Ausgabe eines Hexdumps ab dieser Adresse zur Laufzeit geschrieben. Ist dann jetzt aber erst einmal Fleißarbeit... ----------------------- Definitiv sind Frösche und Himbeeren am besten! |
||||
Posts: 266 | Member since: July 2022 | IP address: not saved | |||||
andi Stammgast ID # 213 |
Posted on September 29, 2022 07:09 PM (#31)
Quote
PM E-mail
Kommandozeilen-parameter liest meine gcc Library schon aus und übergibt diese an main (argc, argv).
Für die wichtigsten Jados-Aufrufe hab ich auch schon C-Funktionen (mit Inline-Assembly). Ich würd übrigens nur in Ausnahmefällen Parameter am Stack übergeben (ist zu ineffizient). Besser ist in Registern (gcc hat dazu eine calling convention). Ich stell mal ein kleines Jados_Example das das Disk-Directory ausliest und anzeigt online. LG, Andi |
||||
Posts: 188 | Member since: May 2021 | IP address: not saved | |||||
andi Stammgast ID # 213 |
Posted on September 30, 2022 08:08 PM (#32)
Quote
PM E-mail
Hallo,
ich hab mal ein kleines Beispiel eingecheckt für - Commandline parameter - System-Uhrzeit auslesen und anzeigen - Jados Version auslesen und anzeigen - Directory von Laufwerk 0 anzeigen https://github.com/avg67/nkc/tree/main/SW/Jados_test Das file nkc.h hab ich leider updaten müssen. Dieses gehört in das Verzeichnis C:\SysGCC\m68k-elf\nkc_common\nkc\ Man sieht hier sehr schön dass der Compiler nichts am Stack übergibt sondern direkt mit den Registern arbeitet. Das ist speziell beim 68008 viel effizienter. z.B. folgende C-Zeile: uint8_t result = jd_directory((void*)buf, (void*)"0:*.*", 0, 1, sizeof(buf)); ergibt folgenden ASM-Code: uint8_t jd_directory(void* pbuf, void* ppattern, uint8_t attrib, uint16_t columns, uint16_t size) { Ich finde das ist recht effizienter code. Händisch würde ich es kaum besser hin bringen Aufruf z.B. mit test 1 2 3 4 5 |
||||
Posts: 188 | Member since: May 2021 | IP address: not saved | |||||
tuti Stammgast ID # 225 |
Posted on September 30, 2022 09:59 PM (#33)
Quote
PM E-mail
Oh! Das sieht spannend aus!
Wollte das schnell mal testen, lief aber auf einen Compiler-Fehler. Habe dann ein #define USE_JADOS in die target.h eingefügt. Direkt hinter das #define TARGET_H gleich zu Beginn. Ist das richtig so? Jetzt bekomme ich immerhin schon mal ein test.68k, das auch auf dem NKC läuft und einen Output entsprechend deinem Foto produziert. Vielen Dank für das Beispiel. Muss ich die Tage mal genauer ansehen. Eines fällt mir direkt auf: In deinem argp[0] befindet sich offensichtlich der erste Parameter und nicht der Name des Programmes. Auf deinem Foto die "1". Das war mir letztens bei meinen ersten Versuchen mit deiner Lib schon aufgefallen. Ist das Absicht? Kommst du an den Namen nicht ran? Gruß, Torsten (der jetzt aber erstmal den Tag beendet ) ----------------------- Definitiv sind Frösche und Himbeeren am besten! |
||||
Posts: 266 | Member since: July 2022 | IP address: not saved | |||||
andi Stammgast ID # 213 |
Posted on September 30, 2022 10:33 PM (#34)
Quote
PM E-mail
Hi,
so kannst du es auch machen. dann ist halt Jados global enabled. Ich hab das immer im makefile gesetzt um das für jedes projekt individuell machen zu können. (CFLAGS=-g -Os -m68000 -Wall -fomit-frame-pointer -nostartfiles -std=gnu99 -Dndrcomp $(ISEARCH) -DUSE_JADOS) Warum ich für den ersten Parameter anstelle des Programmnamens den gesamten Parameter-string übergebe weiss ich ehrlich gesagt nicht mehr (ist ca. 20 jahre her dass ich das gemacht habe). Vl. kann man bei Jados den Programmnamen wirklich nicht auslesen. Ich muss mal in die Jados Doku rein schauen. Das ganze passiert jedenfalls in crt0.c ab Zeile 199 (C:\SysGCC\m68k-elf\nkc_common\nkc\). LG, Andi |
||||
Posts: 188 | Member since: May 2021 | IP address: not saved | |||||
andi Stammgast ID # 213 |
Posted on October 02, 2022 11:30 AM (#35)
Quote
PM E-mail
Hallo,
Ich hab nun ein weiteres Update zum Jados-Test eingecheckt. Und zwar fragt er nun nach dem Anzeigen des Directories von Laufwerk A nach einem Filenamen, liest dieses file ein und zeigt es am Bildschirm an (sollte ein ASCII file sein) LG, Andi |
||||
Posts: 188 | Member since: May 2021 | IP address: not saved | |||||
tuti Stammgast ID # 225 |
Posted on October 03, 2022 02:14 PM (#36)
Quote
PM E-mail
Da hast du Recht. Ist doch eleganter im Makefile...
Den Rest des Nachmittags habe ich endlich mal "frei". Jetzt kann ich gucken, testen und spielen. Danke für das betreute Crosscompiler-Lernen... Torsten ----------------------- Definitiv sind Frösche und Himbeeren am besten! |
||||
Posts: 266 | Member since: July 2022 | IP address: not saved | |||||
andi Stammgast ID # 213 |
Posted on October 31, 2022 06:16 PM (#37)
Quote
PM E-mail
Hallo,
hab gerade meinen nächsten großen Meilenstein in Punkto cross-development mit GCC für den NKC erreicht - und zwar das Remote Debuggen. Hab seit längerer Zeit an einem seriellen Debug-Stub gearbeitet den man in ein (GCC) C-Projekt mit dazu compiliert um dann vom PC aus bequem das Programm am GDB zu debuggen (auch grafisch via z.B. DDD). Hab gerade den letzten Bug gefixt und das erste mal erfolgreich debuggt (inkl. Variablen, Memory anschauen und editieren). Ist ein großer Schritt vorwärts von Debug-prints's zum GDB! |
||||
Posts: 188 | Member since: May 2021 | IP address: not saved | |||||
smed Stammgast ID # 114 |
Posted on October 31, 2022 07:55 PM (#38)
Quote
PM E-mail
Super !!!
----------------------- NKC'ler seit 1984 (Pause zw. 1988-2017) CPU68k,CPU68000,4xROA64,6xIOE,6xGDP,GDPHS,8xSBC2/3,HEXIO,6xKEY,UHR3,PROMER,CENT,SER,SOUND,CAS,6xBUS2,4xBUS3,3xPOW5V,2xTAST..und einen ArduinoMEGA mit auf dem BUS, und eine selbstgebastelte MEM960k. NKC - OpenSource since 1983 |
||||
Posts: 198 | Member since: January 2011 | IP address: not saved | |||||
andi Stammgast ID # 213 |
Posted on December 30, 2022 08:06 PM (#39)
Quote
PM E-mail
Hi,
Für den Fall dass es jemanden interessiert - hab jetzt den GCC - C++ Compiler am laufen am NKC. Problem ist derzeit noch die Größe der binaries wenn iostream (cout) verwendet wird. Aber ohne sind die binaries kaum größer als reines c. |
||||
Posts: 188 | Member since: May 2021 | IP address: not saved | |||||
smed Stammgast ID # 114 |
Posted on December 30, 2022 11:30 PM (#40)
Quote
PM E-mail
Hi,
das ist sehr interessant ! Koenntest du die gcc Version zum download bereitstellen? Gruss smed ----------------------- NKC'ler seit 1984 (Pause zw. 1988-2017) CPU68k,CPU68000,4xROA64,6xIOE,6xGDP,GDPHS,8xSBC2/3,HEXIO,6xKEY,UHR3,PROMER,CENT,SER,SOUND,CAS,6xBUS2,4xBUS3,3xPOW5V,2xTAST..und einen ArduinoMEGA mit auf dem BUS, und eine selbstgebastelte MEM960k. NKC - OpenSource since 1983 |
||||
Posts: 198 | Member since: January 2011 | IP address: not saved |
| https://hschuetz.selfhost.eu | Board rules | Privacy policy
Tritanium Bulletin Board 1.8
© 2010–2021 Tritanium Scripts
Site created in 0.042135 seconds
Processed 21 files
gzip compression enabled
3270.21 KiB memory usage