Port of MicroPython to the mbed platform. See micropython-repl for an interactive program.

Dependents:   micropython-repl

This a port of MicroPython to the mbed Classic platform.

This provides an interpreter running on the board's USB serial connection.

Getting Started

Import the micropython-repl program into your IDE workspace on developer.mbed.org. Compile and download to your board. Connect to the USB serial port in your usual manner. You should get a startup message similar to the following:

  MicroPython v1.7-155-gdddcdd8 on 2016-04-23; K64F with ARM
  Type "help()" for more information.
  >>>

Then you can start using micropython. For example:

  >>> from mbed import DigitalOut
  >>> from pins import LED1
  >>> led = DigitalOut(LED1)
  >>> led.write(1)

Requirements

You need approximately 100K of flash memory, so this will be no good for boards with smaller amounts of storage.

Caveats

This can be considered an alpha release of the port; things may not work; APIs may change in later releases. It is NOT an official part part the micropython project, so if anything doesn't work, blame me. If it does work, most of the credit is due to micropython.

  • Only a few of the mbed classes are available in micropython so far, and not all methods of those that are.
  • Only a few boards have their full range of pin names available; for others, only a few standard ones (USBTX, USBRX, LED1) are implemented.
  • The garbage collector is not yet implemented. The interpreter will gradually consume memory and then fail.
  • Exceptions from the mbed classes are not yet handled.
  • Asynchronous processing (e.g. events on inputs) is not supported.

Credits

  • Damien P. George and other contributors who created micropython.
  • Colin Hogben, author of this port.
