CM3: kernel preemption.
authorarighi <arighi@38d2e660-2303-0410-9eaa-f027e97ec537>
Tue, 6 Apr 2010 09:28:21 +0000 (09:28 +0000)
committerarighi <arighi@38d2e660-2303-0410-9eaa-f027e97ec537>
Tue, 6 Apr 2010 09:28:21 +0000 (09:28 +0000)
commit77958b8e9d27594aa22e76132b4bbb8d0335bfc2
tree19d3700a6f7a85106b4a085c579cbeebd9a9398c
parentffc9d84f819c7480515ece4417329f4972510462
CM3: kernel preemption.

Kernel preemptible is implemented using the PendSV IRQ. Inside the
SysTick handler when a process expires its time quantum a pending
(PendSV) call is triggered.

At the end of the SysTick handler the PendSV handler is called, using
the architecture's tail-chaining functionality (an ISR call without the
overhead of state saving and restoration between different IRQs), and we
perform the stack-switching.

Voluntary context switch is implemented as a soft-interrupt call
(SVCall), so any process is always suspended / resumed from an interrupt
context.

NOTE: interrupts must be disabled or enabled when resuming a process
context in function of the type of suspension. If a process was
suspended by a voluntary context switch IRQs must be disabled on resume
(voluntary context switch always happen with IRQs disabled). Instead, if
a process was suspended by the kernel preemption IRQs must be always
re-enabled, because the PendSV handler resumes directly the process
context.

If CONFIG_KERN_PREEMPT is not enabled the cooperative implementation
fallback to the default stack-switching mechanism performed directly in
thread-mode and implemented as a normal function call.

git-svn-id: https://src.develer.com/svnoss/bertos/trunk@3396 38d2e660-2303-0410-9eaa-f027e97ec537
bertos/cpu/cortex-m3/drv/timer_lm3s.c
bertos/cpu/cortex-m3/drv/timer_lm3s.h
bertos/cpu/cortex-m3/hw/init_lm3s.c
bertos/cpu/cortex-m3/io/lm3s_types.h
bertos/cpu/frame.h
bertos/cpu/irq.h
bertos/kern/preempt.c
bertos/kern/proc.c
bertos/kern/proc_p.h