summaryrefslogtreecommitdiff
path: root/src/stmf0/stm32f0.h
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2016-12-17 20:58:36 -0800
committerKeith Packard <keithp@keithp.com>2016-12-17 21:04:33 -0800
commit89ecc32b90565ace078c4a84d4406a4d1f86821a (patch)
tree3b32f1d922380b3dfd25db75552a30dc84c24d41 /src/stmf0/stm32f0.h
parentf650211f9e99e1d3d0ae13ae559dd1c082f71545 (diff)
altos/arm: Align data so that gcc 5.4 doesn't do byte-accesses. Add -Wcast-align
Gcc 5.4.1 tracks alignment of data through assignments, so that a uint32_t pointer which comes from byte-aligned uint8_t data: extern uint8_t foo[]; uint32_t *q = (void *) foo; Fetches and stores through this pointer are done bytewise. This is slow (meh), but if q references a device register, things to bad very quickly. This patch works around this bug in the compiler by adding __attribute__((aligned(4))) tags to some variables, or changing them from uint8_t to uint32_t. Places doing this will now be caught as I've added -Wcast-align to the compiler flags. That required adding (void *) casts, after the relevant code was checked to make sure the compiler could tell that the addresses were aligned. Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/stmf0/stm32f0.h')
-rw-r--r--src/stmf0/stm32f0.h2
1 files changed, 1 insertions, 1 deletions
diff --git a/src/stmf0/stm32f0.h b/src/stmf0/stm32f0.h
index 182cd963..1c33f020 100644
--- a/src/stmf0/stm32f0.h
+++ b/src/stmf0/stm32f0.h
@@ -1996,7 +1996,7 @@ union stm_usb_bdt {
#define STM_USB_BDT_SIZE 8
-extern uint8_t stm_usb_sram[];
+extern uint8_t stm_usb_sram[] __attribute__((aligned(4)));
struct stm_exti {
vuint32_t imr;