As originally written, the TRANSLATE_SOURCES_EXC was incorrect. If
more than one build directory existed, "make translate"
(and make check-translate) would error.
I corrected the problem, commented it, and added a number of additional
exclude directives.
I reviewed the PR and should have caught this, but did not.
Having zero RGB pins may not have been caught, nor having a non-multiple-of-6
value. Generally, users will only have 6 RGB pins unless they are driving
multiple matrices in parallel. No existing breakouts exist to do this, and
there are probably not any efficient pinouts to be had anyway.
In #3482, @cwalther noted that, hypothetically, a zero byte allocation
could be made in the RGBMatrix constructor. Ensure that width is positive.
Height was already checked against the number of RGB pins if it was specified,
so zero is ruled out there as well.
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.
0 should actually indicate a "match everything" filter which you otherwise
couldn't indicate with any single Match object, and an
all-address-bits-set number should indicate a "match single address"
filter. Use an optional/default None argument to do the job.
This already begins obscuring things, because now there are two sets of
shared-module functions for manipulating the same structure, e.g.,
common_hal_canio_remote_transmission_request_get_id and
common_hal_canio_message_get_id