The users of this system want two different timer services. First, users want to be able to issue a delayed signal to a semaphore. To issue such a signal, the user specifies a semaphore and a time interval, in microseconds, and the timer subsystem will signal that semaphore after that interval has passed. Second, users want to be able to inquire about the time and date, specified as a three word quantity, giving day number since the (arbitrarily established) beginning of time, seconds since midnight, and microseconds in the current second.
The Problem, part A: Propose an implementation of a delayed signal primitive on a semaphore, using a programmable interval timer.
hardware registers
interval_timer_counter
interval_timer_enabled
software variables
timer_head -- a list of timer records
current_interval -- record describing the current
types
timer -- a record with the following fields
sem -- a semaphore
interval -- time interval
next -- link to the next timer in the list
delayed_signal(S, I)
allocate new timer T
T.sem = S
T.interval = I
schedule_timer(T)
return
schedule_timer(T)
disable_interrupts
if interval_timer_enabled
T.interval = T.interval - interval_timer_counter
if timer_head = null
timer_head = T
T.next = null
else if T.interval < timer_head.interval
T.next = timer_head
timer_head.interval = timer_head.interval - T.interval
else
X = timer_head
loop
exit loop when X.next = null
exit loop when X.next.interval > T.interval
X = X.next
T.interval = T.interval - X.interval
endloop
T.next = X.next
X.next = T
if T.next /= null
T.next.interval = T.next.interval - T.interval
endif
endif
else
interval_timer_counter = T.counter
current_interval = T
set interval_timer_enabled
endif
enable_interrupts
return
timer_interrupt_service_routine
disable_interrupts
signal( current_interval.sem )
if timer_head = null
reset interval_timer_enabled
else
deallocate timer record current_interval
interval_timer_counter = timer_head.interval
current_interval = timer_head
timer_head = timer_head.next
endif
enable_interrupts
return
The Problem, part B: Suggest an implementation for the time and date service:
Note that intervals are probably limited to something less than the maximum date, so we need to deal with interval overflow.
constant
date_interval -- the delay between increments of date
variables
date -- used to count time
date_sem -- a semaphore
count_time -- a process used to update date
repeat
delayed_signal( date_sem, max_interval )
wait( date_sem )
date = date + 1
forever
time_and_date( D, I )
-- return , the time and date
disable_interrupts
D = date
I = interval_timer_counter
X = timer_head
repeat
I = I + X.interval
X = X.next
until X.sem = date_sem
enable_interrupts