diff options
author | gdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4> | 2009-02-09 22:01:42 +0000 |
---|---|---|
committer | gdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4> | 2009-02-09 22:01:42 +0000 |
commit | c4c192b0273454e81cd9cb91441c747abaabf6ec (patch) | |
tree | b72d16b1d89e48c7a49e021a9cfd6b996e883efb | |
parent | d934612e314f638e07ea0ba8b233a30f4d7392c9 (diff) | |
download | ChibiOS-c4c192b0273454e81cd9cb91441c747abaabf6ec.tar.gz ChibiOS-c4c192b0273454e81cd9cb91441c747abaabf6ec.tar.bz2 ChibiOS-c4c192b0273454e81cd9cb91441c747abaabf6ec.zip |
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@750 35acf78f-673a-0410-8e92-d51de3d6d3f4
-rw-r--r-- | demos/ARM7-AT91SAM7X-GCC/board.c | 7 | ||||
-rw-r--r-- | demos/ARM7-AT91SAM7X-WEB-GCC/board.c | 7 | ||||
-rw-r--r-- | ports/ARM7-AT91SAM7X/vectors.s | 25 | ||||
-rw-r--r-- | ports/ARM7-LPC214x/vectors.s | 24 | ||||
-rw-r--r-- | ports/ARM7/crt0.s | 63 | ||||
-rw-r--r-- | ports/ARM7/port.dox | 49 | ||||
-rw-r--r-- | ports/ARMCM3/crt0.s | 13 | ||||
-rw-r--r-- | ports/ARMCM3/port.dox | 4 | ||||
-rw-r--r-- | readme.txt | 3 | ||||
-rw-r--r-- | todo.txt | 1 |
10 files changed, 148 insertions, 48 deletions
diff --git a/demos/ARM7-AT91SAM7X-GCC/board.c b/demos/ARM7-AT91SAM7X-GCC/board.c index ba64e335e..21e9665f2 100644 --- a/demos/ARM7-AT91SAM7X-GCC/board.c +++ b/demos/ARM7-AT91SAM7X-GCC/board.c @@ -24,7 +24,12 @@ #include <sam7x_serial.h>
-extern void FiqHandler(void);
+/*
+ * FIQ Handler, unused in this demo. + */
+__attribute__((interrupt("FIQ")))
+static void FiqHandler(void) {
+}
static CH_IRQ_HANDLER(SpuriousHandler) {
diff --git a/demos/ARM7-AT91SAM7X-WEB-GCC/board.c b/demos/ARM7-AT91SAM7X-WEB-GCC/board.c index 5f49016e0..8f9a45af4 100644 --- a/demos/ARM7-AT91SAM7X-WEB-GCC/board.c +++ b/demos/ARM7-AT91SAM7X-WEB-GCC/board.c @@ -25,7 +25,12 @@ #include <sam7x_serial.h>
#include <sam7x_emac.h>
-extern void FiqHandler(void);
+/*
+ * FIQ Handler, unused in this demo.
+ */
+__attribute__((interrupt("FIQ")))
+static void FiqHandler(void) {
+}
static CH_IRQ_HANDLER(SpuriousHandler) {
diff --git a/ports/ARM7-AT91SAM7X/vectors.s b/ports/ARM7-AT91SAM7X/vectors.s index be5a0ccf4..a16fa252d 100644 --- a/ports/ARM7-AT91SAM7X/vectors.s +++ b/ports/ARM7-AT91SAM7X/vectors.s @@ -34,7 +34,7 @@ _start: ldr pc, [pc,#-0xF20] /* AIC - AIC_FVR */
_reset:
- .word ResetHandler
+ .word ResetHandler /* In crt0.s */
_undefined:
.word UndHandler
_swi:
@@ -46,3 +46,26 @@ _abort: .word 0
.word 0
.word 0
+
+.text
+.code 32
+.balign 4
+
+/*
+ * Default exceptions handlers. The handlers are declared weak in order to be
+ * replaced by the real handling code. Everything is defaulted to an infinite
+ * loop.
+ */
+.weak UndHandler
+UndHandler:
+
+.weak SwiHandler
+SwiHandler:
+
+.weak PrefetchHandler
+PrefetchHandler:
+
+.weak AbortHandler
+AbortHandler:
+
+.loop: b .loop
diff --git a/ports/ARM7-LPC214x/vectors.s b/ports/ARM7-LPC214x/vectors.s index 59bc99d2c..016a2f1de 100644 --- a/ports/ARM7-LPC214x/vectors.s +++ b/ports/ARM7-LPC214x/vectors.s @@ -34,7 +34,7 @@ _start: ldr pc, _fiq
_reset:
- .word ResetHandler
+ .word ResetHandler /* In crt0.s */
_undefined:
.word UndHandler
_swi:
@@ -47,3 +47,25 @@ _fiq: .word FiqHandler
.word 0
.word 0
+
+/*
+ * Default exceptions handlers. The handlers are declared weak in order to be
+ * replaced by the real handling code. Everything is defaulted to an infinite
+ * loop.
+ */
+.weak UndHandler
+UndHandler:
+
+.weak SwiHandler
+SwiHandler:
+
+.weak PrefetchHandler
+PrefetchHandler:
+
+.weak AbortHandler
+AbortHandler:
+
+.weak FiqHandler
+FiqHandler:
+
+.loop: b .loop
diff --git a/ports/ARM7/crt0.s b/ports/ARM7/crt0.s index d066ee478..91d07935b 100644 --- a/ports/ARM7/crt0.s +++ b/ports/ARM7/crt0.s @@ -119,56 +119,33 @@ bssloop: /*
* Late initialization.
*/
-#ifndef THUMB_NO_INTERWORKING
+#ifdef THUMB_NO_INTERWORKING
+ add r0, pc, #1
+ bx r0
+.code 16
bl hwinit1
- /*
- * main(0, NULL).
- */
mov r0, #0
mov r1, r0
bl main
- bl port_halt
+ ldr r1, =MainExitHandler
+ bx r1
+.code 32
#else
- add r0, pc, #1
- bx r0
-.code 16
bl hwinit1
mov r0, #0
mov r1, r0
bl main
- bl port_halt
-.code 32
+ b MainExitHandler
#endif
/*
- * Default exceptions handlers. The handlers are declared weak in order to be
- * replaced by the real handling code.
+ * Default main function exit handler.
*/
-.weak UndHandler
-.globl UndHandler
-UndHandler:
-
-.weak SwiHandler
-.globl SwiHandler
-SwiHandler:
-
-.weak PrefetchHandler
-.globl PrefetchHandler
-PrefetchHandler:
-
-.weak AbortHandler
-.globl AbortHandler
-AbortHandler:
-
-.weak FiqHandler
-.globl FiqHandler
-FiqHandler:
+.weak MainExitHandler
+.globl MainExitHandler
+MainExitHandler:
-.loop: b .loop
-
-#ifdef THUMB_NO_INTERWORKING
-.code 16
-#endif
+.loop: b .loop
/*
* Default early initialization code. It is declared weak in order to be
@@ -176,11 +153,14 @@ FiqHandler: * Early initialization is performed just after reset before BSS and DATA
* segments initialization.
*/
-.global hwinit0
-.weak hwinit0
+#ifdef THUMB_NO_INTERWORKING
.thumb_func
+.code 16
+#endif
+.weak hwinit0
hwinit0:
bx lr
+.code 32
/*
* Default late initialization code. It is declared weak in order to be
@@ -188,11 +168,14 @@ hwinit0: * Late initialization is performed after BSS and DATA segments initialization
* and before invoking the main() function.
*/
-.global hwinit1
-.weak hwinit1
+#ifdef THUMB_NO_INTERWORKING
.thumb_func
+.code 16
+#endif
+.weak hwinit1
hwinit1:
bx lr
+.code 32
/** @endcond */
/** @} */
diff --git a/ports/ARM7/port.dox b/ports/ARM7/port.dox index 28ce34ef6..016d2aceb 100644 --- a/ports/ARM7/port.dox +++ b/ports/ARM7/port.dox @@ -138,3 +138,52 @@ * @file ports/ARM7/chcore.c Port related code.
*/
/** @} */
+
+/**
+ * @defgroup ARM7_STARTUP Startup Support
+ * @{
+ * @brief ARM7 startup code support.
+ * @details ChibiOS/RT provides its own generic startup file for the ARM7 port.
+ * Of course it is not mandatory to use it but care should be taken about the
+ * startup phase details.
+ *
+ * <h2>Startup Process</h2>
+ * The startup process, as implemented, is the following:
+ * -# Initialize the various stacks assigning them the sizes defined in the
+ * linker script (usually named @p ch.ld). Stack areas are allocated from
+ * the highest RAM location downward.
+ * -# The ARM state is switched to System with both IRQ and FIQ sources
+ * disabled.
+ * -# An early initialization routine @p hwinit0 is invoked, if the symbol not
+ * defined then an empty default routine is executed (weak symbol).
+ * -# DATA and BSS segments are initialized.
+ * -# A late initialization routine @p hwinit1 is invoked, if the symbol not
+ * defined then an empty default routine is executed (weak symbol).<br>
+ * This late initialization function is also the proper place for a
+ * @a bootloader, if your application requires one.
+ * -# The @p main() function is invoked with the parameters @p argc and @p argv
+ * set to zero.
+ * -# Should the @p main() function return a branch is performed to the weak
+ * symbol MainExitHandler. The default code is an endless empty loop.
+ * .
+ * <h2>Expected linker symbols</h2>
+ * The startup code starts at the symbol @p ResetHandler and expects the
+ * following symbols to be defined in the linker script:
+ * - @p __ram_end__ RAM end location +1.
+ * - @p __und_stack_size__ Undefined Instruction stack size.
+ * - @p __abt_stack_size__ Memory Abort stack size.
+ * - @p __fiq_stack_size__ FIQ service stack size.
+ * - @p __irq_stack_size__ IRQ service stack size.
+ * - @p __svc_stack_size__ SVC service stack size.
+ * - @p __sys_stack_size__ System/User stack size. This is the stack used
+ * by the @p main() function.
+ * - @p _textdata address of the data segment source read only data.
+ * - @p _data data segment start location.
+ * - @p _edata data segment end location +1.
+ * - @p _bss_start BSS start location.
+ * - @p _bss_end BSS end location +1.
+ * .
+ * @ingroup ARM7
+ * @file ports/ARM7/crt0.s Startup code.
+ */
+/** @} */
diff --git a/ports/ARMCM3/crt0.s b/ports/ARMCM3/crt0.s index 18c987f18..c98898646 100644 --- a/ports/ARMCM3/crt0.s +++ b/ports/ARMCM3/crt0.s @@ -86,11 +86,20 @@ bloop: isb /* Late initialization. */ bl hwinit1 - /* main(0, NULL). */ movs r0, #0 mov r1, r0 bl main - bl port_halt + b MainExitHandler + +/* + * Default main exit code, just a loop. + * It is a weak symbol, the application code can redefine the behavior. + */ +.thumb_func +.global MainExitHandler +.weak MainExitHandler +MainExitHandler: +.loop: b .loop /* * Default early initialization code. It is declared weak in order to be diff --git a/ports/ARMCM3/port.dox b/ports/ARMCM3/port.dox index e5ba84973..ba4111aed 100644 --- a/ports/ARMCM3/port.dox +++ b/ports/ARMCM3/port.dox @@ -83,7 +83,7 @@ * Usually there is no need to change this value, please refer to the
* Cortex-M3 technical reference manual for a detailed description.
* - @p BASEPRI_KERNEL, this is the @p BASEPRI value for the kernel lock code.
- * The default value is 0x10.<br>
+ * The default value is 0x40.<br>
* Code running at higher priority levels must not invoke any OS API.<br>
* Usually there is no need to change this value, please refer to the
* Cortex-M3 technical reference manual for a detailed description.
@@ -110,6 +110,6 @@ * @{
* @brief ARM Cortex-M3 NVIC support.
*
- * @ingroup ARMCM3_CORE
+ * @ingroup ARMCM3
*/
/** @} */
diff --git a/readme.txt b/readme.txt index fbd0eccec..00dbb7a2c 100644 --- a/readme.txt +++ b/readme.txt @@ -101,6 +101,9 @@ Win32-MinGW - ChibiOS/RT simulator and demo into a WIN32 process, The options are no mode a simple define but a define with an assigned
TRUE/FALSE value within an #ifndef block.
- NEW: Idle thread hook macro added to the configuration file.
+- NEW: Changed the ARM7 and Cortex-M3 startup files, now the action when
+ the main() function returns can be overridden by redefining the symbol
+ MainExitHandler.
- OPT: Improved ARM7 thumb port code, thanks to some GCC tricks involving
registers usage now the kernel is much smaller, faster and most OS APIs
use less RAM in stack frames (note, this is an ARM7 thumb mode specific
@@ -11,6 +11,7 @@ X lwIP TCP/IP stack integration. - Multiple heaps, disjoint heaps, heaps in heaps.
- Multiple debug levels.
- Stack guard pages.
+- Threads profiling option.
* Idle loop hook macro.
* Switch the configuration options to TRUE/FALSE rather than def/undef.
- Abstract I/O channels rather than just serial ports.
|