Commit Graph

15924 Commits

Author SHA1 Message Date
Andrew Leech
2475a52f5c mimxrt/mphalport: Refactor to use shared TinyUSB CDC functions.
Signed-off-by: Andrew Leech <andrew@alelec.net>
2024-05-31 19:47:25 +10:00
Andrew Leech
1eaa562fdf rp2/mphalport: Refactor to use shared TinyUSB CDC functions.
Signed-off-by: Andrew Leech <andrew@alelec.net>
2024-05-31 19:47:05 +10:00
Andrew Leech
c98789a6d8 shared/tinyusb: Add common CDC TX/RX functions.
There are a few TinyUSB CDC functions used for stdio that are currently
replicated across a number of ports.  Not surprisingly in a couple of cases
these have started to diverge slightly, with additional features added to
one of them.

This commit consolidates a couple of key shared functions used directly by
TinyUSB based ports, and makes those functions available to all.

Signed-off-by: Andrew Leech <andrew@alelec.net>
2024-05-31 19:45:42 +10:00
Alessandro Gatti
3613ad9624 lib/libm: Do not force floating point type size evaluation.
Since C99, `FLT_EVAL_METHOD` should be left for the compiler/libc to
define.  Its redefinition breaks compilation with picolibc as the
target's libc, since it defines said symbol in math.h before the libm
define is evaluated by the compiler.

In its place, there is a check to make sure floating point type sizes
are what are expected to be, triggering a compilation error if those
assumptions are no longer valid.

Co-authored-by: Angus Gratton <angus@redyak.com.au>
Signed-off-by: Alessandro Gatti <a.gatti@frob.it>
2024-05-31 17:04:24 +10:00
Angus Gratton
3af006efb3 rp2: Support calling pendsv_suspend/resume from core 1.
Previously, this was subject to races incrementing/decrementing
the counter variable pendsv_lock.

Technically, all that's needed here would be to make pendsv_lock an atomic
counter.

This implementation fulfils a stronger guarantee: it also provides mutual
exclusion for the core which calls pendsv_suspend(). This is because the
current use of pendsv_suspend/resume in MicroPython is to ensure exclusive
access to softtimer data structures, and this does require mutual
exclusion.

The conceptually cleaner implementation would split the mutual exclusion
part out into a softtimer-specific spinlock, but this increases the
complexity and doesn't seem like it makes for a better implementation in
the long run.

This work was funded through GitHub Sponsors.

Signed-off-by: Angus Gratton <angus@redyak.com.au>
2024-05-31 16:46:27 +10:00
Angus Gratton
83e82c5ad3 rp2: Refactor to not use pico-sdk alarm pool functions for sleeping.
The best_effort_wfe_or_timeout() and sleep_us() pico-sdk functions use the
pico-sdk alarm pool internally, and that has a bug.

Some usages inside pico-sdk (notably multicore_lockout_start_blocking())
will still end up calling best_effort_wfe_or_timeout(), although usually
with "end_of_time" as the timeout value so it should avoid any alarm pool
race conditions.

This work was funded through GitHub Sponsors.

Signed-off-by: Angus Gratton <angus@redyak.com.au>
2024-05-31 16:44:09 +10:00
Angus Gratton
74fb42aa82 rp2: Refactor soft timer to use hardware timer alarm.
Progress towards removing pico-sdk alarm pool, due to a known issue.

This work was funded through GitHub Sponsors.

Signed-off-by: Angus Gratton <angus@redyak.com.au>
2024-05-31 16:43:52 +10:00
Damien George
2926001b60 all: Bump version to 1.24.0-preview.
Signed-off-by: Damien George <damien@micropython.org>
2024-05-31 16:35:27 +10:00
Damien George
a61c446c0b all: Bump version to 1.23.0.
Signed-off-by: Damien George <damien@micropython.org>
v1.23.0
2024-05-31 14:19:55 +10:00
Damien George
30a9ccf4ca tests/basics: Move str/bytes tests that give SyntaxWarning to sep file.
In CPython 3.12 these invalid str/bytes/fstring escapes will issue a
SyntaxWarning, and so differ to MicroPython.

Signed-off-by: Damien George <damien@micropython.org>
2024-05-28 10:58:37 +10:00
Damien George
dd4767a7d1 tests/basics: Add .exp file for slice_op test.
CPython 3.12 implemented hashing for slices, so now differs to MicroPython.

