contiki/cpu/stm32w108
Benoît Thébaudeau 19fd7a3551 Use additive offsets
OR-ing an offset to a base address instead of adding it is dangerous
because it can only work if the base address is aligned enough for the
offset.

Moreover, if the base address or the offset has a value unknown at
compile time, then the assembly instructions dedicated to 'base +
offset' addressing on most CPUs can't be emitted by the compiler because
this would require the alignment of the base address against the offset
to be known in order to optimize 'base | offset' into 'base + offset'.
In that case, the compiler has to emit more instructions in order to
compute 'base | offset' on most CPUs, e.g. on ARM, which means larger
binary size and slower execution.

Hence, replace all occurrences of 'base | offset' with 'base + offset'.
This must become a coding rule.

Here are the results for the cc2538-demo example:
 - Compilation of uart_init():
    * before:
        REG(regs->base | UART_CC) = 0;
        200b78:	f446 637c 	orr.w	r3, r6, #4032	; 0xfc0
        200b7c:	f043 0308 	orr.w	r3, r3, #8
        200b80:	2200      	movs	r2, #0
        200b82:	601a      	str	r2, [r3, #0]

    * now:
        REG(regs->base + UART_CC) = 0;
        200b7a:	2300      	movs	r3, #0
        200b7c:	f8c4 3fc8 	str.w	r3, [r4, #4040]	; 0xfc8

 - Size of the .text section:
    * before:	0x4c7c
    * now:	0x4c28
    * saved:	84 bytes

Signed-off-by: Benoît Thébaudeau <benoit.thebaudeau.dev@gmail.com>
2015-03-28 17:28:15 +01:00
..
dev
e_stdio
hal Use additive offsets 2015-03-28 17:28:15 +01:00
lib
simplemac
small-printf
board-sensors.h
cfs-coffee-arch.c
cfs-coffee-arch.h
clock.c
elfloader-arch.c
gnu-stm32w108.ld
gnu-stm32w108CC.ld
gnu-stm32w108xB.ld
gnu.ld
iar-cfg-coffee.icf
iar-cfg.icf
leds-arch.c
Makefile.stm32w108
mtarch.h
rand.c
README.txt
rtimer-arch.c
rtimer-arch.h
slip-uart1.c
uip-arch.c
watchdog.c

Building instructions.

In order to build your applications you need to find out the right cpu revision for the board you are using.

Valid STM32W_CPUREV values are CC or xB

Examples:

The MB851RevD board has a cpu with code
stm32w 108CCU7
so CC is your STM32W_CPUREV value and the command is
make TARGET=mbxxx STM32W_CPUREV=CC ...

or

The MB851RevC board has a cpu with code
stm32w 108CBU6
so xB is your STM32W_CPUREV value.
make TARGET=mbxxx STM32W_CPUREV=xB ...


NOTE: if the last word is B you need to use x as wildcard.