TNeoKernel
v1.03
|
Architecture-dependent routines declaration.
Definition in file tn_arch.h.
Go to the source code of this file.
Functions | |
void | tn_arch_int_dis (void) |
Unconditionally disable interrupts. | |
void | tn_arch_int_en (void) |
Unconditionally enable interrupts. | |
TN_UWord | tn_arch_sr_save_int_dis (void) |
Disable interrupts and return previous value of status register, atomically. More... | |
void | tn_arch_sr_restore (TN_UWord sr) |
Restore previously saved status register. More... | |
TN_UWord * | _tn_arch_stack_top_get (TN_UWord *stack_low_address, int stack_size) |
Should return top of the stack, which may be either: More... | |
TN_UWord * | _tn_arch_stack_init (TN_TaskBody *task_func, TN_UWord *stack_top, void *param) |
Should put initial CPU context to the provided stack pointer for new task and return current stack pointer. More... | |
int | _tn_arch_inside_isr (void) |
Should return 1 if ISR is currently running, 0 otherwise. | |
void | _tn_arch_context_switch_pend (void) |
Called whenever we need to switch context from one task to another. More... | |
void | _tn_arch_context_switch_now_nosave (void) |
Called whenever we need to switch context to new task, but don't save current context. More... | |
TN_UWord tn_arch_sr_save_int_dis | ( | void | ) |
Disable interrupts and return previous value of status register, atomically.
tn_arch_sr_restore()
void tn_arch_sr_restore | ( | TN_UWord | sr | ) |
Restore previously saved status register.
sr | status register value previously from tn_arch_sr_save_int_dis() |
tn_arch_sr_save_int_dis()
Should return top of the stack, which may be either:
(stack_low_address - 1)
(stack_low_address + stack_size)
(depending on the architecture)
NOTE that returned top of the stack is NOT the address which may be used for storing the new data. Instead, it is the previous address.
stack_low_address | start address of the stack array. |
stack_size | size of the stack in TN_UWord -s, not in bytes. |
TN_UWord* _tn_arch_stack_init | ( | TN_TaskBody * | task_func, |
TN_UWord * | stack_top, | ||
void * | param | ||
) |
Should put initial CPU context to the provided stack pointer for new task and return current stack pointer.
When resulting context gets restored by _tn_arch_context_switch_now_nosave()
or _tn_arch_context_switch_pend()
, the following conditions should be met:
tn_task_exit()
, so that when task body function returns, tn_task_exit()
gets automatially called;param
pointertask_func | Pointer to task body function. |
stack_top | Top of the stack, returned by _tn_arch_stack_top_get() . |
param | User-provided parameter for task body function. |
void _tn_arch_context_switch_pend | ( | void | ) |
Called whenever we need to switch context from one task to another.
This function typically does NOT switch context; it merely pends it, that is, it sets appropriate interrupt flag. If current level is an application level, interrupt is fired immediately, and context gets switched.
But, if it's hard or impossible on particular platform to use dedicated interrupt flag, this function may just switch the context on its own.
Preconditions:
tn_curr_run_task
points to currently running (preempted) task;tn_next_task_to_run
points to new task to run.Actions to perform in actual context switching routine:
tn_curr_run_task
to tn_next_task_to_run
;tn_curr_run_task
tn_next_task_to_run
void _tn_arch_context_switch_now_nosave | ( | void | ) |
Called whenever we need to switch context to new task, but don't save current context.
This happens:
tn_sys_start()
;tn_task_exit()
This function doesn't pend context switch, it switches context immediately.
Preconditions:
tn_next_task_to_run
is already set to needed task.Actions to perform:
tn_curr_run_task
to tn_next_task_to_run
;tn_curr_run_task
tn_next_task_to_run