Merge branch 'test2' of gitlab.ibr.cs.tu-bs.de:vss/teaching/ss25/v_bsb1/Gruppe_018 into test2

test2
Eggert Jung 4 months ago
commit 370e76bfc4

@ -129,21 +129,23 @@ void set(uint32_t counter, uint8_t divide, uint8_t vector, bool periodic,
LAPIC::write(TIMER_DIVIDE_CONFIGURATION, getClockDiv(divide));
LAPIC::write(TIMER_INITIAL_COUNTER, counter);
}
uint64_t time_tick;
uint8_t dividender;
bool setup(uint32_t us) {
uint64_t timer_ticks = (static_cast<uint64_t>(ticks()) * us) / 1000ULL;
time_tick = (static_cast<uint64_t>(ticks()) * us) / 1000ULL;
uint8_t divisor = 1;
while (timer_ticks > UINT32_MAX) {
dividender = 1;
while (time_tick > UINT32_MAX) {
// While timer_ticks is to large to fit in 32bits.
timer_ticks >>= 1;
divisor <<= 1;
time_tick >>= 1;
dividender <<= 1;
}
if (divisor > 128)
if (dividender > 128)
return false; // Timer interval is to large.
// Setup Masked interrupts to effectively disable the timer.
set(static_cast<uint32_t>(timer_ticks), divisor, Core::Interrupt::TIMER, true, true);
return true;
}
@ -156,15 +158,15 @@ uint32_t interval() {
}
void activate() {
uint32_t timer_ticks = LAPIC::read(TIMER_INITIAL_COUNTER);
// Disable Counter to avoid spouriose interrupts.
LAPIC::write(TIMER_INITIAL_COUNTER, 0);
set(static_cast<uint32_t>(time_tick), dividender, Core::Interrupt::TIMER, true, true);
// Activate Timer interrupts.
setMasked(false);
// enable counter with correct value.
LAPIC::write(TIMER_INITIAL_COUNTER, timer_ticks);
LAPIC::write(TIMER_INITIAL_COUNTER, time_tick);
}
void setMasked(bool masked) {

@ -150,7 +150,6 @@ extern "C" int main_ap() {
<< static_cast<int>(LAPIC::getID()) << " in main_ap()" << endl;
LAPIC::Timer::setup(1000000);
Core::Interrupt::enable();
LAPIC::Timer::activate();

Loading…
Cancel
Save