Forum: PC-Programmierung Interrupts bei INTEL Hardware ?


von Michael L. (nightflyer88)


Lesenswert?

Hallo Zusammen

Ich bin dabei ein PWM an der LPT Schnittstelle zu programmieren. Als 
Betriebssystem ist FreeDOS im Einsatz. Nun wird aber das PWM durch 
irgend etwas gestört, etwa einmal pro Sekunde... Die Vermutung liegt 
deshalb nahe, dass dabei ein Interrupt dazwischen greift.

Folgende Interrupts habe ich bereits ausgeschaltet, jedoch ohne erfolg:

OUT (&H21), &b11111111                    'Interrupts deaktivieren
  'bit 7 = 0  enable parallel printer interrupt
  'bit 6 = 0  enable diskette interrupt
  'bit 5 = 0  enable fixed disk interrupt
  'bit 4 = 0  enable serial port 1 interrupt
  'bit 3 = 0  enable serial port 2 interrupt
  'bit 2 = 0  enable video interrupt
  'bit 1 = 0  enable keyboard, mouse, RTC interrupt
  'bit 0 = 0  enable timer interrupt

Gibt es noch andere Interrupts die das Problem verursachen könnten ? 
Kenne mich damit zuwenig aus...

von Peter II (Gast)


Lesenswert?

das wird doch nichts. Steck ein 50cent µC an den LPT Port und schon 
kannst du ein paar PWMs ausgeben ohne das jemand dich stört. Ein PC ist 
von der Technik überhaupt nicht dazu geeignet.

Es gibt bei neueren PCs (du schreibst ja nicht mal was es für eine CPU 
ist) sogar Prozesse die von Bios gesteuert werden. Irgendwas mit 
Powermanagemt/ACPI diese können sogar den BS Rechenzeit wegnehmen.

von (prx) A. K. (prx)


Lesenswert?

Peter II schrieb:
> Es gibt bei neueren PCs (du schreibst ja nicht mal was es für eine CPU
> ist) sogar Prozesse die von Bios gesteuert werden.

Der "System Management Mode". Einer der vielen Gründe, weshalb exakte 
Laufzeiten auf PCs verdammt schwer vorhersagbar sind.

https://en.wikipedia.org/wiki/System_Management_Mode:

"Operations in SMM take CPU time away from the OS, since the CPU state 
must be stored to memory (SMRAM) and any write-back caches must be 
flushed. This can destroy real-time behavior and cause clock ticks to 
get lost."

"The SMM may disrupt the behavior of real-time applications with 
constrained timing requirements."

Und insbesondere: "By design, the operating system cannot override or 
disable the SMI." Was auch besser so ist, denn da kann Steuerung dabei 
sein, deren Versagen die Hardware schrotten kann.

Wenn man partout mit PCs auf dieser Zeitebene Hardware kontrollieren 
will, dann sollte man das Gerät aus dem Museum klauen. So circa bis 386 
sollte man auf der sicheren Seite sein.

PCs sind für sowas nicht gebaut. Microcontroller sind es.

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Michael L. schrieb:
> Folgende Interrupts habe ich bereits ausgeschaltet, jedoch ohne erfolg:

Seit dem PC/AT verwenden PCs zwei kaskadierte Interruptcontroller; Dein 
Ansatz befriedigt aber nur einen Interruptcontroller.

Der zweite Interruptcontroller hat die I/O-Adresse 0xA0/0xA1.

von (prx) A. K. (prx)


Lesenswert?

Wenn er den Kaskade-IRQ 2 abgeschaltet hat, dann sollte der sekundäre 
eigentlich komplett weg sein.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das denkt man sich so, nur korreliert das irgendwie überhaupt nicht mit 
den genannten Bits der Bitmaske.

Mir scheint das ganze Grundkonzept irgendwie kaputt zu sein.

(Nicht nur das des PC, das ist es schon lange, sondern die Idee, mit 
einem PC durch Bitfrickeln am Frickelport eine PWM zu erzeugen)

von (prx) A. K. (prx)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Das denkt man sich so, nur korreliert das irgendwie überhaupt nicht mit
> den genannten Bits der Bitmaske.

Um die Situation von PCs dieses Jahrhunderts in dieser Frage wirklich 
genau zu verstehen, muss man vermutlich ein paar Kilo Doku wälzen. Zumal 
das, was man von dem Kram in der XT/AT-Ansicht zu sehen kriegt, ohnehin 
eine nur unveränderte wirkende antike Scheinfassade eines viel 
komplexeren Gebildes ist. Eine Fassade, die nur dazu da ist, Bootloader 
(oder notfalls auch DOS) zu starten, und dann alsbald durch das 
eigentliche Gebilde ersetzt wird.

Darauf, dass sich ein PC im Laufzeitverhalten exakt so verhält, wie ein 
zu schnell geratener PC/AT, würde ich keinen Pfennig setzen. Insofern 
ist der Ansatz schlichtweg sinnlos.

: Bearbeitet durch User
von Reinhard Kern (Gast)


Lesenswert?

A. K. schrieb:
> Insofern
> ist der Ansatz schlichtweg sinnlos.

Es wurde wohl schon millionenmal geschrieben, dass ein PC mit DOS, 
Windows oder auch Linux kein Echtzeitsystem ist. Trotzdem scheint sich 
diese Erkenntnis einfach nicht durchzusetzen.

Der Ansatz, aus einem Non-RTS ein Realtime-System zu machen, indem man 
einfach alle Interrupts abschaltet, ist an Absurdität nicht mehr zu 
überbieten. Das liegt etwa auf dem Niveau, im Auto die Zündkabel 
rauszureissen, um die Störungen im Radio zu beseitigen.

Gruss Reinhard

von Michael L. (nightflyer88)


Lesenswert?

Besten Dank für eure Antworten.

Ich habe noch eine andere "fremde" Software, die ebenfalls ein PWM am 
LPT erzeugt. Dort wird dies jedoch mit einem Timer realisiert, und 
funktioniert natürlich einiges besser. Wenn meine Software das gleiche 
PWM erzeugen kann, ist das Ziel erreicht !! Mir ist natürlich klar, das 
mit einem normalen PC nie ein 100% RT System zustande kommt. Es muss nur 
so gut wie die fremd Software funktionieren.

Zurück zum Thema:
Mein Gedanke: Timer mit einem Wert laden, ist der Timer auf 0, wird eine 
ISR aufgerufen, und der Ausgang am LPT gesetzt. Und so weiter....

Mit dem Timer 2 (H43)  habe ich schon einige versuche gemacht, aber ich 
habe keine Ahnung wie das mit dem Interrupt funktioniert, wenn der Timer 
auf 0 ist.

Wie wird eine ISR definiert, die dann ausgeführt werden soll ?
Welches interrupt wird überhaupt auftreten ?

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.