1

add vorgabe09

This commit is contained in:
2022-07-04 16:17:39 +02:00
parent 586fe3bb80
commit da6c5ab0b5
13 changed files with 231 additions and 40 deletions

View File

@ -84,28 +84,6 @@ inline void PCSPK::delay(int time) {
/* Hier muess Code eingefuegt werden */
// 1.19 MHz => 1s for full countdown
unsigned short cntStart = 1193180 / 1000; // 1s / 1000 = 1ms countdown
// 00110000 => 0x30: Counter0, LoByte/HiByte, Mode0, Binary
// 00110010 => 0x32: Counter0, LoByte/HiByte, Mode1, Binary
// 00110100 => 0x34: Counter0, LoByte/HiByte, Mode2, Binary
// 00110110 => 0x36: Counter0, LoByte/HiByte, Mode3, Binary
control.outb(0x34); // Zaehler-0 konfigurieren
data0.outb(cntStart & 0xFF); // Zaehler-0 laden (Lobyte)
data0.outb(cntStart >> 8); // Zaehler-0 laden (Hibyte)
int initial_count, current_count;
for (int i = 0; i < time; ++i) {
initial_count = readCounter();
while (1) {
current_count = readCounter();
if (current_count > initial_count) break; // The counter has already been reset
initial_count = current_count;
}
}
}
/*****************************************************************************

68
c_os/devices/PIT.cc Executable file
View File

@ -0,0 +1,68 @@
/*****************************************************************************
* *
* P I T *
* *
*---------------------------------------------------------------------------*
* Beschreibung: Programmable Interval Timer. *
* *
* Autor: Michael Schoettner, 3.7.2022 *
*****************************************************************************/
#include "devices/PIT.h"
#include "kernel/IOport.h"
#include "kernel/Globals.h"
/*****************************************************************************
* Methode: PIT::interval *
*---------------------------------------------------------------------------*
* Beschreibung: Zeitinervall programmieren. *
* *
* Parameter: *
* us: Zeitintervall in Mikrosekunden, nachdem periodisch ein *
* Interrupt erzeugt werden soll. *
*****************************************************************************/
void PIT::interval (int us) {
/* hier muss Code eingefuegt werden */
}
/*****************************************************************************
* Methode: PIT::plugin *
*---------------------------------------------------------------------------*
* Beschreibung: Unterbrechungen fuer den Zeitgeber erlauben. Ab sofort *
* wird bei Ablauf des definierten Zeitintervalls die *
* Methode 'trigger' aufgerufen. *
*****************************************************************************/
void PIT::plugin () {
/* hier muss Code eingefuegt werden */
}
/*****************************************************************************
* Methode: PIT::trigger *
*---------------------------------------------------------------------------*
* Beschreibung: ISR fuer den Zeitgeber. Wird aufgerufen, wenn der *
* Zeitgeber eine Unterbrechung ausloest. Anzeige der Uhr *
* aktualisieren und Thread wechseln durch Setzen der *
* Variable 'forceSwitch', wird in 'int_disp' behandelt. *
*****************************************************************************/
void PIT::trigger () {
/* hier muss Code eingefuegt werden */
// alle 10ms, Systemzeit weitersetzen
systime++;
// Bei jedem Tick einen Threadwechsel ausloesen.
// Aber nur wenn der Scheduler bereits fertig intialisiert wurde
// und ein weiterer Thread rechnen moechte
/* hier muss Code eingefuegt werden */
}

47
c_os/devices/PIT.h Executable file
View File

@ -0,0 +1,47 @@
/*****************************************************************************
* *
* P I T *
* *
*---------------------------------------------------------------------------*
* Beschreibung: Programmable Interval Timer. *
* *
* Autor: Michael Schoettner, 23.8.2016 *
*****************************************************************************/
#ifndef __PIT_include__
#define __PIT_include__
#include "kernel/interrupts/ISR.h"
class PIT : public ISR {
private:
PIT(const PIT &copy); // Verhindere Kopieren
private:
enum { time_base = 838 }; /* ns */
int timer_interval;
public:
// Zeitgeber initialisieren.
PIT (int us) {
interval (us);
}
// Konfiguriertes Zeitintervall auslesen.
int interval () {
return timer_interval;
}
// Zeitintervall in Mikrosekunden, nachdem periodisch ein Interrupt
//erzeugt werden soll.
void interval (int us);
// Aktivierung der Unterbrechungen fuer den Zeitgeber
void plugin ();
// Unterbrechnungsroutine des Zeitgebers.
void trigger ();
};
#endif