timer_start()
Synopsis:
unsigned timer_start();
Description:
Read and return the hardware timer's current count value.
Timer functions in startup code
- Measure how long an action takes.
- Measure other hardware timers or obtain their characteristics. For example, to calculate cycles_per_sec for the qtime member of the system page, which characterizes the speed of the hardware timer used by ClockCycles().
- Wait for a period of time.
Examples
The following code measures how long it takes to perform an action and converts the value to nanoseconds:
unsigned start = timer_start();
// Perform the action.
unsigned num_hardware_timer_ticks = timer_diff(start);
unsigned long elapsed_time_in_ns = timer_tick2ns(num_hardware_timer_ticks);
The following code adds a waiting period measured in nanoseconds. To compare the specified waiting period to the value returned by timer_diff(), it converts the nanoseconds to hardware timer ticks:
unsigned timer_periods = timer_ns2tick(time_to_wait_in_ns);
const unsigned start = timer_start();
do {
// nothing
} while(timer_diff(start) < timer_periods);
Timer reset
When you implement timer_start(), you can choose whether or not it resets the hardware timer each time you call it. For this reason, you cannot nest calls to timer_start() and timer_diff(). For example, the following code produces unexpected results:
// DO NOT DO THIS
unsigned start_overall = timer_start(); // Reset hardware timer.
for(unsigned i =0; i < NUM_THINGS; i++) {
unsigned start = timer_start(); // Reset hardware timer again.
// do stuff
unsigned diff = timer_diff(start);
// do more stuff
}
// do other stuff
unsigned diff_overall = timer_diff(start_overall); // Invalid value.
Interrupts
Because interrupts are not enabled until the kernel is running, they are disabled when these startup functions execute.
Returns:
A value in hardware timer ticks to pass to timer_diff().