C Microkernel Realtime eXecutive
Realtime Operating System for Cortex-M based microcontrollers
 
Loading...
Searching...
No Matches

Description

Data Structures

struct  TimerEntry_t
 Description of one sleep request. More...
 

Macros

#define IS_PERIODIC(interval)   (((interval) >> 31) == 1)
 Determine if interval in sleep entry is periodic or not.
 
#define GET_SLEEPTIME(interval)   ((interval) & (~(1 << 31)))
 Get how long the sleep should take.
 

Functions

int os_usleep (unsigned microseconds)
 Kernel implementation of usleep() syscall.
 
int os_setitimer (unsigned microseconds)
 Kernel implementation of setitimer() syscall.
 
void os_timer_init ()
 This routine initializes kernel scheduling subsystem.
 
bool os_schedule_timer (unsigned *delay)
 Provide information on next scheduled event.
 
void os_run_timer (uint32_t microtime)
 Fire scheduled event.
 
static int do_set_timed_event (unsigned slot, unsigned interval, bool _periodic)
 Perform heavy lifting of setting timers This routine will store timed event into list of timed events.
 
static int set_timed_event (unsigned microseconds, bool periodic)
 Find a slot for timed event and store it.
 
static int cancel_timed_event (Thread_t owner, bool periodic)
 Cancels existing timed event.
 
static void delay_us (uint32_t period_us)
 Perform short busy wait.
 
static uint32_t get_sleep_time (uint32_t sleep_from, uint32_t microtime)
 Helper function to calculate time considering type wraparound.
 

Variables

struct TimerEntry_t sleepers [SLEEPERS_MAX]
 List of all delays requested from kernel.
 

Macro Definition Documentation

◆ GET_SLEEPTIME

#define GET_SLEEPTIME (   interval)    ((interval) & (~(1 << 31)))

Get how long the sleep should take.

Will clean the periodicity flag from interval.

Returns
sleep time in microseconds.

◆ IS_PERIODIC

#define IS_PERIODIC (   interval)    (((interval) >> 31) == 1)

Determine if interval in sleep entry is periodic or not.

Returns
1 if interval is periodic, 0 if interval is one-shot.

Function Documentation

◆ cancel_timed_event()

static int cancel_timed_event ( Thread_t  owner,
bool  periodic 
)
static

Cancels existing timed event.

This function is only accessible for periodic timers externally. It allows cancelling of interval timers set previously.

Parameters
ownerthread which shall own the interval timer
periodictrue if periodic timer of given thread should be cancelled
Returns
0 if operation performed succesfully.

◆ delay_us()

static void delay_us ( uint32_t  period_us)
static

Perform short busy wait.

This will perform busywait in the context of current thread. Useful to do short waits for I/O.

Parameters
period_ushow long the wait should take

◆ do_set_timed_event()

static int do_set_timed_event ( unsigned  slot,
unsigned  interval,
bool  _periodic 
)
static

Perform heavy lifting of setting timers This routine will store timed event into list of timed events.

If event is not periodic, it will also stop thread (os_usleep semantics).

Parameters
slotnumber of slot in sleepers list
intervalamount of us for which thread should sleep
_periodictrue if timer should be periodic, false otherwise
Returns
0 if timer was set up properly

◆ get_sleep_time()

static uint32_t get_sleep_time ( uint32_t  sleep_from,
uint32_t  microtime 
)
static

Helper function to calculate time considering type wraparound.

This function will calculate the final time considering timer wraparound.

Parameters
sleep_fromtime at which the sleep starts (microseconds)
microtimeduration of sleep (microseconds)
Returns
new value of kernel timer at the end of sleep

◆ os_run_timer()

void os_run_timer ( uint32_t  microtime)

Fire scheduled event.

Will find and run scheduled event.

Parameters
microtimecurrent processor time in microseconds

◆ os_schedule_timer()

bool os_schedule_timer ( unsigned *  delay)

Provide information on next scheduled event.

This function informs caller about delay until next scheduled event. Next scheduled event may be either wake-up of sleeped thread, or interval timer.

Parameters
[out]delayaddress of buffer, where delay to next scheduled event will be written
Returns
true if there is any scheduled event known and at address pointed to by delay value was written. Returns false if there is no known scheduled event. In such case content of memory pointed to by delay is undefined.

◆ os_setitimer()

int os_setitimer ( unsigned  microseconds)

Kernel implementation of setitimer() syscall.

See setitimer for details on arguments.

◆ os_timer_init()

void os_timer_init ( )

This routine initializes kernel scheduling subsystem.

It is necessary to call this routine before first call to either timer syscalls, or os_run_timer otherwise things will go wrong.

◆ os_usleep()

int os_usleep ( unsigned  microseconds)

Kernel implementation of usleep() syscall.

See usleep for details on arguments.

◆ set_timed_event()

static int set_timed_event ( unsigned  microseconds,
bool  periodic 
)
static

Find a slot for timed event and store it.

This is actual execution core for both os_usleep and os_setitimer functions. It will find free slot or slot already occupied by calling thread and will set / update timeout values.

Parameters
microsecondstime for which thread should sleep / wait for event
periodictrue if this event is periodic
Returns
error status. 0 means no error.

Variable Documentation

◆ sleepers

struct TimerEntry_t sleepers[SLEEPERS_MAX]

List of all delays requested from kernel.

This structure contains all scheduled sleeps requested by all threads. Every thread can technically request one periodic timer and one one-shot delay.