Tuesday, 29 November 2016

A RTOS
G Anand

RTOS is simple and powerful for standalone embedded systems. Simple kernel handles task switching and task stack for multi-tasking. It can be handled easily by the programmer for self-programing. Boot loaded RTOS kernel can reduce the compiler compiling time.
ARTOS is introduced to simplify the operations when compared to other RTOSs. Interrupt latency is the main problem which is faced by other RTOSs. In this ARTOS a new method is used to avoid interrupt latency. Normally all interrupts access same location in the stack. So interrupt-2 couldn’t access that location until the execution of the interrupt-1. In order to avoid this delay the function to be handled by interrupt-1 will be assigned to another stack variable as a handling function. So program control leaves interrupt 1 and starts to concentrate on the handling function. Inside the handling function user can define their program. Now at the same time, interrupt-2 get serviced and also interrupt 1 will be implemented. In conventional RTOS, only after creation of all tasks, implementation will be performed. ARTOS is designed in-order to perform simultaneous operations. In ARTOS tasks can be created at any point of time. Task creation and implementation can be performed simultaneously. In the process of interrupt handling, to enable and disable Interrupt we need to write coding. But in ARTOS interrupt enable and disable are created as a function. Now it will be easy to access interrupt enable and disable. Thus ARTOS will be user-friendly. ARTOS library functions are explained below.


FEATURES
Ø Task Priority
All the task ruined at least one time in every kernel routine (Total Task switching)
·        LOW:  This priority tasks will be called once after HIGH priority task. It works on the basis of auto task switching. Every time the task can be switched between TMR0 interrupt act. If for loop based delay is used in the task, then it will be difficult to predict the time because of auto switching process. In-order to avoid the task switching in the task in which for loop is used, ARTOS_LOCK () function can be used.
·        HIGH: This priority tasks will be called once before LOW priority task. It works on the basis of auto task switching. Every time the task can be switched between TMR0 interrupt act. If for loop based delay is used in the task, then it will be difficult to predict the time because of auto switching process. In-order to avoid the task switching in the task in which for loop is used, ARTOS_LOCK () function can be used.
·        REALTIME: This priority tasks will be called multiple times after each HIGH and LOW priority tasks. It’s used to debugger task for fetch task status from each calling task. It is a Controlled task. It works on the basis of manual task switching. If once the task resource is allocated to real time priority tasks, then the process will not move to another task. If there is a need to switch the task, then use ARTOS_Idle () function (switching to the next task).
Ø Semaphore
·        All processor’s internal resources are accessed by semaphore.
·        Example: Consider the processor has single serial port. If the same resource is accessed by 2 tasks simultaneously, then data interference will be occurred in serial port.
·        To avoid this CONNECT and DISCONNECT instructions can be used. If one task is already connected to the serial port, other tasks should wait to establish connection to that resource.
Ø IPC (Inter Process Communication)
·        Pointer based IPC. Only the Variable address will be transferred from one process to another process. Thus any data type  and large data can be accessed from another task
·        Perfect address handling is done with the help of global and heap variables.
·        Semaphore based data communication.
Ø Interrupt Handling
·        Easy to access interrupt functions
·        All interrupts are enabled and disabled by inbuilt functions and interrupt event handles header functions.
·        Software nested interrupt sequence
·        Interrupt Priority
§  LOW: Handle has individual stack. It processes newly arrived LOW and HIGH priority interrupts. If HIGH or LOW interrupt comes into play while one low priority interrupt is in process, then current interrupt context has been saved and jump to next interrupt. All the interrupts are processes in the manner last in first out.
§  HIGH: Handle has individual stack. It processes newly arrived HIGH priority interrupt. If one interrupt is processing at the same time another HIGH interrupts comes into play, then the Current interrupt context has been saved and jump to next interrupt. All the interrupts are processed in the manner last in first out.
§  REALTIME: Handle has no individual stack. All the interrupts are processed in the manner last in first out.
·        If user enabled the TMR interrupt, it generates interrupt event handling function and call this function every interrupt occur.
·        TMR0 interrupt is reserved for kernel routine. This interrupt event can be used for fixed kernel time. If the time of this interrupt kernel is changed, only the time will be changed and the other system operations will not be affected.
Ø UART function
·        Interrupt based TX an RX
·        Buffered receiver which doesn’t listen every time while receiving
·        Semaphore based UART functions like sending and receiving operations using byte and string.
Ø System Timer
·        Inbuilt HR: MIN: SEC: MSEC: USEC task for perfect timer operation.
·        Get system time sample for timeout operation.
·        Use Kernel Timer (TMR0) , so don’t need special timer
·        LOW priority task only.
Ø Auto prediction of the function stack top
Ø Main routine is like individual task. This task is handled by ARTOS_INIT function
Ø Inbuilt library
·        GSM
·        Audio reader
·        LCD
·        ALARM
·        Multi data type EEPROM ( int, char, string..)
·        Seven Segment
·        DS1307 (Timer chip)
·        Bounce Button
·        Soft button
·        Universal IR decoder
FUNCTIONS

