mirror of
https://github.com/oliverschmidt/contiki.git
synced 2024-08-15 00:29:02 +00:00
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> |
||
---|---|---|
.. | ||
dev | ||
e_stdio | ||
hal | ||
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.