Context Switching Functions


Detailed Description

These functions should be implemented to manage a per task stack, and saving and restoring context.

The context is stored so that it looks like the way the stack would if all the registers were stored by an interrupt function.


Defines

#define TRPORT_MIN_CTXT_SZ   64

Functions

osstkptr_t hal_stk_init (osword_t *stk, osword_t stacksize, osfnptr_t pc, osptr_t init_arg)
static void hal_retval_set (osstkptr_t ctxt_ptr, osptr_t retval)
osstkptr_t hal_ctxt_switch (void)
void hal_ctxt_load (osstkptr_t ctxt_ptr)
void hal_init (void)


Define Documentation

#define TRPORT_MIN_CTXT_SZ   64

Define the minimum size of the context in oswords.

Definition at line 221 of file template/tr_port.h.


Function Documentation

osstkptr_t hal_stk_init ( osword_t stk,
osword_t  stacksize,
osfnptr_t  pc,
osptr_t  init_arg 
)

Initialize a stack and create a new context for a task.

Parameters:
stk Pointer to the stack.
stacksize Size of the stack.
PC Program counter.
init_arg Initial argument passed to the task.
Returns:
The pointer to the task context to be used in load/save context.

static void hal_retval_set ( osstkptr_t  ctxt_ptr,
osptr_t  retval 
) [inline, static]

Set a return value for a task whose context is stored.

This is only needed if TIROS_REGISTER_PASSING is defined for your port. This injects a return value into the context of a task that is currently frozen.

Parameters:
ctxt_ptr Pointer to the context of the task.
retval The return value to be injected into the task context

Definition at line 239 of file template/tr_port.h.

osstkptr_t hal_ctxt_switch ( void   ) 

Context switch from user level (non-ISR) This function is called from within an OS call, to switch the running process.

It also provides a return value. This is a pseudo return-value, This function does not actually determine the value returned. The return value is set by hal_retval_set which is often invoked when waking the process up from a blocked state. This function may have to be implemented in assembly based on the port. The function takes the following form

 osstkptr_t hal_ctxt_switch(void) {
      osstkptr_t new_ctxtptr, current_ctxtptr;
      current_ctxtptr = save_current_context();
      new_ctxtptr = osint_taskswitcher(current_ctxtptr);
      load_new_context(new_ctxtptr);
 
      // The code should not reach this far.  When 
      // new context is loaded, it will jump out of the
      // hal_ctxt_switch function.
        return 0; 
 }

The function may also take the following form when there is no easy access to the current stack value.

 osstkptr_t hal_ctxt_switch(void) {
      osstkptr_t ctxt_ptr, new_ctxt_ptr;
      ctxt_ptr = osint_running_task_ctxt();
      if (stkptr != ILLEGAL_STACK) {
            save_current_context(ctxt_ptr);
            new_ctxt_ptr = osint_taskswitcher(ctxt_ptr);
            load_new_context(new_ctxt_ptr);
      } else {
            new_ctxt_ptr = osint_taskswitcher(ctxt_ptr);
            load_new_context(new_ctxt_ptr);
      }
      // The code should not reach this far.  When 
      // new context is loaded, it will jump out of the
      // hal_ctxt_switch function.
        return 0; 
 }

Returns:
Return value.

void hal_ctxt_load ( osstkptr_t  ctxt_ptr  ) 

Load the given context.

Parameters:
ctxt_ptr Pointer to task context

void hal_init ( void   ) 

Initialize the hardware.

Any hardware specific initialization can be performed her. Timer and kernel trap initialization can also be performed within this function.


TiROS User Manual: Last Updated on Fri Jul 20 10:52:24 2007