PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : zur abwechslung wieder mal 0x378...



buherator
10.11.04, 19:44
Grüß Euch!

Ich muss eigentlich nicht viel dazu sagen, hier ist mein problem:


root@luna:/home/bitumen/devel_luna# cat ./test.c
#include </usr/src/linux/include/asm/io.h>
main()
{
outb (52, 0x378);
}
root@luna:/home/bitumen/devel_luna# gcc ./test.c
root@luna:/home/bitumen/devel_luna# ./a.out
Segmentation fault
root@luna:/home/bitumen/devel_luna#

Wieso bekomm ich da diesen Fehler?

Thx & tschöö, bitumen

derguteweka
10.11.04, 19:48
Moin,



OUTB(2) Linux Programmer's Manual OUTB(2)

NAME
outb, outw, outl, outsb, outsw, outsl - port output
inb, inw, inl, insb, insw, insl - port input
outb_p, outw_p, outl_p, inb_p, inw_p, inl_p - paused I/O

DESCRIPTION
This family of functions is used to do low level port input and output. They
are primarily designed for internal kernel use, but can be used from user
space.

You compile with -O or -O2 or similar. The functions are defined as inline
macros, and will not be substituted in without optimization enabled, causing
unresolved references at link time.

You use ioperm(2) or alternatively iopl(2) to tell the kernel to allow the
user space application to access the I/O ports in question. Failure to do
this will cause the application to receive a segmentation fault.

CONFORMING TO
outb and friends are hardware specific. The port and value arguments are in
the opposite order to most DOS implementations.

SEE ALSO
ioperm(2), iopl(2)

Linux 1995-11-29 OUTB(2)

Gruss
WK

buherator
10.11.04, 20:06
hoho, danke dir für die schnelle antwort.
Ich werde es gleich mit ioperm ausprobieren...

Cs

derguteweka
10.11.04, 20:13
Moin,

Edit: OK, wollt' dich gerade noch dezent auf ioperm aufmerksam machen, aber hasts ja selber gemerkt :)

Gruss
WK

buherator
10.11.04, 20:49
Moin,

Edit: OK, wollt' dich gerade noch dezent auf ioperm aufmerksam machen, aber hasts ja selber gemerkt :)

Gruss
WK

jaja, in der email-benachrichtigung hab ichs gelesen ;-)
habs aber schon vorher mit ioperm gehabt...

ich bin grad am suchen, welcher pin welches bit als wert hat, weil 8 bits können ja nicht den ganzen pins entsprechen. klar, es lassen sich mehere pins nicht ansteuern, aber 8 sind ja doch zu wenig...
und ich weiß wieder mal nicht welches kabel zu welchem pin führt, muss mich also noch weiter mit lustigen widerstandsmessungen spielen...
also wenn ihr so abbildungen habt, welches bit welchen pin ansteuert, dann her damit ;-)

danke & gruß, Csaba

derguteweka
10.11.04, 20:56
Moin,

google mal nach "hardwarebook"; da stehen diverse nette Steckerbelegungen drinnnen, u.a. auch vom guten alten parallelport.

Gruss
WK

buherator
12.11.04, 20:16
Sodala, mittlerweile funktioniert das ganze so weit, die Hardware ist fertig, die software ist jedoch noch in entwicklung.
Ich habe eine Schleife eingebaut, die einen sleep befehl von 200ms hat. also alle 200ms wird die maske von 0x379 abgefragt. blöd nur, dass die cpu-last immer auf 100% ist. der server ist ein p2 mit 400mhz, die restlichen anwendungen brauchen aber nur 4%.. es muss doch eine elegante lösung geben, ohne die cpu-last unnötig raufzutreiben.

Falls jemand Ideen in dieser Richtung hat, her damit ;-)

Thx & tschöö, Cs

derguteweka
13.11.04, 09:27
Moin,

Haengt wohl davon ab, wie der sleep implementiert ist, d.h. ob die Schlafzeit als Rechenzeit anderen Prozessen zur Verfuegung gestellt wird, oder ob einfach stupide solange NOPs o.ae. ausgefuehrt werden, bis die Zeit um ist. Dieses Beispiel hier verursacht bei mir keinerlei sichtbare (xload) CPU Last. Die Zeitaufloesung von nanosleep ist allerdings schlechter als 10 msec; was aber fuer 200 msec dicke ausreicht. Wenn dein System durch andere Prozesse gut ausgelastet wird, kanns aber auch laenger dauern als 200 msec.

#include <time.h>

main()
{

struct timespec to;

to.tv_sec=0;
to.tv_nsec=200L*1000*1000;


while (1)
{
nanosleep(&to,NULL);
/* 2do: guck nach port */
}
}

Gruss
WK