Autor Thema: outb  (Gelesen 7590 mal)

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« am: 22. January 2013, 19:52 »
Hier (http://www.lowlevel.eu/wiki/Textausgabe) ist beim Cursor-Verschieben-Beispiel eine Funktion "outb" angegeben, die ich 1. nicht verstehe und die 2. nicht vorhanden ist...

Woher bekomme ich die? :)

mfg! :-P

Martin Erhardt

  • Beiträge: 165
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 22. January 2013, 19:55 »
So schaut das bei mir aus damit kannst du die IOPorts von deinem Prozessor ansteuern. Das inline ASM werde ich aber wahrscheinlich in der HAL "makrotisieren"

Cursor verschieben geht bei mir aber auch so nicht  :-(.
#include<stdint.h>
#include<drv/io/ioport.h>

/* writes a byte into an I/O-Port */
void outb(uint16_t port, uint8_t data)
{
    asm volatile ("outb %0, %1" : : "a" (data), "Nd" (port));
}
/* reads a Byte from an I/O-Port */
uint8_t inb(uint16_t port){
uint8_t result;
asm ("inb %1, %0" : "=a" (result) : "Nd" (port));
return result;
}

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 22. January 2013, 19:58 »
Okay erstmal eine andere Frage: Du kanns stdint benutzen? Gut! Das würde einige meiner Probleme lösen! Allerdings kommt bei mir "no include path in which to search for stdint.h"  :?

Martin Erhardt

  • Beiträge: 165
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 22. January 2013, 20:01 »
Du kannst das auch vom beispielkernel_repo src code "inspirieren lassen"(http://git.tyndur.org/?p=tutorial.git;a=summary)
stdint.h:
#ifndef STDINT_H
#define STDINT_H

typedef unsigned long long uint64_t;
typedef unsigned int uint32_t;
typedef unsigned short uint16_t;
typedef unsigned char uint8_t;

typedef signed long long int64_t;
typedef signed int int32_t;
typedef signed short int16_t;
typedef signed char int8_t;

// size
typedef unsigned int size_t;

// Signed pointer-sized integer
typedef long intptr_t;
// Unsigned pointer-sized integer
typedef unsigned long uintptr_t;

#endif

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 22. January 2013, 20:27 »
Achso nagut, dann erstelle ich mir einfach eine stdint.h und schreibe das da rein^^ :D

Mit outb beschäftige ich mich dann später, jetzt auf jeden Fall erstmal danke, hat mir echt geholfen! :) :)

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 22. January 2013, 20:47 »
Die outb-Funktion kannst du als "inline" markieren, dann sparst du dir Call/Return und die Parameterübergabe. Das mit der stdint.h ist der Unterschied zwischen "-ffreestanding" und "-noinclude"; im ersten Fall darfst du die betriebssystem-unabhängigen, vom Compiler bereitgestellten Header benutzen.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 22. January 2013, 21:16 »
inline funktioniert übrigens nur, wenn du die Funktion in den Header verschiebst (und dann muss gleich static inline draus werden).
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Martin Erhardt

  • Beiträge: 165
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 23. January 2013, 18:36 »
Inline Deklaration ist das nicht auch iwie performanter in der Ausführung aber erzeugt mehr Opcode ähnlich wie bei Makros??

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 23. January 2013, 19:07 »
Ja. Nur, dass im Fall von in/out wohl eher weniger Opcodes erzeugt werden. :wink:

push ARG1
push ARG2
call outb
add esp, 8
vs.
mov al, ARG1
outb ARG2, al
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

Martin Erhardt

  • Beiträge: 165
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 23. January 2013, 22:02 »
Achso Ich habe aber auch gesehen dass memset im BeispielKernel als inline deklariert wurde bei so einer größeren funktion die auch aus mehreren hundert src files aufgerufen wird ist das vllt nicht so sinnvoll.
« Letzte Änderung: 23. January 2013, 22:04 von Martin Erhardt »

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 24. January 2013, 00:38 »
Hallo,

also "static inline" hat bei mir auch in C-Dateien funktioniert. Ich schreibe grundsätzlich keinen Code in Header - oder gibt es Gründe dafür?

Inline-Funktionen sind dann nützlich, wenn der Overhead von CALL/RET gegenüber der eigentlichen Ausführung wichtig wird und sonst nichts dagegen spricht. Der Compiler darf übrigens selbst entscheiden, ob er eine als "static" markierte Funktion nun inlined oder nicht - egal ob das inline nun da steht oder nicht.

Gruß,
Svenska

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 24. January 2013, 00:57 »
also "static inline" hat bei mir auch in C-Dateien funktioniert.
Aber das ist dann keine C-Datei, die per #include in eine andere C-Datei eingebunden wird, oder?

Ich schreibe grundsätzlich keinen Code in Header - oder gibt es Gründe dafür?
Ein gutes Beispiel für einen Grund Inline-Funktionen in Header zu tun, sind inb/outb-Funktionen: Mehrere Übersetzungseinheiten (z.B. Timerfunktionen, Tastaturtreiber, PIC, CMOS, ...) können diese Funktionen verwenden und um Code-Duplikation zu vermeiden wird die Funktion in dem gemeinsam genutzten Header definiert.
Dieser Text wird unter jedem Beitrag angezeigt.

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 24. January 2013, 09:00 »
also "static inline" hat bei mir auch in C-Dateien funktioniert.
Aber das ist dann keine C-Datei, die per #include in eine andere C-Datei eingebunden wird, oder?
Ist es nicht. Gibt es sonst noch gute Gründe, Code in Headern zu haben (also abgesehen von "static inline")?

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #13 am: 24. January 2013, 09:11 »
nicht in Form von Funktionen. Weil die würdest du dann ja mehrfach haben, und Probleme beim Linken bekommen.

wenn du aber so Makros wie FOR_EACH_foobar(LIST) haben willst, dann könnten die auch in Headern Sinn machen.
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #14 am: 24. January 2013, 09:19 »
Ist es nicht. Gibt es sonst noch gute Gründe, Code in Headern zu haben (also abgesehen von "static inline")?
Mir fallen auch keine anderen Sachen mehr ein, außer die von MNemo genannten.
Dieser Text wird unter jedem Beitrag angezeigt.

 

Einloggen