Forum: Mikrocontroller und Digitale Elektronik Wie/wo finde ich den Ass-code der stdio bei SDCCMIDE?


von Andreas K. (oldcoolman)


Lesenswert?

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






von Joe (Gast)


Lesenswert?

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

von Joe (Gast)


Lesenswert?

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...

von Andreas K. (oldcoolman)


Lesenswert?

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

von Joe (Gast)


Lesenswert?

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
;-))

von Andreas K. (oldcoolman)


Lesenswert?

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




von Joe (Gast)


Lesenswert?

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.

von Joe (Gast)


Lesenswert?

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.

von Andreas K. (oldcoolman)


Lesenswert?

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



von Joe (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.