Signed-off-by: Damien George <damien@micropython.org>
2024-05-28 10:50:57 +10:00
Damien George
ad6750b22e tests/float: Use "not" instead of ~ to invert bool value.
Otherwise CPython gives a deprecation warning.

This test is not actually testing inversion of bools, rather that bit of
the test is used to compute the pass/fail result.

Signed-off-by: Damien George <damien@micropython.org>
2024-05-28 10:49:22 +10:00
Damien George
5f6e689124 LICENSE,docs: Update copyright year range to include 2024.
Signed-off-by: Damien George <damien@micropython.org>
2024-05-27 23:39:16 +10:00
Damien George
8a8c65f309 lib/micropython-lib: Update submodule to latest.
This brings in:
- fixes to: aiohttp, tarfile, lora, gzip
- fixes and improvements to aioble
- deprecation of cbor2 decoder and encoder modules
- new usb package
- new pyusb package

Signed-off-by: Damien George <damien@micropython.org>
2024-05-27 16:27:41 +10:00
Matt Trentini
03cf4d4980 rp2/boards/W5500_EVB_PICO: Update incorrect url in board.json.
Fixes issue #15122.

Signed-off-by: Matt Trentini <matt.trentini@gmail.com>
2024-05-27 16:14:20 +10:00
Damien George
a34b5d1b79 tests/net_inet/tls_text_errors.py: Tweak test for newer CPython version.
Signed-off-by: Damien George <damien@micropython.org>
2024-05-27 13:56:55 +10:00
Damien George
e1111d873a tests/net_hosted/ssl_verify_callback.py: Make exp match actual output.
The `cert` argument passed to the verify callback is actually a memoryview.
And the `depth` argument seems to start at 1 for the tested URL.

Signed-off-by: Damien George <damien@micropython.org>
2024-05-27 13:56:55 +10:00
Damien George
1a2fdcac0d tests/basics: Split out generator.throw tests that pass multiple args.
The three-argument form of `.throw()` is deprecated since CPython 3.12.  So
split out into separate tests (with .exp files) the parts of the generator
tests that test more than one argument.

Signed-off-by: Damien George <damien@micropython.org>
2024-05-27 13:56:55 +10:00
Damien George
2e852522b1 tests/extmod: Add .exp test files for asyncio.get_event_loop tests.
And use `asyncio.new_event_loop()` where possible.  This change is needed
because CPython 3.12 deprecated the `get_event_loop()` function.

Signed-off-by: Damien George <damien@micropython.org>
2024-05-27 13:56:55 +10:00
Damien George
1ea06b99d8 tests/extmod: Fix regex strings to be of r"" type.
Otherwise escape characters like \s and \W won't work correctly.

Signed-off-by: Damien George <damien@micropython.org>
2024-05-27 13:56:55 +10:00
Damien George
c0a25a69eb extmod/modos: Only sync FAT filesystems using disk_ioctl.
Eventually this needs to be made a generic call to the underlying VFS.  But
for now this prevents `disk_ioctl()` crashing on non-FAT filesystems.

Signed-off-by: Damien George <damien@micropython.org>
2024-05-27 12:44:02 +10:00
Damien George
fbf811474a tools/ci.sh: Simplify selection of natmod tests to run.
The `run-natmodtests.py` script now properly excludes tests that don't use
the corresponding native module.

Signed-off-by: Damien George <damien@micropython.org>
2024-05-27 11:45:59 +10:00
Damien George
5d07d0c7b0 tests/run-natmodtests.py: Fix search for supported native tests.
Signed-off-by: Damien George <damien@micropython.org>
2024-05-27 11:44:54 +10:00
Damien George
df41913782 examples/natmod/btree: Make btree.open use mp_arg_parse_all for kwargs.
Python code is no longer needed to implement keyword arguments in
`btree.open()`, it can now be done in C.

Signed-off-by: Damien George <damien@micropython.org>
2024-05-24 13:50:57 +10:00
Brian Pugh
c624a5c0c4 py/dynruntime: Export mp_load_method_maybe and mp_arg_parse_all* funcs.
Also define `mp_type_bytearray`.  These all help to write native modules.

Signed-off-by: Brian Pugh <bnp117@gmail.com>
Signed-off-by: Damien George <damien@micropython.org>
2024-05-24 13:50:57 +10:00
Jared Hancock
a196468c47 esp32: Add support for TCP_NODELAY.
This adds support for the TCP_NODELAY socket option for lwIP sockets.
Generally, TCP sockets use the Nagle algorithm and will send data when
an ACK is received or after all previously-sent data has already been
ACKed.

