Hallo Ihr lieben C-Profis, ich hab mir mal die mide mit dem sdcc installiert. Nach Anleitung mal ein "Hallo Welt" programmiert. C ist für mich neu. Ich habe versucht dem Assembler-code der Ausgaberoutinen zu finden, aber da ist nichts. Ich denke schon ,daß diese Routinen dazugelinkt werden(wenn ich mir die Größe des HEX FIles so ansehe). Kann man mit Optionsschaltern ein File erzeugen,das den kompletten Assembler-Code enthält? oder müßte ich dazu die LIBS disassemblieren? Ich gehe mal davon aus, daß printf.. auf die serielle geleitet wird. kann man das umprogrammieren,so daß es auf ein LCD geleitet wird? es grüßt euch Andreas
Gleich mehrere Fragen...
> Ich gehe mal davon aus, daß printf.. auf die serielle geleitet wird..
Jein, printf wird auf die Funktion putchar geleitet und die kannst du
selber schreiben oder aus dem SDCC LIB's verwenden.
Nun kannst du ja für das Display die Funktion folgendermaßen bauen:
1 | void putchar (char c) { // putchar ist die standard Funktion an die |
2 | display_data_out (c); // printf die Zeichen übergibt |
3 | }
|
Natürlich mußt du eine entsprechende Funktion für die Zeichenausgabe ans
Display selber schreiben.
> Ich habe versucht dem Assembler-code der Ausgaberoutinen zu finden..
Was meinst du, den ASM Code des compilierten C Sourcecode ? den erzeugt
der Compiler mit der Endung .asm
Glaub ich habs verstanden, wenn du nach Defaultvorgaben installierst dann: C:\MIDE\sdcc\lib\large C:\MIDE\sdcc\lib\medium C:\MIDE\sdcc\lib\small Es gibt verschiedene printf Varianten. Z.B. printf_small, printf_tiny etc...
Hallo Joe, danke erst mal für die Antwort. konnte leider die funktion _putchar noch nicht finden. den aufruf aus printf_putchar heraus hab ich gefunden. wo steckt die denn so? Im Ausgabe listing des Assemblers steht nur der ensprechende Assembler code des übersetzten c programms. Bei anderen compilern kann ich halt den gesamten assembler code sehen. da kann ich auch die internen funktionen sehen. hier muß ich stöbern und stöbern.... kann ich auch fertige assembler funktionen einbinden? (zur not mit copy und paste in den inline assembler) netter gruß Andreas
Wie gesagt, die kannst du selber schreiben. UART initialisieren und dann die Ausgabe an die UART über putchar. Ein Beispiel habe ich dir ja gegeben. Da sollte dann:
1 | void putchar (char c) { |
2 | while (!TI); // Transmitter ready/busy ? |
3 | TI = 0; // TI Flag löschen |
4 | SBUF = c; // Ausgabe an UART |
5 | }
|
diese Routine stehen. Natürlich UART initialisieren z.B.:
1 | SCON = 0x52; // 8 BIT UART, TI=1, REN=1 |
2 | TMOD |= 0x20; // Timer 1, mode 2, 8-bit reload |
3 | TH1 = 0xFD; // 19200 Baud @ 22,118 MHz |
4 | PCON |= 0x80; // Double BR BIT => 38400 Baud |
5 | TR1 = 1; // Timer 1 Runbit = 1, 38400 Baud @ 22,118 MHz |
Im Verzeichnis Mide\sdcc\include findest du die serial_IO.h, kannst du natürlich auch verwenden. Ansonsten empfehle ich dir die Doku zu lesen. Da ist auch das Einbinden von ASM erklärt. Aus meiner Sicht brauchst du aber keinen ASM Code in C ;-))
Hey joe, ich glaub wir reden da aneinander vorbei. Ich war der Meinung,daß printf sicherlich an die seri rausgibt. Was ich aber nicht haben will ! Wenn es so ist,so wollte ich die standard-lib ändern,so daß printf gleich auf das lcd geht. Dies war aber nur EIN Beispiel. Ich habe einen Sack voll Routinen programmiert und würde gerne diese verwenden. Das Hauptprogramm wollte ich halt von Assembler nach C umschreiben,um es leichter ändern zu können. Dieses Anliegen habe ich schon mal gepostet,wurde aber nicht erhört :-| Also: meine Hauptfragen sind: Kann ich die standart lib in asem ändern,oder wird das fertig übersetzt binär dazugelinkt? falls das nicht geht, wie könnte ich Werte von asm nach c und zurück übergeben? Die Doku hab ich schon rauf und runter gelesen,wahrscheinlich bin ich schon zu Begriffsstutzig :-( nette Grüße Andi
Willst du das Rad neu erfinden ? dann lese das Kapitel building SDCC, werde Entwickler bei Sourceforge und fang an ;-)) Ne, mal ehrlich, du hast nen Sack voll ASM Routinen und willst nur "main" in C schreiben... Na dann sei so konsequent und brings in ASM zu Ende. Ansonsten siehe S.13 SDCC man. sowie Kapitel 3.1.3 (S.20). Dann schau dir mal _asm; _endasm; an. Ebenso les mal wie Parameter übergeben werden (du bist nen Scherzkeks, glaubst du das schreibe ich alles für dich ?). Insgesamt halte ich von dieser Vorgehensweise nichts. Machs in ASM oder C, aber nicht so einen Murx.
Ach so, noch eins, printf erwartet die Funktion putchar, was du daraus machst ist printf egal. Ob du auf der UART, einem Portpin, Display oder aufm Lautsprecher ausgibst ist der Funktion egal. Ich glaube ich habe das nicht gut genug erklärt.
Hallo Joe, nun, ich weiß nicht wieviel das ist. Dein Hinweis auf die entsprechenden Kapitel reichen natürlich vollig. Ich denke ich werde es in Assembler zu ende bringen. Einmal,weil ich in C nur etwas Theorie gelesen hab und keinerlei Erfahrung und zum Anderen weil das Projekt eh fast fertig ist. Sollte mal zuviel Zeit vorhanden sein, kann ich das ganze mal komplett in C schreiben. zu deinem letzten posting: Du hast es sicher genug erklärt. Dies geht auserdem aus _printf hervor. Ich hab mich da nicht richtig ausgedrückt. Danke für die Infos und den Rat (wegen Murx) nette Grüße Andreas
Andreas, ich hoffe du bist wegen des Hinweis "Murx" nicht eingeschnappt, nimm sowas nicht persönlich. Es gab hierzu schon diverse Grundsatzdiskussionen, frei nach dem Motto für zeitkritische Funktionen sollte man ASM verwenden etc. und diese in C einbinden. Ich programmiere seit 15 Jahren ASM und seid weniger Jahren ;-)) C. Meine Erfahrung ist, du kannst alles in lupenreines C umsetzen. Wenn es dann tatsächlich mal dazu kommt das man irgendetwas unbedingt in ASM einbinden muß, ok dann ist es eben so und man kann das auch problemlos machen. Nur die "main" und der Rest in ASM (hierauf bezog sich Murx) ist aus meiner Sicht nicht sinnvoll. Nichts für ungut...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.