summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2019-12-16 22:40:22 +1100
committerDamien George <damien.p.george@gmail.com>2019-12-19 17:06:27 +1100
commita3df152fef9b2e022bd4b1233df12c261cb9f1a8 (patch)
tree3e56940fcbbaffe386bea80ff388ed4f1e769157
parentb3b9b11596b5b4c9a3c45185fd839fa3db63fa12 (diff)
examples/natmod: Add very simple features0 example to compute factorial.
-rw-r--r--examples/natmod/features0/Makefile14
-rw-r--r--examples/natmod/features0/features0.c40
2 files changed, 54 insertions, 0 deletions
diff --git a/examples/natmod/features0/Makefile b/examples/natmod/features0/Makefile
new file mode 100644
index 000000000..57490df90
--- /dev/null
+++ b/examples/natmod/features0/Makefile
@@ -0,0 +1,14 @@
+# Location of top-level MicroPython directory
+MPY_DIR = ../../..
+
+# Name of module
+MOD = features0
+
+# Source files (.c or .py)
+SRC = features0.c
+
+# Architecture to build for (x86, x64, armv7m, xtensa, xtensawin)
+ARCH = x64
+
+# Include to get the rules for compiling and linking the module
+include $(MPY_DIR)/py/dynruntime.mk
diff --git a/examples/natmod/features0/features0.c b/examples/natmod/features0/features0.c
new file mode 100644
index 000000000..1b1867a3b
--- /dev/null
+++ b/examples/natmod/features0/features0.c
@@ -0,0 +1,40 @@
+/* This example demonstrates the following features in a native module:
+ - defining a simple function exposed to Python
+ - defining a local, helper C function
+ - getting and creating integer objects
+*/
+
+// Include the header file to get access to the MicroPython API
+#include "py/dynruntime.h"
+
+// Helper function to compute factorial
+STATIC mp_int_t factorial_helper(mp_int_t x) {
+ if (x == 0) {
+ return 1;
+ }
+ return x * factorial_helper(x - 1);
+}
+
+// This is the function which will be called from Python, as factorial(x)
+STATIC mp_obj_t factorial(mp_obj_t x_obj) {
+ // Extract the integer from the MicroPython input object
+ mp_int_t x = mp_obj_get_int(x_obj);
+ // Calculate the factorial
+ mp_int_t result = factorial_helper(x);
+ // Convert the result to a MicroPython integer object and return it
+ return mp_obj_new_int(result);
+}
+// Define a Python reference to the function above
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(factorial_obj, factorial);
+
+// This is the entry point and is called when the module is imported
+mp_obj_t mpy_init(mp_obj_fun_bc_t *self, size_t n_args, size_t n_kw, mp_obj_t *args) {
+ // This must be first, it sets up the globals dict and other things
+ MP_DYNRUNTIME_INIT_ENTRY
+
+ // Make the function available in the module's namespace
+ mp_store_global(MP_QSTR_factorial, MP_OBJ_FROM_PTR(&factorial_obj));
+
+ // This must be last, it restores the globals dict
+ MP_DYNRUNTIME_INIT_EXIT
+}