summaryrefslogtreecommitdiff
path: root/ports/mimxrt10xx
diff options
context:
space:
mode:
authorJeff Epler <jepler@gmail.com>2020-09-24 11:20:32 -0500
committerJeff Epler <jepler@gmail.com>2020-09-28 18:55:56 -0500
commit726dcdb60aa84b5070e5484a19e896abdaffeb93 (patch)
tree24cb3b01a1805353dd8a27335faad09a917df60a /ports/mimxrt10xx
parent6bfcb01ee79d49f470a1a8ca5e693ba92fadf307 (diff)
Add some NORETURN attributes
I have a function where it should be impossible to reach the end, so I put in a safe-mode reset at the bottom: ``` int find_unused_slot(void) { // precondition: you already verified that a slot was available for (int i=0; i<NUM_SLOTS; i++) { if( slot_free(i)) { return i; } } safe_mode_reset(MICROPY_FATAL_ERROR); } ``` However, the compiler still gave a diagnostic, because safe_mode_reset was not declared NORETURN. So I started by teaching the compiler that reset_into_safe_mode never returned. This leads at least one level deeper due to reset_cpu needing to be a NORETURN function. Each port is a little different in this area. I also marked reset_to_bootloader as NORETURN. Additional notes: * stm32's reset_to_bootloader was not implemented, but now does a bare reset. Most stm32s are not fitted with uf2 bootloaders anyway. * ditto cxd56 * esp32s2 did not implement reset_cpu at all. I used esp_restart(). (not tested) * litex did not implement reset_cpu at all. I used reboot_ctrl_write. But notably this is what reset_to_bootloader already did, so one or the other must be incorrect (not tested). reboot_ctrl_write cannot be declared NORETURN, as it returns unless the special value 0xac is written), so a new unreachable forever-loop is added. * cxd56's reset is via a boardctl() call which can't generically be declared NORETURN, so a new unreacahble "for(;;)" forever-loop is added. * In several places, NVIC_SystemReset is redeclared with NORETURN applied. This is accepted just fine by gcc. I chose this as preferable to editing the multiple copies of CMSIS headers where it is normally declared. * the stub safe_mode reset simply aborts. This is used in mpy-cross.
Diffstat (limited to 'ports/mimxrt10xx')
-rw-r--r--ports/mimxrt10xx/reset.h4
1 files changed, 2 insertions, 2 deletions
diff --git a/ports/mimxrt10xx/reset.h b/ports/mimxrt10xx/reset.h
index dc3106cf0..c7569202c 100644
--- a/ports/mimxrt10xx/reset.h
+++ b/ports/mimxrt10xx/reset.h
@@ -34,8 +34,8 @@
#define DBL_TAP_MAGIC 0xf01669ef // Randomly selected, adjusted to have first and last bit set
#define DBL_TAP_MAGIC_QUICK_BOOT 0xf02669ef
-void reset_to_bootloader(void);
-void reset(void);
+void reset_to_bootloader(void) NORETURN;
+void reset(void) NORETURN;
bool bootloader_available(void);
#endif // MICROPY_INCLUDED_MIMXRT10XX_RESET_H