Service | Description | Properties |
---|---|---|
OS_Init() | Initialize system variables |
Clears all task descriptors, all binary semaphores and static timers. This service must be called before OS_Run().
Service | Description | Properties |
---|---|---|
OS_Timer() | Work with all timers |
This service must be used if:
This service should be called from e.g. the TMR0 interrupt routine.
At every execution of OS_Timer() all active timers are increased by 1 (except 24-bit old style static timers which are increased by 1 per 256 ticks).
Example of usage:
void interrupt isr() { if (T0IE && T0IF) { TMR0 -= 250; T0IF = 0; OS_Timer(); } }
Service | Description | Properties |
---|---|---|
OS_Yield () | Switch context |
This service unconditionally switches context (returns to the scheduler) to allow other tasks to be executed.
Service | Description | Properties |
---|---|---|
OS_Delay (delaytime) | Delay current task by delaytime system ticks |
Puts task in waiting state for the time given in parameter delaytime.
For example, a task indicates temperature to the LCD once per second. Let OS_Timer period = 10 ms. Task will look like:
void Task_Indicate (void) { for (;;) { OS_Delay(100); // Delay = 100 * 10 ms = 1 sec IndicateTemperature(); // Output data to LCD } }
Using this service you must remember that OS_Timer is discrete. So the resolution of all delays is one system tick. If the OS_Timer calling interval is 10 ms, then OS_Delay(1) may wait 10 ms, or may wait 0 ms (depending on what time within the OS_Timer period OS_Delay was called).
Therefore you should either be sure that the length of delay is not important or decrease the size of a system tick and increase the delay value. For example, you could reduce the size of a system tick to 1 ms and call OS_Delay(10). Here we can be sure that delay will last for 9-10 ms.
Service | Description | Properties |
---|---|---|
OS_Wait (condition) | Wait for condition to become true |
Puts task in waiting state while condition is false. The condition is any expression of boolean type. When the condition becomes true, the task becomes ready to execute.
... OS_Wait(m_nInPulseCounter >= 10 || m_bButtonPressed); ...
In this example m_nInPulseCounter and m_bButtonPressed are external variables that can be set anywhere in the program. The task will be in waiting state while m_nInPulseCounter is less than 10 and the button is not pressed.
Service | Description | Properties |
---|---|---|
OS_Wait_TO (condition, timeout) | Same as OS_Wait() with exit if timeout expired |
Puts task in wait state while condition is false and timeout has not expired. Timeout value is given in system ticks.
... OS_Wait_TO(m_bButtonPressed, 100); if (OS_IsTimeout()) ...; ...
Here we wait for a button event within 100 system ticks. After exiting the wait, we check if there was a timeout or not by using the service OS_IsTimeout.
All services that check system state return 0 or 1 depending on system state flags.
Service | Description | Properties |
---|---|---|
bool OS_IsTimeout () | Check if exit from wait was due to timeout |
This service can be used after waiting for some event with timeout, to check why the exit occurred. If it returns 1 then the timeout expired and event did not occur. If it returns 0 then the event occurred and there was no timeout.
Service | Description | Properties |
---|---|---|
bool OS_IsError () | Check if system error |
System errors are:
Service | Description | Properties |
---|---|---|
bool OS_IsEventError () | Check if event error |
Event errors are:
Service | Description | Properties |
---|---|---|
bool OS_IsInCriticalSection () | Returns 1 if any task is in critical section |
Service | Description | Properties |
---|---|---|
OS_EnterInt () | For PICC16 and PICC18: should be called at the beginning of interrupt routine (saves FSR value) | |
OS_LeaveInt () | For PICC16 and PICC18: should be called at the end of interrupt routine (restores FSR value) |
A call to OS_EnterInt should be inserted at the start of an interrupt routine, just after definition of local variables. A call to OS_LeaveInt() should be inserted at the end of an interrupt routine, just before the closing '}'.
void interrupt int_routine (void) { char var1, var2; int var3; OS_EnterInt(); ... // ... // OS_LeaveInt(); }
Service | Description | Properties |
---|---|---|
char OS_DI () | Disable interrupts. Returns current GIEx value | |
OS_EI () | Enable all interrupts | |
OS_RI (char) | Restore GIEx value saved by OS_DI() |
Here is an example of using these services to generate a pulse of 5 cycles:
{ char gie_temp; ... gie_temp = OS_DI(); RB0 = 1; NOP(); NOP(); NOP(); NOP(); RB0 = 0; OS_RI(gie_temp); ... }
Service | Arguments | Description | Properties |
---|---|---|---|
System | |||
OS_Sched | | Scan all tasks, select ready task with the highest priority and run it | |
OS_Run | | Run operating system's kernel. Calls OS_Sched() in infinite loop | |
OS_Init | | Initialize system variables | |
OS_Timer | | Increase all active timers | |
Waiting | |||
OS_Yield | | Return to the scheduler | |
OS_Delay | (delaytime) | Delay current task for delaytime system ticks | |
OS_Wait | (condition) | Wait for condition to become true | |
OS_Wait_TO | (condition, timeout) | Wait for condition to become true. Exit if timeout expired | |
Checking | |||
bool OS_IsTimeout | | Return true if timeout occurred in previous wait service | |
bool OS_IsError | | Check if error after task creation | |
bool OS_IsEventError | | Check if error after using events | |
bool OS_IsInCriticalSection | | Return true if any task is in critical section | |
Interrupts | |||
OS_EnterInt | | For PICC16 and PICC18: save FSR at the beginning of an ISR function | |
OS_LeaveInt | | For PICC16 and PICC18: restore saved FSR at the end of an ISR function | |
char OS_DI | | Disable all interrupts and save previous state of GIEx flags | |
OS_EI | | Enable all interrupts | |
OS_RI | (char) | Restore GIEx flags previously saved by OS_DI service | |
OS_EnterCriticalSection | | Enter critical section | |
OS_LeaveCriticalSection | | Leave critical section |