Committer:
Colin Hogben
Date:
Wed Apr 27 22:11:29 2016 +0100
Revision:
10:33521d742af1
Parent:
0:5868e8752d44
Update README and version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pythontech 0:5868e8752d44 1 /*
pythontech 0:5868e8752d44 2 * This file is part of the Micro Python project, http://micropython.org/
pythontech 0:5868e8752d44 3 *
pythontech 0:5868e8752d44 4 * The MIT License (MIT)
pythontech 0:5868e8752d44 5 *
pythontech 0:5868e8752d44 6 * Copyright (c) 2013, 2014 Damien P. George
pythontech 0:5868e8752d44 7 *
pythontech 0:5868e8752d44 8 * Permission is hereby granted, free of charge, to any person obtaining a copy
pythontech 0:5868e8752d44 9 * of this software and associated documentation files (the "Software"), to deal
pythontech 0:5868e8752d44 10 * in the Software without restriction, including without limitation the rights
pythontech 0:5868e8752d44 11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
pythontech 0:5868e8752d44 12 * copies of the Software, and to permit persons to whom the Software is
pythontech 0:5868e8752d44 13 * furnished to do so, subject to the following conditions:
pythontech 0:5868e8752d44 14 *
pythontech 0:5868e8752d44 15 * The above copyright notice and this permission notice shall be included in
pythontech 0:5868e8752d44 16 * all copies or substantial portions of the Software.
pythontech 0:5868e8752d44 17 *
pythontech 0:5868e8752d44 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
pythontech 0:5868e8752d44 19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
pythontech 0:5868e8752d44 20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
pythontech 0:5868e8752d44 21 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
pythontech 0:5868e8752d44 22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
pythontech 0:5868e8752d44 23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
pythontech 0:5868e8752d44 24 * THE SOFTWARE.
pythontech 0:5868e8752d44 25 */
pythontech 0:5868e8752d44 26 #ifndef __MICROPY_INCLUDED_PY_PARSE_H__
pythontech 0:5868e8752d44 27 #define __MICROPY_INCLUDED_PY_PARSE_H__
pythontech 0:5868e8752d44 28
pythontech 0:5868e8752d44 29 #include <stddef.h>
pythontech 0:5868e8752d44 30 #include <stdint.h>
pythontech 0:5868e8752d44 31
pythontech 0:5868e8752d44 32 #include "py/obj.h"
pythontech 0:5868e8752d44 33
pythontech 0:5868e8752d44 34 struct _mp_lexer_t;
pythontech 0:5868e8752d44 35
pythontech 0:5868e8752d44 36 // a mp_parse_node_t is:
pythontech 0:5868e8752d44 37 // - 0000...0000: no node
pythontech 0:5868e8752d44 38 // - xxxx...xxx1: a small integer; bits 1 and above are the signed value, 2's complement
pythontech 0:5868e8752d44 39 // - xxxx...xx00: pointer to mp_parse_node_struct_t
pythontech 0:5868e8752d44 40 // - xx...xx0010: an identifier; bits 4 and above are the qstr
pythontech 0:5868e8752d44 41 // - xx...xx0110: a string; bits 4 and above are the qstr holding the value
pythontech 0:5868e8752d44 42 // - xx...xx1010: a string of bytes; bits 4 and above are the qstr holding the value
pythontech 0:5868e8752d44 43 // - xx...xx1110: a token; bits 4 and above are mp_token_kind_t
pythontech 0:5868e8752d44 44
pythontech 0:5868e8752d44 45 #define MP_PARSE_NODE_NULL (0)
pythontech 0:5868e8752d44 46 #define MP_PARSE_NODE_SMALL_INT (0x1)
pythontech 0:5868e8752d44 47 #define MP_PARSE_NODE_ID (0x02)
pythontech 0:5868e8752d44 48 #define MP_PARSE_NODE_STRING (0x06)
pythontech 0:5868e8752d44 49 #define MP_PARSE_NODE_BYTES (0x0a)
pythontech 0:5868e8752d44 50 #define MP_PARSE_NODE_TOKEN (0x0e)
pythontech 0:5868e8752d44 51
pythontech 0:5868e8752d44 52 typedef uintptr_t mp_parse_node_t; // must be pointer size
pythontech 0:5868e8752d44 53
pythontech 0:5868e8752d44 54 typedef struct _mp_parse_node_struct_t {
pythontech 0:5868e8752d44 55 uint32_t source_line; // line number in source file
pythontech 0:5868e8752d44 56 uint32_t kind_num_nodes; // parse node kind, and number of nodes
pythontech 0:5868e8752d44 57 mp_parse_node_t nodes[]; // nodes
pythontech 0:5868e8752d44 58 } mp_parse_node_struct_t;
pythontech 0:5868e8752d44 59
pythontech 0:5868e8752d44 60 // macros for mp_parse_node_t usage
pythontech 0:5868e8752d44 61 // some of these evaluate their argument more than once
pythontech 0:5868e8752d44 62
pythontech 0:5868e8752d44 63 #define MP_PARSE_NODE_IS_NULL(pn) ((pn) == MP_PARSE_NODE_NULL)
pythontech 0:5868e8752d44 64 #define MP_PARSE_NODE_IS_LEAF(pn) ((pn) & 3)
pythontech 0:5868e8752d44 65 #define MP_PARSE_NODE_IS_STRUCT(pn) ((pn) != MP_PARSE_NODE_NULL && ((pn) & 3) == 0)
pythontech 0:5868e8752d44 66 #define MP_PARSE_NODE_IS_STRUCT_KIND(pn, k) ((pn) != MP_PARSE_NODE_NULL && ((pn) & 3) == 0 && MP_PARSE_NODE_STRUCT_KIND((mp_parse_node_struct_t*)(pn)) == (k))
pythontech 0:5868e8752d44 67
pythontech 0:5868e8752d44 68 #define MP_PARSE_NODE_IS_SMALL_INT(pn) (((pn) & 0x1) == MP_PARSE_NODE_SMALL_INT)
pythontech 0:5868e8752d44 69 #define MP_PARSE_NODE_IS_ID(pn) (((pn) & 0x0f) == MP_PARSE_NODE_ID)
pythontech 0:5868e8752d44 70 #define MP_PARSE_NODE_IS_TOKEN(pn) (((pn) & 0x0f) == MP_PARSE_NODE_TOKEN)
pythontech 0:5868e8752d44 71 #define MP_PARSE_NODE_IS_TOKEN_KIND(pn, k) ((pn) == (MP_PARSE_NODE_TOKEN | ((k) << 4)))
pythontech 0:5868e8752d44 72
pythontech 0:5868e8752d44 73 #define MP_PARSE_NODE_LEAF_KIND(pn) ((pn) & 0x0f)
pythontech 0:5868e8752d44 74 #define MP_PARSE_NODE_LEAF_ARG(pn) (((uintptr_t)(pn)) >> 4)
pythontech 0:5868e8752d44 75 #define MP_PARSE_NODE_LEAF_SMALL_INT(pn) (((mp_int_t)(intptr_t)(pn)) >> 1)
pythontech 0:5868e8752d44 76 #define MP_PARSE_NODE_STRUCT_KIND(pns) ((pns)->kind_num_nodes & 0xff)
pythontech 0:5868e8752d44 77 #define MP_PARSE_NODE_STRUCT_NUM_NODES(pns) ((pns)->kind_num_nodes >> 8)
pythontech 0:5868e8752d44 78
pythontech 0:5868e8752d44 79 mp_parse_node_t mp_parse_node_new_leaf(size_t kind, mp_int_t arg);
pythontech 0:5868e8752d44 80 bool mp_parse_node_get_int_maybe(mp_parse_node_t pn, mp_obj_t *o);
pythontech 0:5868e8752d44 81 int mp_parse_node_extract_list(mp_parse_node_t *pn, size_t pn_kind, mp_parse_node_t **nodes);
pythontech 0:5868e8752d44 82 void mp_parse_node_print(mp_parse_node_t pn, size_t indent);
pythontech 0:5868e8752d44 83
pythontech 0:5868e8752d44 84 typedef enum {
pythontech 0:5868e8752d44 85 MP_PARSE_SINGLE_INPUT,
pythontech 0:5868e8752d44 86 MP_PARSE_FILE_INPUT,
pythontech 0:5868e8752d44 87 MP_PARSE_EVAL_INPUT,
pythontech 0:5868e8752d44 88 } mp_parse_input_kind_t;
pythontech 0:5868e8752d44 89
pythontech 0:5868e8752d44 90 typedef struct _mp_parse_t {
pythontech 0:5868e8752d44 91 mp_parse_node_t root;
pythontech 0:5868e8752d44 92 struct _mp_parse_chunk_t *chunk;
pythontech 0:5868e8752d44 93 } mp_parse_tree_t;
pythontech 0:5868e8752d44 94
pythontech 0:5868e8752d44 95 // the parser will raise an exception if an error occurred
pythontech 0:5868e8752d44 96 // the parser will free the lexer before it returns
pythontech 0:5868e8752d44 97 mp_parse_tree_t mp_parse(struct _mp_lexer_t *lex, mp_parse_input_kind_t input_kind);
pythontech 0:5868e8752d44 98 void mp_parse_tree_clear(mp_parse_tree_t *tree);
pythontech 0:5868e8752d44 99
pythontech 0:5868e8752d44 100 #endif // __MICROPY_INCLUDED_PY_PARSE_H__