[C] EFLAGS Register Pentium uitlezen...

Pagina: 1
Acties:

  • Rowwan
  • Registratie: November 2000
  • Laatst online: 23:00
Ik wil graag weten of er op een bepaald moment een interupt uitstaat (Vxworks voor Pentium). Hiervoor wil ik het IF bit van het EFLAGS register uitlezen...

Hoe lees ik in C een register uit en hoe stop ik het in een variabele. Ik heb al op vanalles gezocht maar kan niets concreets vinden...

Ik weet dat ik hiervoor een assembly statement met pushfl of pushfd moet gebruiken.....

Verwijderd

nou als je de <locatie> weet kan je toch met het volgende lezen en schrijven

short * flag , waarde;

flag = <locatie>;
waarde = *flag;
*flag = ++waarde;.

dit werk wel niet voor windows progs, met windows moet je het gewoon doen met de windows API

  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

Marik2000: registers staan niet in het normale geheugen, ze staan in een heel klein stukje geheugen in je processor dat direct beschikbaar is onder de namen van de registers. EFLAGS staat daar ook alleen is die niet helemaal direct te bereiken, wel via een push zoals hieronder. Het stukje asm dat je wilt is (in VC dan):
C:
1
2
3
4
5
6
int flags;
_asm
{
    pushfd
    pop flags
}

[ Voor 16% gewijzigd door madwizard op 27-08-2003 13:11 ]

www.madwizard.org


  • Rowwan
  • Registratie: November 2000
  • Laatst online: 23:00
Madwizard,
je hebt idd gelijk... Ik geloof allen dat EFLAGS niet het juiste register is :(.. Weet er misschien iemand welk register ik moet uitlezen om te kijken of er ergens een interrupt uitstaat (of de PCI bus.)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

definieer "of er ergens een interrupt uit staat". De interrupt flag staat wel degelijk in het flags register, maar ik betwijfel of je er wel wat aan hebt, aangezien die toch wel altijd aan staat in een normale applicatie

IF is trouwens bit 9 van het flags register

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Rowwan
  • Registratie: November 2000
  • Laatst online: 23:00
Wat ik probeer te bereiken is het volgende:

Ik heb een rek met 12 UARTS (3 borden met 4 UARTS). 1 van deze UARTS ontvangt constant data. Voor elke byte wordt hardwaremating een interrupt gegeneerd.

De standaard VxWorks driver start bij elke interrupt een ISR. Deze ISR loopt over alle UARTS om te kijken of deze de interrupt heeft gegeneerd. Als dat zo is, wordt er een karakter uitgelezen en wordt de interrupt laag gezet. De for-loop in de driver gaat echter gewoon door met loop-en over de andere UARTS, terwijl je weet dat er geen data meer is. (Anders was de interrupt op de SBC nog hoog geweest, want het is een level-based interrupt).

Ik wil dus stoppen met loop-en als de interrupt op de SBC (pentium) laag is omdat ik dan zeker weet dat er geen data meer is ...

Klinkt allemaal erg ingewikkeld als ik het zo nog eens nalees. Hoop dat het een beetje duidelijk is zo.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

Aha
dan moet je idd niet het flags register hebben, die geeft alleen maar aan of het afhandelen van IRQs aan staat of niet

Volgens mij kun je datgene wat jij wilt uitlezen uit een van de poortjes. Welke weet ik niet precies, maar wellicht heeft het iets te maken met poort 0x20 of poort 0x61. Ik weet nog wel dat ik in een ver verleden een eigen keyboard handler had gemaakt, en dan moest ik het volgende stukje code uitvoeren zodat de hardware wist dat de interrupt afgehandeld was en er dus een volgende gegenereerd kan worden:

C++:
1
2
3
4
    x = inportb (0x61);
    outportb (0x61, x | 0x80);
    outportb (0x61, x);
    outportb (0x20, 0x20);


Geen idee wat het nou precies deed, da's veel te lang geleden, maar misschien kun je er wat mee

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Rowwan
  • Registratie: November 2000
  • Laatst online: 23:00
Mmmm... is zal het eens nakijken.. Thanx... :)

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 21-08 18:33
Is dat wel zo handig ? Als het ding een interrupt genereert voor 12 poorten, moet je bij een interrupt toch altijd alle poorten checken.
Je hebt ook kans dat de interrupt wordt uitgeschakeld op het moment dat de ISR aktief wordt, als je dan niet alle poorten checked ga je karakters missen.
Bovendien, als er twee karakters tegelijk binnenkomen op verschillende poorten, wat gebeurd er dan ?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Rowwan
  • Registratie: November 2000
  • Laatst online: 23:00
De interrupts zijn level based. Je mist dus geen karakters. Zolang er nog ergens een karakter op de bus staat, blijft de interrupt hoog...
Pagina: 1