Lowlevel

Lowlevel => Softwareentwicklung => Thema gestartet von: spaceemotion am 02. December 2009, 12:45

Titel: [solved] Teil 4: console.c/console.h - woher?
Beitrag von: spaceemotion am 02. December 2009, 12:45
Ich habe auch eine Frage zu dem Tutorial: http://lowlevel.brainsware.org/wiki/index.php/Teil_4_-_Hello_World#printf. In diesem Teil wird von einer console.h gesprochen.
Der Code darüber
typedef __builtin_va_list       va_list;
#define va_start(ap, X)         __builtin_va_start(ap, X)
#define va_arg(ap, type)        __builtin_va_arg(ap, type)
#define va_end(ap)              __builtin_va_end(ap)
funktioniert als console.h bei mir nicht.
Da habe Ich mir gedacht, dass der GCC Compiler die Datei aus dem System nimmt. Also habe ich auf meinem Linux System danach gesucht, aber mehr als eine console.h gefunden und alle durchprobiert. In einigen ist ein direkter Fehler in der .h-Datei und passiert der Fehler bei kprintf("Hello World!\n");
GCC gibt mir als Fehler: init.c:5: error: implicit declaration of function ‘kprintf’ Kann mit jemand helfen, warum bei mir die console.h nicht funktioniert?
Titel: Re: Teil 4: console.c/console.h - woher?
Beitrag von: Jidder am 02. December 2009, 13:32
Hi und willkommen an Board,

wie hast du es denn geschafft in das Forum im Archiv zu kommen? Eigentlich sind diese Foren nicht öffentlich zugänglich. Ich hab dein Thema mal verschoben.

Zur Frage: console.c und console.h musst du selbst erstellen. Im Tutorial wird davon ausgegangen, dass du zumindest eine einfache Ausgabefunktion, die dort kprintf genannt wird, selbst schreiben kannst.