If the TCP_NODELAY option is set for a socket, every write to the socket
will trigger a packet to be sent.

Signed-off-by: Jared Hancock <jared@greezybacon.me>
2024-05-23 20:47:17 -05:00
Jared Hancock
b1e9602702 extmod/modlwip: Use Nagle algorithm and add support for TCP_NODELAY.
This adds support to use the Nagle algorithm implemented already in lwIP to
determine when TCP data should be sent.

As currently written, MicroPython will only create packets if there is <25%
remaining in the send buffer.  Using it, sending a small message of ~50
bytes will not trigger output of the message on the network.  So it will
remained queued until the TCP interval timer expires, which can be up to
500ms.

Using Nagle's algorithm, the first write, no matter how small, will
generate a packet on the network.  And sending lots of data still makes
efficient use of the link.

In addition to this, an application designer may choose to always create
packets for every write by setting the TCP_NODELAY socket option.  That's
also implemented in this commit.
2024-05-23 22:25:06 +10:00
Damien George
d532f960a4 examples/natmod/features4: Create custom FactorialError as exc example.
Signed-off-by: Damien George <damien@micropython.org>
2024-05-23 14:20:20 +10:00
Damien George
482292cc66 py/dynruntime: Add mp_obj_exception_init function to create C exception.
Signed-off-by: Damien George <damien@micropython.org>
2024-05-23 14:20:20 +10:00
Damien George
a919ce26d3 webassembly/modjsffi: Add mem_info function to get detailed stats.
This allows querying the GC heap size/used/free values, as well as the
number of alive JsProxy and PyProxy objects, referenced by proxy_c_ref and
proxy_js_ref.

Signed-off-by: Damien George <damien@micropython.org>
2024-05-22 17:37:37 +10:00
Damien George
57a9ffa632 webassembly: Register PyProxy objects for JS-side finalisation.
And clear the corresponding `proxy_c_ref[c_ref]` entry when the finaliser
runs.  This then allows the C side to (eventually) garbage collect the
corresponding Python object.

Signed-off-by: Damien George <damien@micropython.org>
2024-05-22 17:37:37 +10:00
Damien George
5c7a414574 webassembly: Add C-level finaliser to JsProxy object.
And clear the corresponding `proxy_js_ref[js_ref]` entry when the finaliser
runs.  This then allows the JavaScript side to (eventually) free the
corresponding JavaScript object.

Signed-off-by: Damien George <damien@micropython.org>
2024-05-22 17:06:18 +10:00
Damien George
c0ca4bb85f webassembly: Set GC threshold and do top-level GC collect when possible.
Signed-off-by: Damien George <damien@micropython.org>
2024-05-22 16:32:47 +10:00
Damien George
cdaf2de80c webassembly: Track the current depth of calls to external C functions.
So it's possible to know when an external C function is being called at the
top-level, eg by JavaScript without any intermediate C->JS->C calls.

Signed-off-by: Damien George <damien@micropython.org>
2024-05-22 16:29:31 +10:00
Damien George
ed2885facb webassembly/proxy_c: Don't return value of a void function.
Signed-off-by: Damien George <damien@micropython.org>
2024-05-21 15:14:14 +10:00
Damien George
d7f031397d webassembly/objjsproxy: Make jsproxy_it keep ref to jsproxy.
So that there is a one-to-one correspondence between js_ref and
JsProxy objects.

Signed-off-by: Damien George <damien@micropython.org>
2024-05-21 15:13:55 +10:00
Damien George
cfd5a8ea3a webassembly/proxy_c: Return undefined if dict lookup failed on JS side.
Instead of raising KeyError.  These semantics match JavaScript behaviour
and make it much more seamless to pass Python dicts through to JavaScript
as though they were JavaScript {} objects.

Signed-off-by: Damien George <damien@micropython.org>
2024-05-16 12:49:42 +10:00
Damien George
aa2e3880c1 webassembly/proxy_js: Create a special "undefined" type for Python.
This adds a new undefined singleton to Python, that corresponds directly to
JavaScript `undefined`.  It's accessible via `js.undefined`.

Signed-off-by: Damien George <damien@micropython.org>
2024-05-16 12:49:10 +10:00
Damien George
0148bbb495 webassembly/proxy_js: Revert back to converting Py None to JS null.
This reverts part of commit fa23e4b093, to
make it so that Python `None` converts to JavaScript `null` (and JavaScript
`null` already converts to Python `None`).  That's consistent with how the
`json` module converts these values back and forth.

