Betriebssystem-Eigenschaften von RMOS3
8.9 C-Runtime-Bibliothek CRUN
Zero Divide Exception
Wird die Zero Divide–Exception gesperrt, wird ein Wert zurückgegeben, der durch die
MASKED RESPONSE des Coprozessors festgelegt ist.
Denormalized Operand
Sollte trotzdem als Zwischenergebnis ein Denormal auftreten, so wird mit diesem Wert
weitergerechnet. Der dabei auftretende Genauigkeitsverlust wird in Kauf genommen.
Wird die Denormal–Exception freigegeben, so muss der Anwender in der Exception–Routine
für eine Normalisierung sorgen. Eine Normalisierung in der CRUN wird nicht durchgeführt.
Invalid Operation
Diese Exception tritt bei einer ungültigen arithmetischen Operation auf (z.B. bei der Bildung
der Quadratwurzel einer negativen Zahl). Tritt diese Exception auf, so wird der
entsprechende Exception–Handler aufgerufen.
Sperrt der Anwender diese Exception, so wird von der jeweiligen CRUN–Funktion ein
besonderer Wert zurückgeliefert. Dieser ist bei den jeweiligen Funktionen, sowie in der
8087–Beschreibung (bei Operationen, die nicht innerhalb der CRUN durchgeführt werden)
beschrieben.
Standardmäßig sollte folgende Initialisierungssequenz in
(das Initialisierungsbeispiel ist in Assembler programmiert):
controlword dw
Damit wird die oben angeführte Standard–Initialisierung durchgeführt. Werden Exceptions
freigegeben, so wird bei Auftreten einer Exception–Bedingung der taskspezifische
Signalhandler aufgerufen. Defaultmäßig führt dies zum Beenden der jeweiligen Task. Der
Signalhandler kann entweder mit einem Return–Befehl verlassen werden, wenn z.B. eine
Underflow–Exception behandelt wird. Andererseits kann der Signalhandler mit
Auftreten einer Fehlerbedingung verlassen werden. Der Anwender muss in diesem Fall
einen eigenen Signalhandler installieren.
far struct env87 void x_cr_issue_eoi_copr(void)
Mit dieser Funktion werden Interrupts des 80x87 behandelt. Die Funktion wird im RMOS3–
DI–Zustand aufgerufen. Die Funktion legt auf dem Stack die Umgebung des 80x87 ab (14
Worte).
far int x_cr_init_copr_hw()
Diese Funktion gibt die Nummer des Interruptvektors zurück, über den Coprozessor–
Exceptions ausgelöst werden (PC/AT: Externer Interrupt 13, 80x86–Architektur: Interrupt
16). Der Interruptvektor des PC ist davon abhängig, wie der 8259–Interrupt-Controller
programmiert ist. Interrupt 13 ist der unter DOS verwendete Interruptvektor. Diese Funktion
dient ebenfalls der Hardware–Initialisierung des Coprozessors. Dazu gehört z.B. die
Programmierung des 80486 um den Coprozessor in einen PC–kompatiblen Modus zu
versetzen (NE–Bit im Control–Register–CR0).
aufgerufen.
Defaultmäßig sind in der CRUN Routinen für PC-kompatiblen Coprozessoranschluss
vorhanden. Diese werden verwendet, wenn SWCCF87.OBJ nicht dazugebunden wird.
156
0001001100111111B
FINIT
FLDCW
controlword
FWAIT
x_cr_initcopr
wird nur einmal von
x_cr_init_copr_hw
RMOS3 V3.50 Benutzerhandbuch
Bedienhandbuch, 07/2012, A5E03692290-01
verwendet werden
bei
longjmp
xinitc