In console.h, müsstest du die Funktionsdeklaration (Prototyp) schreiben, und in console.c die Funktionsdefinition (Implementierung). Der Prototyp könnte in etwa so aussehen, wenn du erstmal mit einer einfachen Funktion anfangen willst:
void kprintf(const char *string);
Titel: Re: Teil 4: console.c/console.h - woher?
Beitrag von: spaceemotion am 03. December 2009, 11:34
Hallo,
und danke für die schnelle Antwort.
Ich habe
void kprintf(const char *string);
ausprobiert und bekomme von GCC nun undefined reference to `kprintf' als Fehler. Diesen Fehler hatten zwar andere http://www.keil.com/support/docs/2729.htm auch schon mal. Aber bei denen war der Fehler wo anders. Wie kann man diesen Fehler den los werden?
Ich glaube, dass der Fehler daran liegt, dass nicht definiert wurde, wohin und wie er etwas ausgeben soll. Wie kann man dem Kernel das sagen?


mfG. Spaceemotion
Titel: Re: Teil 4: console.c/console.h - woher?
Beitrag von: Cool-Andy am 03. December 2009, 12:00
Hast du die Funktion richtig implentiert?
Vielleicht könntest du mal deinen Code für "kprintf" posten.
Titel: Re: Teil 4: console.c/console.h - woher?
Beitrag von: kevin am 03. December 2009, 12:02
Ich habe die Vermutung, dass er noch gar kein kprintf geschrieben hat. Das wäre dann erstmal der nächste Schritt.

undefined reference heißt, dass eine Funktion oder Variable benutzt werden soll, die es gar nicht gibt (oder die zumindest nicht in den Dateien enthalten ist, die gelinkt werden).
Titel: Re: Teil 4: console.c/console.h - woher?
Beitrag von: spaceemotion am 03. December 2009, 12:12
Hier mein Code für kprintf:
init.c
#include "console.h"
 
void init(void)
{
    kprintf("Hello World!\n");
}

console.h
void kprintf(const char *string);
Titel: Re: Teil 4: console.c/console.h - woher?
Beitrag von: Cool-Andy am 03. December 2009, 12:37
taljeth hat Recht!

Du musst die Funktion "kprintf" erst noch schreiben. So was ist wenn man sein eigenes OS schreibt nicht automatisch da!

Schau dir das hier mal an: http://lowlevel.brainsware.org/wiki/index.php/Ausgabe_5#Die_Programmiersprache_C
Da steht auch ein Code für Bildschirmausgaben!
Titel: Re: Teil 4: console.c/console.h - woher?
Beitrag von: spaceemotion am 03. December 2009, 12:54
Wir haben so etwas in der Art aus dem Tutorial:
void init(void)
{
    const char hw[] = "Hello World!";
    int i;
    char* video = (char*) 0xb8000;
 
    for (i = 0; i < sizeof(hw); i++) {
        // Zeichen i in den Videospeicher kopieren
        video[i * 2] = hw[i];
 
        // 0x07 = Hellgrau auf Schwarz
        video[i * 2 + 1] = 0x07;
    }
}
Diese Reihe ist gibt einen Text aus. Nur habe ich versucht das so umzuschreiben, dass er ein ENTER mit ausgibt.
const char hw[] = "Hello World!\nI'm a computer";Das Enter stellt er nur falsch da. Aus dem ENTER wird ein kleiner runder Kreis. Ich kann euch das Bild später einmal hochladen, weil ich in diesem Netzwerk kein FTP habe.
In dem Tutorial stand auch, dass man den Bildschirm aufräumen könnte. Ich wüsste auch gerne wie das geht.
Titel: Re: Teil 4: console.c/console.h - woher?
Beitrag von: Cool-Andy am 03. December 2009, 13:13
Wenn du ein OS schreibst musst du (fast) alles selber machen! Auch Zeilenumbrüche!
Zum Bildschirm löschen: Ja, das geht.

ABER: Es gibt da ein sehr gutes Tutorial: http://lowlevel.brainsware.org/wiki/index.php/Ausgabe_1.
Ich glaube es wäre besser, das erstmal durchzulesen (am Besten alle Ausgaben!).  :-D
Titel: Re: Teil 4: console.c/console.h - woher?
Beitrag von: kevin am 03. December 2009, 15:30
Finger weg vom Magazin, da sind teilweise sehr fragwürdige Ansätze drin.

spaceemotion, bist du dir sicher, dass du den Code zur Textausgabe verstanden nicht nur einfach kopiert hast? Du schreibst das Zeichen 10 ('\n') in den Buchstaben nach dem "Hello World". Wenn du was in einer neuen Zeile haben willst, musst du stattdessen dafür sorgen, dass der nächste Text an einer anderen Stelle im Videospeicher ausgegeben wird.
Titel: Re: Teil 4: console.c/console.h - woher?
Beitrag von: Cool-Andy am 03. December 2009, 15:40
Zitat
Finger weg vom Magazin, da sind teilweise sehr fragwürdige Ansätze drin.

Warum schreibt ihr dann nicht so eine schöne rote Zeile, wie so oft drüber?  :x
Wenn ich jetzt das erste Mal auf die Wiki stoßen würde, und das Magazin finden würde, würde ich es sofort einstudieren!
Titel: Re: Teil 4: console.c/console.h - woher?
Beitrag von: kevin am 03. December 2009, 19:58
Ist das Magazin nicht sowieso schon mit gelben und roten Hinweisen gepflastert?

Okay, "Finger weg" war vielleicht etwas übertrieben, aber es sollte nicht die erste Quelle für einen Einsteiger sein. Es erläutert Dinge ziemlich zusammenhangslos und macht so ziemlich alles in Assembler. Im Ergebnis führt das nur dazu, dass Code kopiert wird ohne dass er wirklich verstanden ist - und am Ende stranden diejenigen dann wieder hier, damit wir es fixen.

Als Tutorialreihe zum Mitmachen ist OS-Dev für Einsteiger zu bevorzugen.
Titel: Re: Teil 4: console.c/console.h - woher?
Beitrag von: Cool-Andy am 03. December 2009, 20:01
Ich würde einen roten Hinweis mit "Nicht für Anfänger geeignet" oder so ganz oben hinsetzen.
Andere Frage: Wird das Magazin eigentlich noch weiter geschrieben?
Titel: Re: Teil 4: console.c/console.h - woher?
Beitrag von: spaceemotion am 04. December 2009, 17:31
spaceemotion, bist du dir sicher, dass du den Code zur Textausgabe verstanden nicht nur einfach kopiert hast?
Ja habe ich, 
Du schreibst das Zeichen 10 ('\n') in den Buchstaben nach dem "Hello World". Wenn du was in einer neuen Zeile haben willst, musst du stattdessen dafür sorgen, dass der nächste Text an einer anderen Stelle im Videospeicher ausgegeben wird.
An welche denn? 0xb8000 ist die Startadresse, aber wo ist die nächste Zeile?
Zum Bildschirm löschen: Ja, das geht.
Und wie?
Titel: Re: Teil 4: console.c/console.h - woher?
Beitrag von: Tobiking am 04. December 2009, 17:49
Eine Zeile ist 80 Zeichen lang, also fängt die zweite Zeile bei Speicheradresse + 80 Zeichen an. Bei den folgenden Zeilen ist das genauso, der Grafikkartenspeicher geht direkt von anfang bis Ende durch.

Bildschirm löschen ist einfach den ganzen Bildschirm mit Leerzeichen "vollschreiben".
Titel: Re: Teil 4: console.c/console.h - woher?
Beitrag von: spaceemotion am 05. December 2009, 11:27
Und wie mache ich dann daraus einen einzigen Befehl?
Titel: Re: Teil 4: console.c/console.h - woher?
Beitrag von: DerHartmut am 05. December 2009, 12:37
Also das Denken sei da schon dir überlassen ;-)
Titel: Re: Teil 4: console.c/console.h - woher?
Beitrag von: Cool-Andy am 05. December 2009, 12:56
In dem du eine Funktion schreibst!  :-o
Titel: Re: Teil 4: console.c/console.h - woher?
Beitrag von: spaceemotion am 05. December 2009, 16:41
Ich habe jetzt eine .h geschrieben:
init.c
#include "console.h"


void init(void)
{

clearscreen();
kprintf("Hello World,\nI'm LionOS");

}
console.h
#ifndef INCLUDE_console_H

#define INCLUDE_console_H


void kprintf(const char hw)
{

char* video = (char*) 0xb8000;

int i;

int timesofnewline = 0;

// C-Strings haben ein Nullbyte als Abschluss

for (i = 0; i<sizeof(hw); i++) {

if (hw[i] == '\n')

{

timesofnewline++;

}

else

{

// Zeichen i in den Videospeicher kopieren

video[i * 2 + timesofnewline * 80] = hw[i];

 
        // 0x07 = Hellgrau auf Schwarz

        video[i * 2 + 1 + timesofnewline*80] = 0x07;
}

    }

}



void clearscreen()
{

char* video = (char*) 0xb8000;

const char empty[] = "   ";

    int i;

//char* video = (char*) 0xb8000;

 
// C-Strings haben ein Nullbyte als Abschluss

for (i = 0; i==800; i++) {


        // Zeichen i in den Videospeicher kopieren

        video[i * 2] = empty[1];

 
        // 0x07 = Hellgrau auf Schwarz

        video[i * 2 + 1] = 0x07;

    }


}
#endif

Und LD meckert, dass in der (von GCC generierten) init.o ein Fehler sei.
Titel: Re: Teil 4: console.c/console.h - woher?
Beitrag von: Cool-Andy am 05. December 2009, 16:54
Hm,
ich würde ne extra Datei (z.B. "console.c") anlegen, dort die ganzen Funktionen reinschreiben und in console.h dann nur:
#ifndef _console_H_
#define _console_H_

void kprintf(const char hw);
void clearscreen();

#endif
In console.c muss dann noch #include "console.h" rein und (hoffentlich) fertig.
Probier es mal aus, ich hoffe ich konnte dir helfen.  :-D
Titel: Re: Teil 4: console.c/console.h - woher?
Beitrag von: DerHartmut am 05. December 2009, 18:50
for (i = 0; i==800; i++)
Sollte das nicht vielleicht eine 80 sein?
Titel: Re: Teil 4: console.c/console.h - woher?
Beitrag von: spaceemotion am 05. December 2009, 19:01
for (i = 0; i==800; i++)
Sollte das nicht vielleicht eine 80 sein?
Nein eigentlich nicht: Ich will damit die ersten 10 Zeilen (a 80 Zeichen) mit " " vollschreiben. Und den Bildschirm so löschen.
Hm,
ich würde ne extra Datei (z.B. "console.c") anlegen, dort die ganzen Funktionen reinschreiben und in console.h dann nur:
#ifndef _console_H_
#define _console_H_

void kprintf(const char hw);
void clearscreen();

#endif
In console.c muss dann noch #include "console.h" rein und (hoffentlich) fertig.
Probier es mal aus, ich hoffe ich konnte dir helfen.  :-D
Ne, also bei mir klappt das nicht: In file included from init.c:1:
console.c: In Funktion »kprintf«:
console.c:9: Fehler: indizierter Wert ist weder ein Feld noch ein Zeiger
console.c:16: Fehler: indizierter Wert ist weder ein Feld noch ein Zeiger
cc1: warnings being treated as errors
init.c: In Funktion »init«:
init.c:6: Fehler: Übergabe des Arguments 1 von »kprintf«  erzeugt Ganzzahl von Zeiger ohne Typkonvertierung
Alle Dateien unter: sesdll1.se.funpic.de/lionos (http://sesdll1.se.funpic.de/lionos)
Titel: Re: Teil 4: console.c/console.h - woher?
Beitrag von: Tobiking am 05. December 2009, 19:03
for (i = 0; i==800; i++)
Sollte das nicht vielleicht eine 80 sein?

Bei clearscreen würde ich eher auf 2000 (80*25) tippen. Dem Code im Schleifenrumpf nach würde ich sogar 4000 sagen und statt i++ dann i+=2.
Titel: Re: Teil 4: console.c/console.h - woher?
Beitrag von: Tobiking am 05. December 2009, 19:11
Ne, also bei mir klappt das nicht: In file included from init.c:1:
console.c: In Funktion »kprintf«:
console.c:9: Fehler: indizierter Wert ist weder ein Feld noch ein Zeiger
console.c:16: Fehler: indizierter Wert ist weder ein Feld noch ein Zeiger
cc1: warnings being treated as errors
init.c: In Funktion »init«:
init.c:6: Fehler: Übergabe des Arguments 1 von »kprintf«  erzeugt Ganzzahl von Zeiger ohne Typkonvertierung
Die Fehler sagen eigentlich genau was das Problem ist. Dein kprintf hat ein ein "const char" als Parameter, was einem einzelnen Zeichen entspricht. Da kannst du nicht wie auf ein Array zugreifen mit hw[i]
Titel: Re: Teil 4: console.c/console.h - woher?
Beitrag von: kevin am 05. December 2009, 19:37
Vor allem sollte es ein < statt einem == sein.

spaceemotion, du wirst es vielleicht nicht gern hören und ich sage das auch nicht gern, aber ein gut gemeinter Ratschlag: Lern erstmal C in normalen Anwendungen und versuch das mit dem OS später nochmal. Oder wenn es eine andere Programmiersprache gibt, die du wirklich kannst, kannst du auch versuchen, auf die umzusteigen. Aber so wie im Moment steckst du viel Zeit rein und bist frustriert, weil nichts klappt; wir stecken viel Zeit rein und sind frustriert, weil dir die absoluten Grundlagen fehlen und du unsere Erklärungen nicht verstehst - und am Ende kommt doch nichts raus.