Ø int8 ARTOS_Init(uint16 Main_ThreadID,int8 *Main_Stack,uint16 Main_Stack_Depth,uint8 Main_Task_Priority);
This function should be called before calling other functions (i.e at initial stage).  In our ARTOS, creation and implementation of tasks are performed simultaneously. For this simultaneous operation init function should be declared at first. Consider the main function consists of 2 tasks.
Main()
{
int8 ARTOS_Init(uint16 Main_ThreadID,int8 *Main_Stack,uint16 Main_Stack_Depth,uint8 Main_Task_Priority);
Task 1
- - - - - - - - - - - -
- - - - - - - - - - - -
Task 2
}
Used to back up the main task context
First task 1 will be created and implemented initially. Task 1 will be interrupted after particular time delay and the program control switch into task 2 creation and implementation. This will be interrupted after particular time delay and the program control has switched to task 1. Thus the simultaneous operation can be achieved.
Default delay time is 500 micro seconds. We can change this delay time according to our need. In other versions of RTOS first we should create task in the main function.  Only after creation of all tasks OS starts to implement them. If the OS starts to implement the tasks, then it will never return to the main function.
To declare init function we need to assign thread ID(uint16 Main_ThreadID), stack name(int8 *Main_Stack), stack size(uint16 Main_Stack_Depth) and priority(uint8 Main_Task_Priority).
Thread ID
It should be 16 bit number. Avoid assigning FF as main thread ID because some inbuilt function has used FF as their thread ID.
Stack name and size:
These arguments are used to define stack to store temporal variables of the main function. This stack does not include particular task variable. If we implement the tasks only after creation then there is no need to keep track of main function. We are performing creation and implementation of tasks simultaneously. So we need to keep track of main function. For this purpose, a stack should be defined to store temporal variables of the main function. This stack does not include particular task variable.
Priority:
There are 3 priorities in our system design. They are low priority, high priority and real_time priority. In these, real_time priority has most significance than other priorities. Second most significant priority is High priority. Least significant priority is Low priority.
If 2 tasks (task 1- high priority, task 2- Low priority) are waiting for the input from the same source, then the task will get the input from the source according to their priority. Normally after particular delay, program control will be switched into another task. If we assign the priority as realtime_priority then the program control will not be switched into another task after particular delay. Only after completing the task program control will be switched into another task.
Ø void ARTOS_ASM_delay(uint8 Nnop);
This function is used to provide assembly delay. It indicates number of no-operation to be performed.

Ø int8 ARTOS_ChangePriority(uint8 Thread_Priority);
This function is used to change the priority of the task (thread) at any step.
Ø int8 ARTOS_Create( uint16 Thread_ID,__Thread Thread_ADDR ,int8 *Stack,uint16 Stack_Depth,int8 *IPC, int8 Thread_Priority );

Create function is used to generate new task. To generate new task thread id, thread address, stack name, stack size, pointer value and thread priority should be given as input arguments.
Uint16 Thread_ID: Should be 16 bit number
Thread_ADDR: Address allocated for the task


Ø int8 *Stack(name), uint16 Stack_Depth(size):

Stack is used to store the variables associated with the task. We need to assign name and size of the stack.

Ø int8 *IPC(pointer value):

Pointer value is used to address the location of the variables used. The change made in the variable will be updated in the address location(denoted by the pointer) directly.

Ø int8 ARTOS_Start(  uint16 Thread_ID );
This function is used to start the implementation of the task which is created and stored in the buffer. After creating each task we need to declare start operation to implement that task. We can start any task from any step using the ID of the task.
Ø int8 ARTOS_Stop(  uint16 Thread_ID );
This function is used to stop the implementation of the task. Normally after particular delay, program control will be switched into another task. Once the program control get the stop command of particular task, then the program control should not get into task until the task is started by using start function We can stop any task from any step using the ID of the task.

Ø int8 ARTOS_Delete(  uint16 Thread_ID );
This function is used to delete the particular task using task ID(thread ID). This function clear the memory associated with the task.

Ø void ARTOS_Return();
This function is used to return the output of a function.
Return value = 0 indicates the output of a function has returned successfully
Return value = negative number indicates the return of output is unsuccessful

Ø void ARTOS_Idle();
This function is used to idle the function for one cycle.
Main()
{
int8 ARTOS_Init(uint16 Main_ThreadID,int8 *Main_Stack,uint16 Main_Stack_Depth,uint8 Main_Task_Priority);
Task 1
- - - - - - - - - - - -
- - - - - - - - - - - -
Task 2
- - - - - - - - - - - -
Idle function
- - - - - - - - - - - -
Task 3
- - - - - - - - - - - -
- - - - - - - - - - - -
Task 4
- - - - - - - - - - - -
- - - - - - - - - - - -
}
First task 1 will implemented. It will get interrupted after particular delay time. And the program control will be switched into task 2. In task 2 we have idle function. So task 2 will not be performed. Program control will be switched into task 3. task 3 will be performed and it will get interrupted after particular delay time. Then the program control will be switched into task 4. It will get interrupted after particular delay time. Then the program control will be switched into task 1. Then the
Ø void ARTOS_Delay(uint16 delay_ms);
This function is used provide delay. We should pass delay time as argument of this function.

Ø void ARTOS_Lock();
Normally after particular delay, program control will be switched into another task. Lock function is used to avoid this switching. So the program control moved to next task only after completing the task which has lock function. This will be helpful to avoid switching in-case of low and high priority tasks.

Ø void ARTOS_UnLock();
This function is used to unlock the task which was locked.

No comments:

Post a Comment