-
-
Notifications
You must be signed in to change notification settings - Fork 8.7k
Description
Port, board and/or hardware
all
MicroPython version
1.27+
Reproduction
For long-running processes handled by user C modules (eg: busy wait on e-ink update) I've been using the pattern:
extern void mp_handle_pending_internal(bool);
mp_handle_pending(true);I tried to build against 1.27 today, and ran into this build error:
modules/c/ssd1680/ssd1680.cpp.o: in function `pimoroni::SSD1680::busy_wait()':
modules/c/ssd1680/ssd1680.cpp:54:(.text._ZN8pimoroni7SSD16809busy_waitEv+0x10): undefined reference to `mp_handle_pending'
This looks like it was introduced by c57aebf
This PR seems to make the assumption that mp_handle_pending is only ever called inline in runtime.h, or in code that uses:
#include "runtime.h"
mp_handle_pending(true);This assumption doesn't seem to hold true, for example the same "undefined reference" error should occur if an attempt is made to call "MICROPY_EVENT_POLL_HOOK" from Zephyr code:
micropython/ports/zephyr/mpconfigport.h
Lines 171 to 172 in 26c1696
| extern void mp_handle_pending(bool); \ | |
| mp_handle_pending(true); \ |
But I guess runtime.h is implicitly available here? In any case making the "extern" line redundant and this pattern should probably be updated where it occurs.
Either way the inline wrapper to preserve the old mp_handle_pending behaviour does not cover all possible cases, causing a break in my code from 1.26 to 1.27.
I expect breakage, though, so I'd propose the implicit "example" uses in the MicroPython codebase (there are a few things like "MICROPY_EVENT_POLL_HOOK") are updated and this issue should, with any luck, steer any future encounters (I'll probably forget and run into this again) toward the correct usage.
Expected behaviour
Observed behaviour
Additional Information
No, I've provided everything above.
Code of Conduct
Yes, I agree