Alternate preemption mode implemented for RVCT.

git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@3014 35acf78f-673a-0410-8e92-d51de3d6d3f4
master
gdisirio 2011-06-02 14:26:17 +00:00
parent dabf18ef8c
commit e5046d1dcb
4 changed files with 66 additions and 24 deletions

View File

@ -361,7 +361,7 @@
<MiscControls>--cpreproc</MiscControls> <MiscControls>--cpreproc</MiscControls>
<Define></Define> <Define></Define>
<Undefine></Undefine> <Undefine></Undefine>
<IncludePath>..\..\..\boards\EA_LPCXPRESSO_BB_1114;..\..\..\os\ports\RVCT\ARMCMx\LPC11xx</IncludePath> <IncludePath>..\;..\..\..\boards\EA_LPCXPRESSO_BB_1114;..\..\..\os\ports\RVCT\ARMCMx\LPC11xx</IncludePath>
</VariousControls> </VariousControls>
</Aads> </Aads>
<LDads> <LDads>

View File

@ -6,9 +6,11 @@ Compiler: RealView C/C++ Compiler V4.1.0.561 [Evaluation].
*** ChibiOS/RT test suite *** ChibiOS/RT test suite
*** ***
*** Kernel: 2.3.0unstable *** Kernel: 2.3.4unstable
*** Compiler: RVCT
*** Architecture: ARMv6-M *** Architecture: ARMv6-M
*** Core Variant: Cortex-M0 *** Core Variant: Cortex-M0
*** Port Info: Preemption through NMI
*** Platform: LPC11xx *** Platform: LPC11xx
*** Test Board: Embedded Artists LPCXpresso Base Board + LPC1114 *** Test Board: Embedded Artists LPCXpresso Base Board + LPC1114
@ -90,7 +92,7 @@ Compiler: RealView C/C++ Compiler V4.1.0.561 [Evaluation].
---------------------------------------------------------------------------- ----------------------------------------------------------------------------
--- Test Case 9.3 (Dynamic APIs, registry and references) --- Test Case 9.3 (Dynamic APIs, registry and references)
--- Result: SUCCESS --- Result: SUCCESS
--------------------------------------------------------------------------- ----------------------------------------------------------------------------
--- Test Case 10.1 (Queues, input queues) --- Test Case 10.1 (Queues, input queues)
--- Result: SUCCESS --- Result: SUCCESS
---------------------------------------------------------------------------- ----------------------------------------------------------------------------
@ -98,55 +100,55 @@ Compiler: RealView C/C++ Compiler V4.1.0.561 [Evaluation].
--- Result: SUCCESS --- Result: SUCCESS
---------------------------------------------------------------------------- ----------------------------------------------------------------------------
--- Test Case 11.1 (Benchmark, messages #1) --- Test Case 11.1 (Benchmark, messages #1)
--- Score : 121347 msgs/S, 242694 ctxswc/S --- Score : 120730 msgs/S, 241460 ctxswc/S
--- Result: SUCCESS --- Result: SUCCESS
---------------------------------------------------------------------------- ----------------------------------------------------------------------------
--- Test Case 11.2 (Benchmark, messages #2) --- Test Case 11.2 (Benchmark, messages #2)
--- Score : 102162 msgs/S, 204324 ctxswc/S --- Score : 103037 msgs/S, 206074 ctxswc/S
--- Result: SUCCESS --- Result: SUCCESS
---------------------------------------------------------------------------- ----------------------------------------------------------------------------
--- Test Case 11.3 (Benchmark, messages #3) --- Test Case 11.3 (Benchmark, messages #3)
--- Score : 102162 msgs/S, 204324 ctxswc/S --- Score : 103037 msgs/S, 206074 ctxswc/S
--- Result: SUCCESS --- Result: SUCCESS
---------------------------------------------------------------------------- ----------------------------------------------------------------------------
--- Test Case 11.4 (Benchmark, context switch) --- Test Case 11.4 (Benchmark, context switch)
--- Score : 377584 ctxswc/S --- Score : 383632 ctxswc/S
--- Result: SUCCESS --- Result: SUCCESS
---------------------------------------------------------------------------- ----------------------------------------------------------------------------
--- Test Case 11.5 (Benchmark, threads, full cycle) --- Test Case 11.5 (Benchmark, threads, full cycle)
--- Score : 78768 threads/S --- Score : 79025 threads/S
--- Result: SUCCESS --- Result: SUCCESS
---------------------------------------------------------------------------- ----------------------------------------------------------------------------
--- Test Case 11.6 (Benchmark, threads, create only) --- Test Case 11.6 (Benchmark, threads, create only)
--- Score : 112764 threads/S --- Score : 112230 threads/S
--- Result: SUCCESS --- Result: SUCCESS
---------------------------------------------------------------------------- ----------------------------------------------------------------------------
--- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) --- Test Case 11.7 (Benchmark, mass reschedule, 5 threads)
--- Score : 33088 reschedules/S, 198528 ctxswc/S --- Score : 33692 reschedules/S, 202152 ctxswc/S
--- Result: SUCCESS --- Result: SUCCESS
---------------------------------------------------------------------------- ----------------------------------------------------------------------------
--- Test Case 11.8 (Benchmark, round robin context switching) --- Test Case 11.8 (Benchmark, round robin context switching)
--- Score : 249336 ctxswc/S --- Score : 236968 ctxswc/S
--- Result: SUCCESS --- Result: SUCCESS
---------------------------------------------------------------------------- ----------------------------------------------------------------------------
--- Test Case 11.9 (Benchmark, I/O Queues throughput) --- Test Case 11.9 (Benchmark, I/O Queues throughput)
--- Score : 270084 bytes/S --- Score : 360780 bytes/S
--- Result: SUCCESS --- Result: SUCCESS
---------------------------------------------------------------------------- ----------------------------------------------------------------------------
--- Test Case 11.10 (Benchmark, virtual timers set/reset) --- Test Case 11.10 (Benchmark, virtual timers set/reset)
--- Score : 303522 timers/S --- Score : 311418 timers/S
--- Result: SUCCESS --- Result: SUCCESS
---------------------------------------------------------------------------- ----------------------------------------------------------------------------
--- Test Case 11.11 (Benchmark, semaphores wait/signal) --- Test Case 11.11 (Benchmark, semaphores wait/signal)
--- Score : 603212 wait+signal/S --- Score : 599396 wait+signal/S
--- Result: SUCCESS --- Result: SUCCESS
---------------------------------------------------------------------------- ----------------------------------------------------------------------------
--- Test Case 11.12 (Benchmark, mutexes lock/unlock) --- Test Case 11.12 (Benchmark, mutexes lock/unlock)
--- Score : 372744 lock+unlock/S --- Score : 371284 lock+unlock/S
--- Result: SUCCESS --- Result: SUCCESS
---------------------------------------------------------------------------- ----------------------------------------------------------------------------
--- Test Case 11.13 (Benchmark, RAM footprint) --- Test Case 11.13 (Benchmark, RAM footprint)
--- System: 360 bytes --- System: 368 bytes
--- Thread: 68 bytes --- Thread: 68 bytes
--- Timer : 20 bytes --- Timer : 20 bytes
--- Semaph: 12 bytes --- Semaph: 12 bytes

View File

@ -45,6 +45,15 @@
/* Port configurable parameters. */ /* Port configurable parameters. */
/*===========================================================================*/ /*===========================================================================*/
/**
* @brief Alternate preemption method.
* @details Activating this option will make the Kernel use the PendSV
* handler for preemption instead of the NMI handler.
*/
#ifndef CORTEX_ALTERNATE_SWITCH
#define CORTEX_ALTERNATE_SWITCH FALSE
#endif
/*===========================================================================*/ /*===========================================================================*/
/* Port derived parameters. */ /* Port derived parameters. */
/*===========================================================================*/ /*===========================================================================*/
@ -72,6 +81,15 @@
#define CH_CORE_VARIANT_NAME "Cortex-M1" #define CH_CORE_VARIANT_NAME "Cortex-M1"
#endif #endif
/**
* @brief Port-specific information string.
*/
#if !CORTEX_ALTERNATE_SWITCH || defined(__DOXYGEN__)
#define CH_PORT_INFO "Preemption through NMI"
#else
#define CH_PORT_INFO "Preemption through PendSV"
#endif
/*===========================================================================*/ /*===========================================================================*/
/* Port implementation part. */ /* Port implementation part. */
/*===========================================================================*/ /*===========================================================================*/

View File

@ -19,12 +19,11 @@
*/ */
/* /*
* Imports the Cortex-Mx parameters header and performs the same calculations * Imports the Cortex-Mx configuration headers.
* done in chcore.h.
*/ */
#include "cmparams.h" #define _FROM_ASM_
#include "chconf.h"
#define CORTEX_PRIORITY_MASK(n) ((n) << (8 - CORTEX_PRIORITY_BITS)) #include "chcore.h"
EXTCTX_SIZE EQU 32 EXTCTX_SIZE EQU 32
CONTEXT_OFFSET EQU 12 CONTEXT_OFFSET EQU 12
@ -78,6 +77,7 @@ _port_thread_start PROC
* The NMI vector is used for exception mode re-entering after a context * The NMI vector is used for exception mode re-entering after a context
* switch. * switch.
*/ */
#if !CORTEX_ALTERNATE_SWITCH
EXPORT NMIVector EXPORT NMIVector
NMIVector PROC NMIVector PROC
mrs r3, PSP mrs r3, PSP
@ -86,6 +86,22 @@ NMIVector PROC
cpsie i cpsie i
bx lr bx lr
ENDP ENDP
#endif
/*
* NMI vector.
* The NMI vector is used for exception mode re-entering after a context
* switch.
*/
#if CORTEX_ALTERNATE_SWITCH
EXPORT PendSVVector
PendSVVector PROC
mrs r3, PSP
adds r3, r3, #32
msr PSP, r3
bx lr
ENDP
#endif
/* /*
* Post-IRQ switch code. * Post-IRQ switch code.
@ -94,11 +110,17 @@ NMIVector PROC
EXPORT _port_switch_from_isr EXPORT _port_switch_from_isr
_port_switch_from_isr PROC _port_switch_from_isr PROC
bl chSchDoRescheduleI bl chSchDoRescheduleI
movs r3, #128
lsls r3, r3, #24
ldr r2, =SCB_ICSR ldr r2, =SCB_ICSR
movs r3, #128
#if CORTEX_ALTERNATE_SWITCH
lsls r3, r3, #20
str r3, [r2, #0] str r3, [r2, #0]
_waitnmi b _waitnmi cpsie i
#else
lsls r3, r3, #24
str r3, [r2, #0]
#endif
waithere b waithere
ENDP ENDP
/* /*