summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien George <damien@micropython.org>2020-10-29 17:34:38 +1100
committerDamien George <damien@micropython.org>2020-10-29 23:35:36 +1100
commit97960dc7deb7a0e691fca5944402cd03386b744b (patch)
tree7aa2afd2110a1020243378b2398d2ecc38182e92
parentdf3b466d6c44af494e404e54861b4c25cf4d54c8 (diff)
stm32: Support C++ code and user C modules written in C++.
Also build user C modules as part of the stm32 CI. Signed-off-by: Damien George <damien@micropython.org>
-rw-r--r--.travis.yml2
-rw-r--r--ports/stm32/Makefile13
-rw-r--r--ports/stm32/boards/common_extratext_data_in_flash.ld8
-rw-r--r--ports/stm32/boards/common_extratext_data_in_flash_app.ld8
-rw-r--r--ports/stm32/boards/common_extratext_data_in_flash_text.ld8
-rw-r--r--ports/stm32/main.c4
6 files changed, 41 insertions, 2 deletions
diff --git a/.travis.yml b/.travis.yml
index 3b399804e..14595ddeb 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -99,7 +99,7 @@ jobs:
- make ${MAKEOPTS} -C ports/stm32 submodules
- git submodule update --init lib/btstack
- make ${MAKEOPTS} -C ports/stm32 BOARD=NUCLEO_F091RC
- - make ${MAKEOPTS} -C ports/stm32 BOARD=PYBV11 MICROPY_PY_WIZNET5K=5200 MICROPY_PY_CC3K=1
+ - make ${MAKEOPTS} -C ports/stm32 BOARD=PYBV11 MICROPY_PY_WIZNET5K=5200 MICROPY_PY_CC3K=1 USER_C_MODULES=../../examples/usercmodule CFLAGS_EXTRA="-DMODULE_CEXAMPLE_ENABLED=1 -DMODULE_CPPEXAMPLE_ENABLED=1"
- make ${MAKEOPTS} -C ports/stm32 BOARD=PYBD_SF2
- make ${MAKEOPTS} -C ports/stm32 BOARD=PYBD_SF6 NANBOX=1 MICROPY_BLUETOOTH_NIMBLE=0 MICROPY_BLUETOOTH_BTSTACK=1
- make ${MAKEOPTS} -C ports/stm32 BOARD=NUCLEO_H743ZI CFLAGS_EXTRA='-DMICROPY_PY_THREAD=1'
diff --git a/ports/stm32/Makefile b/ports/stm32/Makefile
index cf3a589ca..61da9cc98 100644
--- a/ports/stm32/Makefile
+++ b/ports/stm32/Makefile
@@ -138,6 +138,13 @@ else
COPT += -Os -DNDEBUG
endif
+# Flags for optional C++ source code
+CXXFLAGS += $(filter-out -Wmissing-prototypes -Wold-style-definition -std=gnu99,$(CFLAGS))
+CXXFLAGS += $(CXXFLAGS_MOD)
+ifneq ($(SRC_CXX)$(SRC_MOD_CXX),)
+LDFLAGS += -L$(dir $(shell $(CXX) $(CXXFLAGS) -print-file-name=libstdc++.a))
+endif
+
# Options for mpy-cross
MPY_CROSS_FLAGS += -march=armv7m
@@ -330,6 +337,9 @@ SRC_C += \
adc.c \
$(wildcard $(BOARD_DIR)/*.c)
+SRC_CXX += \
+ $(SRC_MOD_CXX)
+
SRC_O += \
$(STARTUP_FILE) \
$(SYSTEM_FILE)
@@ -511,6 +521,7 @@ OBJ += $(LIBM_O)
OBJ += $(addprefix $(BUILD)/, $(EXTMOD_SRC_C:.c=.o))
OBJ += $(addprefix $(BUILD)/, $(DRIVERS_SRC_C:.c=.o))
OBJ += $(addprefix $(BUILD)/, $(SRC_C:.c=.o))
+OBJ += $(addprefix $(BUILD)/, $(SRC_CXX:.cpp=.o))
OBJ += $(addprefix $(BUILD)/, $(SRC_O))
OBJ += $(addprefix $(BUILD)/, $(SRC_HAL:.c=.o))
OBJ += $(addprefix $(BUILD)/, $(SRC_USBDEV:.c=.o))
@@ -644,7 +655,7 @@ GEN_CDCINF_FILE = $(HEADER_BUILD)/pybcdc.inf
GEN_CDCINF_HEADER = $(HEADER_BUILD)/pybcdc_inf.h
# List of sources for qstr extraction
-SRC_QSTR += $(SRC_C) $(SRC_MOD) $(LIB_SRC_C) $(EXTMOD_SRC_C)
+SRC_QSTR += $(SRC_C) $(SRC_CXX) $(SRC_MOD) $(LIB_SRC_C) $(EXTMOD_SRC_C)
# Append any auto-generated sources that are needed by sources listed in
# SRC_QSTR
SRC_QSTR_AUTO_DEPS += $(GEN_CDCINF_HEADER)
diff --git a/ports/stm32/boards/common_extratext_data_in_flash.ld b/ports/stm32/boards/common_extratext_data_in_flash.ld
index e5f25a3c6..eb9b86f49 100644
--- a/ports/stm32/boards/common_extratext_data_in_flash.ld
+++ b/ports/stm32/boards/common_extratext_data_in_flash.ld
@@ -1,5 +1,13 @@
/* This linker script fragment is intended to be included in SECTIONS. */
+/* For C++ exception handling */
+.ARM :
+{
+ __exidx_start = .;
+ *(.ARM.exidx*)
+ __exidx_end = .;
+} >FLASH
+
/* Used by the start-up code to initialise data */
_sidata = LOADADDR(.data);
diff --git a/ports/stm32/boards/common_extratext_data_in_flash_app.ld b/ports/stm32/boards/common_extratext_data_in_flash_app.ld
index 8230f8f9b..aba6bf57c 100644
--- a/ports/stm32/boards/common_extratext_data_in_flash_app.ld
+++ b/ports/stm32/boards/common_extratext_data_in_flash_app.ld
@@ -1,5 +1,13 @@
/* This linker script fragment is intended to be included in SECTIONS. */
+/* For C++ exception handling */
+.ARM :
+{
+ __exidx_start = .;
+ *(.ARM.exidx*)
+ __exidx_end = .;
+} >FLASH_APP
+
/* Used by the start-up code to initialise data */
_sidata = LOADADDR(.data);
diff --git a/ports/stm32/boards/common_extratext_data_in_flash_text.ld b/ports/stm32/boards/common_extratext_data_in_flash_text.ld
index 526d2519f..5a29e4730 100644
--- a/ports/stm32/boards/common_extratext_data_in_flash_text.ld
+++ b/ports/stm32/boards/common_extratext_data_in_flash_text.ld
@@ -1,5 +1,13 @@
/* This linker script fragment is intended to be included in SECTIONS. */
+/* For C++ exception handling */
+.ARM :
+{
+ __exidx_start = .;
+ *(.ARM.exidx*)
+ __exidx_end = .;
+} >FLASH_TEXT
+
/* Used by the start-up code to initialise data */
_sidata = LOADADDR(.data);
diff --git a/ports/stm32/main.c b/ports/stm32/main.c
index b5dbfa50f..f19dac0e7 100644
--- a/ports/stm32/main.c
+++ b/ports/stm32/main.c
@@ -133,6 +133,10 @@ void nlr_jump_fail(void *val) {
__fatal_error("");
}
+void abort(void) {
+ __fatal_error("abort");
+}
+
#ifndef NDEBUG
void MP_WEAK __assert_func(const char *file, int line, const char *func, const char *expr) {
(void)func;