710426024a
No functionality change is intended with this commit, it just consolidates the separate implementations of GC helper code to the lib/utils/ directory as a general set of helper functions useful for any port. This reduces duplication of code, and makes it easier for future ports or embedders to get the GC implementation correct. Ports should now link against gchelper_native.c and either gchelper_m0.s or gchelper_m3.s (currently only Cortex-M is supported but other architectures can follow), or use the fallback gchelper_generic.c which will work on x86/x64/ARM. The gc_helper_get_sp function from gchelper_m3.s is not really GC related and was only used by cc3200, so it has been moved to that port and renamed to cortex_m3_get_sp. |
||
---|---|---|
.. | ||
hello-embed.c | ||
Makefile | ||
Makefile.upylib | ||
mpconfigport_minimal.h | ||
mpconfigport.h | ||
README.md |
Example of embedding MicroPython in a standalone C application
This directory contains a (very simple!) example of how to embed a MicroPython in an existing C application.
A C application is represented by the file hello-embed.c
. It executes a simple
Python statement which prints to the standard output.
Building the example
Building the example is as simple as running:
make
It's worth to trace what's happening behind the scenes though:
-
As a first step, a MicroPython library is built. This is handled by a separate makefile,
Makefile.upylib
. It is more or less complex, but the good news is that you won't need to change anything in it, just use it as is, the mainMakefile
shows how. What may require editing though is a MicroPython configuration file. MicroPython is highly configurable, so you would need to build a library suiting your application well, while not bloating its size. Check the options in the filempconfigport.h
. Included is a copy of the "minimal" Unix port, which should be a good start for minimal embedding. For the list of all available options, seepy/mpconfig.h
. -
Once the MicroPython library is built, your application is compiled and linked it. The main Makefile is very simple and shows that the changes you would need to do to your application's
Makefile
(or other build configuration) are also simple:
a) You would need to use C99 standard (you're using this 15+ years old standard already, not a 25+ years old one, right?).
b) You need to provide a path to MicroPython's top-level dir, for includes.
c) You need to include -DNO_QSTR
compile-time flag.
d) Otherwise, just link with the MicroPython library produced in step 1.
Out of tree build
This example is set up to work out of the box, being part of the MicroPython
tree. Your application of course will be outside of its tree, but the
only thing you need to do is to pass MPTOP
variable pointing to
MicroPython directory to both Makefiles (in this example, the main Makefile
automatically passes it to Makefile.upylib
; in your own Makefile, don't forget
to use a suitable value).
A practical way to embed MicroPython in your application is to include it
as a git submodule. Suppose you included it as libs/micropython
. Then in
your main Makefile you would have something like:
MPTOP = libs/micropython
my_app: $(MY_OBJS) -lmicropython
-lmicropython:
$(MAKE) -f $(MPTOP)/examples/embedding/Makefile.upylib MPTOP=$(MPTOP)