diff options
-rw-r--r-- | demos/ARM7-LPC214x-GCC/Makefile | 17 | ||||
-rw-r--r-- | demos/ARM7-LPC214x-GCC/Makefile.thumb | 24 | ||||
-rw-r--r-- | demos/ARM7-LPC214x-GCC/chcore.c | 38 | ||||
-rw-r--r-- | demos/ARM7-LPC214x-GCC/chcore2.s | 124 | ||||
-rw-r--r-- | demos/ARM7-LPC214x-GCC/crt0.s | 35 | ||||
-rw-r--r-- | readme.txt | 8 | ||||
-rw-r--r-- | test/test.c | 2 |
7 files changed, 166 insertions, 82 deletions
diff --git a/demos/ARM7-LPC214x-GCC/Makefile b/demos/ARM7-LPC214x-GCC/Makefile index b078b8f88..6c0750add 100644 --- a/demos/ARM7-LPC214x-GCC/Makefile +++ b/demos/ARM7-LPC214x-GCC/Makefile @@ -127,10 +127,19 @@ CPFLAGS = $(MCFLAGS) $(OPT) $(WARN) -Wa,-ahlms=$(<:.c=.lst) $(DEFS) LDFLAGS = $(MCFLAGS) -nostartfiles -T$(LDSCRIPT) -Wl,-Map=$(PROJECT).map,--cref,--no-warn-mismatch $(LIBDIR)
ODFLAGS = -x --syms
+# Thumb interwork enabled only if needed because it kills performance.
ifneq ($(TSRC),)
- ASFLAGS += -mthumb-interwork -D THUMB_INTERWORK
- CPFLAGS += -mthumb-interwork -D THUMB_INTERWORK
- LDFLAGS += -mthumb-interwork
+ ifneq ($(ASRC),)
+ # Both ARM and THUMB case
+ CPFLAGS += -mthumb-interwork -D THUMB
+ LDFLAGS += -mthumb-interwork
+ ASFLAGS += -mthumb-interwork -D THUMB
+ else
+ # Pure THUMB case, THUMB C code cannot be called by ARM asm code directly
+ CPFLAGS += -D THUMB
+ LDFLAGS += -mthumb
+ ASFLAGS += -mthumb-interwork -D THUMB -D PURE_THUMB
+ endif
endif
# Generate dependency information
@@ -148,7 +157,7 @@ $(AOBJS) : %.o : %.c $(TOBJS) : %.o : %.c
@echo
- $(CC) -c $(CPFLAGS) $(TOPT) -I . $(INCDIR) $< -o $@
+ $(CC) -c $(CPFLAGS) $(TOPT) -mthumb -I . $(INCDIR) $< -o $@
$(ASMOBJS) : %.o : %.s
@echo
diff --git a/demos/ARM7-LPC214x-GCC/Makefile.thumb b/demos/ARM7-LPC214x-GCC/Makefile.thumb index 8c6147f15..05a63460d 100644 --- a/demos/ARM7-LPC214x-GCC/Makefile.thumb +++ b/demos/ARM7-LPC214x-GCC/Makefile.thumb @@ -62,12 +62,13 @@ UDEFS = UADEFS =
# List ARM-mode C source files here
-ASRC = chcore.c
+ASRC =
# List THUMB-mode C sources here
# NOTE: If any module is compiled in thumb mode then -mthumb-interwork is
# enabled for all modules and that lowers performance.
-TSRC = ../../src/chinit.c ../../src/chdebug.c ../../src/chlists.c ../../src/chdelta.c \
+TSRC = chcore.c \
+ ../../src/chinit.c ../../src/chdebug.c ../../src/chlists.c ../../src/chdelta.c \
../../src/chschd.c ../../src/chthreads.c ../../src/chsem.c ../../src/chevents.c \
../../src/chmsg.c ../../src/chsleep.c ../../src/chqueues.c ../../src/chserial.c \
../../ports/ARM7-LPC214x/GCC/vic.c ../../ports/ARM7-LPC214x/GCC/lpc214x_serial.c \
@@ -91,14 +92,14 @@ ULIBS = AOPT =
# THUMB-specific options here
-TOPT = -mthumb -D THUMB
+TOPT = -mthumb
# Common options here
# NOTE: -ffixed-r7 is only needed if you enabled CH_CURRP_REGISTER_CACHE in
# chconf.h.
# NOTE: -falign-functions=16 may improve the performance, not always, but
# increases the code size.
-OPT = -O2 -ggdb -fomit-frame-pointer -fno-strict-aliasing
+OPT = -Os -ggdb -fomit-frame-pointer -fno-strict-aliasing
#OPT += -ffixed-r7
OPT += -falign-functions=16
@@ -125,10 +126,19 @@ CPFLAGS = $(MCFLAGS) $(OPT) $(WARN) -Wa,-ahlms=$(<:.c=.lst) $(DEFS) LDFLAGS = $(MCFLAGS) -nostartfiles -T$(LDSCRIPT) -Wl,-Map=$(PROJECT).map,--cref,--no-warn-mismatch $(LIBDIR)
ODFLAGS = -x --syms
+# Thumb interwork enabled only if needed because it kills performance.
ifneq ($(TSRC),)
- ASFLAGS += -mthumb-interwork -D THUMB_INTERWORK
- CPFLAGS += -mthumb-interwork -D THUMB_INTERWORK
- LDFLAGS += -mthumb-interwork
+ ifneq ($(ASRC),)
+ # Both ARM and THUMB case
+ CPFLAGS += -mthumb-interwork -D THUMB
+ LDFLAGS += -mthumb-interwork
+ ASFLAGS += -mthumb-interwork -D THUMB
+ else
+ # Pure THUMB case, THUMB C code cannot be called by ARM asm code directly
+ CPFLAGS += -D THUMB
+ LDFLAGS += -mthumb
+ ASFLAGS += -mthumb-interwork -D THUMB -D PURE_THUMB
+ endif
endif
# Generate dependency information
diff --git a/demos/ARM7-LPC214x-GCC/chcore.c b/demos/ARM7-LPC214x-GCC/chcore.c index bf157cf43..49d1d314f 100644 --- a/demos/ARM7-LPC214x-GCC/chcore.c +++ b/demos/ARM7-LPC214x-GCC/chcore.c @@ -159,49 +159,13 @@ void _IdleThread(void *p) { void chSysHalt(void) {
chSysLock();
- IO0SET = 0x80000C00;
+ IO0SET = 0x00000C00;
IO0CLR = 0x80000000;
while (TRUE)
;
}
/*
- * Undefined Instruction exception handler.
- * Yellow LED + RED LED 2.
- */
-void UndHandler(void) {
-
- IO0SET = 0x80000C00;
- IO0CLR = 0x80000800;
- while(TRUE)
- ;
-}
-
-/*
- * Prefetch exception handler.
- * Yellow LED + RED LED 1.
- */
-void PrefetchHandler(void) {
-
- IO0SET = 0x80000C00;
- IO0CLR = 0x80000400;
- while(TRUE)
- ;
-}
-
-/*
- * Abort exception handler.
- * Yellow LED + both RED LEDs.
- */
-void AbortHandler(void) {
-
- IO0SET = 0x80000C00;
- IO0CLR = 0x80000C00;
- while(TRUE)
- ;
-}
-
-/*
* Non-vectored IRQs handling here.
*/
void NonVectoredIrq(void) {
diff --git a/demos/ARM7-LPC214x-GCC/chcore2.s b/demos/ARM7-LPC214x-GCC/chcore2.s index e29c92f5e..f81a4eeb1 100644 --- a/demos/ARM7-LPC214x-GCC/chcore2.s +++ b/demos/ARM7-LPC214x-GCC/chcore2.s @@ -38,52 +38,72 @@ threadstart:
msr CPSR_c, #MODE_SYS
mov r0, r5
-/* blx r4*/
+#ifndef PURE_THUMB
mov lr, pc
bx r4
bl chThdExit
+#else
+ mov lr, pc
+ bx r4
+.code 16
+ ldr r4, =chThdExit
+ bx r4
+#endif
+
+.globl UndHandler
+UndHandler:
.globl SwiHandler
SwiHandler:
- b SwiHandler
+
+.globl PrefetchHandler
+PrefetchHandler:
+
+.globl AbortHandler
+AbortHandler:
.globl FiqHandler
FiqHandler:
- b FiqHandler
+#ifdef PURE_THUMB
+ ldr r0, =chSysHalt
+ bx r0
+#else
+ bl chSysHalt
+#endif
-#ifdef THUMB_INTERWORK
+#ifdef THUMB
.globl chSysLock
chSysLock:
- msr CPSR_c, #0x9F
- bx lr
+ msr CPSR_c, #0x9F
+ bx lr
.globl chSysUnlock
chSysUnlock:
- msr CPSR_c, #0x1F
- bx lr
+ msr CPSR_c, #0x1F
+ bx lr
#endif
.globl chSysSwitchI
chSysSwitchI:
#ifdef CH_CURRP_REGISTER_CACHE
- stmfd sp!, {r4, r5, r6, r8, r9, r10, r11, lr}
- str sp, [r0, #0]
- ldr sp, [r1, #0]
-#ifdef THUMB_INTERWORK
- ldmfd sp!, {r4, r5, r6, r8, r9, r10, r11, lr}
- bx lr
+ stmfd sp!, {r4, r5, r6, r8, r9, r10, r11, lr}
+ str sp, [r0, #0]
+ ldr sp, [r1, #0]
+#ifdef THUMB
+ ldmfd sp!, {r4, r5, r6, r8, r9, r10, r11, lr}
+ bx lr
#else
- ldmfd sp!, {r4, r5, r6, r8, r9, r10, r11, pc}
+ ldmfd sp!, {r4, r5, r6, r8, r9, r10, r11, pc}
#endif
#else
- stmfd sp!, {r4, r5, r6, r7, r8, r9, r10, r11, lr}
- str sp, [r0, #0]
- ldr sp, [r1, #0]
-#ifdef THUMB_INTERWORK
- ldmfd sp!, {r4, r5, r6, r7, r8, r9, r10, r11, lr}
- bx lr
+ stmfd sp!, {r4, r5, r6, r7, r8, r9, r10, r11, lr}
+ str sp, [r0, #0]
+ ldr sp, [r1, #0]
+#ifdef THUMB
+ ldmfd sp!, {r4, r5, r6, r7, r8, r9, r10, r11, lr}
+ bx lr
#else
- ldmfd sp!, {r4, r5, r6, r7, r8, r9, r10, r11, pc}
+ ldmfd sp!, {r4, r5, r6, r7, r8, r9, r10, r11, pc}
#endif
#endif /* CH_CURRP_REGISTER_CACHE */
@@ -115,28 +135,68 @@ chSysSwitchI: IrqHandler:
sub lr, lr, #4
stmfd sp!, {r0-r3, r12, lr}
+#ifdef PURE_THUMB
+ ldr r0, =NonVectoredIrq
+ mov lr, pc
+ bx r0
+.code 16
+ mov lr, pc
+ bx lr
+.code 32
+#else
bl NonVectoredIrq
+#endif
b IrqCommon
.globl T0IrqHandler
T0IrqHandler:
sub lr, lr, #4
stmfd sp!, {r0-r3, r12, lr}
+#ifdef PURE_THUMB
+ ldr r0, =Timer0Irq
+ mov lr, pc
+ bx r0
+.code 16
+ mov lr, pc
+ bx lr
+.code 32
+#else
bl Timer0Irq
+#endif
b IrqCommon
.globl UART0IrqHandler
UART0IrqHandler:
sub lr, lr, #4
stmfd sp!, {r0-r3, r12, lr}
+#ifdef PURE_THUMB
+ ldr r0, =UART0Irq
+ mov lr, pc
+ bx r0
+.code 16
+ mov lr, pc
+ bx lr
+.code 32
+#else
bl UART0Irq
+#endif
b IrqCommon
.globl UART1IrqHandler
UART1IrqHandler:
sub lr, lr, #4
stmfd sp!, {r0-r3, r12, lr}
+#ifdef PURE_THUMB
+ ldr r0, =UART1Irq
+ mov lr, pc
+ bx r0
+.code 16
+ mov lr, pc
+ bx lr
+.code 32
+#else
bl UART1Irq
+#endif
b IrqCommon
/*
@@ -144,7 +204,17 @@ UART1IrqHandler: * required.
*/
IrqCommon:
+#ifdef PURE_THUMB
+ ldr r0, =chSchRescRequiredI
+ mov lr, pc
+ bx r0
+.code 16
+ mov lr, pc
+ bx lr
+.code 32
+#else
bl chSchRescRequiredI
+#endif
cmp r0, #0 // Simply returns if a
ldmeqfd sp!, {r0-r3, r12, pc}^ // reschedule is not required.
@@ -159,7 +229,17 @@ IrqCommon: stmfd sp!, {r0, r1} // Push R0=SPSR, R1=LR_IRQ.
// Context switch.
+#ifdef PURE_THUMB
+ ldr r0, =chSchDoRescheduleI
+ mov lr, pc
+ bx r0
+.code 16
+ mov lr, pc
+ bx lr
+.code 32
+#else
bl chSchDoRescheduleI
+#endif
// Re-establish the IRQ conditions again.
ldmfd sp!, {r0, r1} // Pop R0=SPSR, R1=LR_IRQ.
diff --git a/demos/ARM7-LPC214x-GCC/crt0.s b/demos/ARM7-LPC214x-GCC/crt0.s index 9b413191b..7bf91e291 100644 --- a/demos/ARM7-LPC214x-GCC/crt0.s +++ b/demos/ARM7-LPC214x-GCC/crt0.s @@ -99,17 +99,8 @@ ResetHandler: /* System */
msr CPSR_c, #MODE_SYS | I_BIT | F_BIT
mov sp, r0
- ldr r1, =__sys_stack_size__
- sub r0, r0, r1
- /*
- * Check on allocated stacks size. This should never happen unless you
- * don't care to verify the map file after compiling your application.
- */
- ldr r1, =_bss_end
- cmp r0, r1
- bge ramsizeok
- bl chSysHalt
-ramsizeok:
+// ldr r1, =__sys_stack_size__
+// sub r0, r0, r1
/*
* Data initialization.
* NOTE: It assumes that the DATA size is a multiple of 4.
@@ -136,11 +127,33 @@ bssloop: /*
* Application-provided HW initialization routine.
*/
+#ifndef PURE_THUMB
bl hwinit
+#else
+ ldr r0, =hwinit
+ mov lr, pc
+ bx r0
+.code 16
+ mov lr, pc
+ bx lr
+.code 32
+#endif
/*
* main(0, NULL).
*/
mov r0, #0
mov r1, #0
+#ifndef PURE_THUMB
bl main
bl chSysHalt
+#else
+ ldr r2, =main
+ mov lr, pc
+ bx r2
+.code 16
+ mov lr, pc
+ bx lr
+.code 32
+ ldr r2, =chSysHalt
+ bx r2
+#endif
diff --git a/readme.txt b/readme.txt index 28b58a9df..5e05bb776 100644 --- a/readme.txt +++ b/readme.txt @@ -38,6 +38,14 @@ AVR-AT90CANx-GCC - Port on AVR AT90CAN128, not complete yet. *** Releases ***
*****************************************************************************
+*** 0.4.2 ***
+- Improved the THUMB mode: when all C sources are compiled in thumb mode then
+ the -mthumb-interworking option is not enabled in the makefile, this greatly
+ improves the performance and reduces the overall code size.
+ It is recommended to either use ARM mode or THUMB mode and not mix them
+ unless you know exactly what you are doing and understand the consequences.
+ Mixing is still supported anyway.
+
*** 0.4.1 ***
- Modified the initialization code in order to have a dedicated idle thread in
the system, now the main() function behaves like a normal thread after
diff --git a/test/test.c b/test/test.c index a40a059f3..fe0cb5df7 100644 --- a/test/test.c +++ b/test/test.c @@ -77,7 +77,7 @@ static void println(char *msgp) { t_msg Thread1(void *p) {
- chFDDPut(comp, *(BYTE8 *)p);
+// chFDDPut(comp, *(BYTE8 *)p);
return 0;
}
|