Signed-off-by: Damien George <damien@micropython.org>
2024-05-16 12:44:43 +10:00
Daniël van de Giessen
c10a74b162 esp32/panichandler: Print support information on panic.
When a fatal error occurs it's important to know which precise version it
occurred on in order to be able to decode the crash dump information such
as the backtrace.

By wrapping around the built-in IDF panic handler we can print some extra
information whenever a fatal error occurs.  The message links to a new wiki
page which contains additional information on how to debug ESP32 issues,
and links to the bug reporting issue template.

Signed-off-by: Daniël van de Giessen <daniel@dvdgiessen.nl>
2024-05-16 12:25:45 +10:00
Angus Gratton
a0d4fdcce0 stm32/pyb_can: Fix STM32G4 FDCAN source clock frequency.
Fixes automatic baudrate calculation results.

Default clock source on this SoC is HSE not PCLK1.  We could fix this by
switching to PCLK1 instead, but two extra complications:

- PCLK1 on this board is a 42.5MHz and the Pyboard CAN sample_point
  calculation requires an exact match, which is harder to hit with this
  source frequency.

- Would be a breaking change for any existing Python code on this board,
  i.e. specifying brp, bs1, bs2 to initialise CAN.

In the future it might be worth looking switching to the PLL source on this
SoC instead, as this is a much higher frequency that would give higher
quality BRS bitrate matches (probably too high without using the second
divider going into the CAN peripheral though, so more code changes needed
also).

This work was funded through GitHub Sponsors.

Signed-off-by: Angus Gratton <angus@redyak.com.au>
2024-05-15 15:32:41 +10:00
Angus Gratton
47ae739409 examples/usb: Add README that points out the alternative usb modules.
If someone starts from this directory then they won't know they exist,
otherwise.

Signed-off-by: Angus Gratton <angus@redyak.com.au>
2024-05-15 15:20:40 +10:00
Damien George
abd1f28bc2 docs/library/asyncio: Document that ThreadSafeFlag now works on unix.
ThreadSafeFlag works on the unix port since commit
df08c38c28.

Signed-off-by: Damien George <damien@micropython.org>
2024-05-15 14:13:30 +10:00
Olivier Lenoir
e816b49c44 docs/reference: Document how to mip install packages from GitLab.
Signed-off-by: Olivier Lenoir <olivier.len02@gmail.com>
2024-05-15 13:35:27 +10:00
Olivier Lenoir
85c85e8f0d tools/mpremote: Add support to mip install from GitLab.
Changes are:
- main.py: Add gitlab:org/repo, gitlab:org/repo@branch.
- mip.py: Implement install from GitLab.
- README.md: Add mip install gitlab:org/repo@branch example.

Signed-off-by: Olivier Lenoir <olivier.len02@gmail.com>
2024-05-15 13:32:02 +10:00
Damien George
025d10a702 tests/micropython/import_mpy_invalid.py: Skip if target cant import mpy.
Signed-off-by: Damien George <damien@micropython.org>
2024-05-14 16:02:30 +10:00
Damien George
154d602b6e webassembly/mpconfigport: Enable importing of .mpy files.
Signed-off-by: Damien George <damien@micropython.org>
2024-05-14 15:19:27 +10:00
Damien George
fa23e4b093 webassembly/proxy_js: Convert JS undefined and JS null to Py None.
And change Py None conversion so it converts to JS undefined.

The semantics for conversion of these objects are then:
- Python None           -> JavaScript undefined
- JavaScript undefined  -> Python None
- JavaScript null       -> Python None

This follows Pyodide:
https://pyodide.org/en/stable/usage/type-conversions.html

Signed-off-by: Damien George <damien@micropython.org>
2024-05-13 11:53:10 +10:00
Damien George
a67e326cb9 webassembly/proxy_c: Ensure objs thrown into generators are exceptions.
This commit defines a new `JsException` exception type which is used on the
Python side to wrap JavaScript errors.  That's then used when a JavaScript
Promise is rejected, and the reason is then converted to a `JsException`
for the Python side to handle.

This new exception is exposed as `jsffi.JsException`.

Signed-off-by: Damien George <damien@micropython.org>
2024-05-13 11:52:17 +10:00
Damien George
3f34be69c7 webassembly/asyncio: Fix case where a Promise is resolved with no arg.
Signed-off-by: Damien George <damien@micropython.org>
2024-05-13 11:48:41 +10:00