diff options
| author | Scott Shawcroft <scott@chickadee.tech> | 2016-11-03 15:50:59 -0700 |
|---|---|---|
| committer | Scott Shawcroft <scott.shawcroft@gmail.com> | 2016-11-21 14:11:52 -0800 |
| commit | ccbb5e84f980e252f7380d96fcc5c417a8a64523 (patch) | |
| tree | 743fef26c6176aca6582b92a85829a565e60c414 /py | |
| parent | 93218281588b42331d83e4aaa45ac1abe4af130b (diff) | |
This introduces an alternative hardware API called nativeio structured around different functions that are typically accelerated by native hardware. Its not meant to reflect the structure of the hardware.
Docs are here: http://tannewt-micropython.readthedocs.io/en/microcontroller/
It differs from upstream's machine in the following ways:
* Python API is identical across ports due to code structure. (Lives in shared-bindings)
* Focuses on abstracting common functionality (AnalogIn) and not representing structure (ADC).
* Documentation lives with code making it easy to ensure they match.
* Pin is split into references (board.D13 and microcontroller.pin.PA17) and functionality (DigitalInOut).
* All nativeio classes claim underlying hardware resources when inited on construction, support Context Managers (aka with statements) and have deinit methods which release the claimed hardware.
* All constructors take pin references rather than peripheral ids. Its up to the implementation to find hardware or throw and exception.
Diffstat (limited to 'py')
| -rw-r--r-- | py/argcheck.c | 2 | ||||
| -rw-r--r-- | py/gc.c | 3 | ||||
| -rw-r--r-- | py/modbuiltins.c | 4 | ||||
| -rw-r--r-- | py/modmath.c | 2 | ||||
| -rw-r--r-- | py/mpstate.h | 4 | ||||
| -rw-r--r-- | py/nlr.h | 1 | ||||
| -rw-r--r-- | py/obj.h | 2 | ||||
| -rw-r--r-- | py/objcomplex.c | 5 | ||||
| -rw-r--r-- | py/objfloat.c | 5 | ||||
| -rw-r--r-- | py/objmodule.c | 4 | ||||
| -rw-r--r-- | py/objproperty.c | 6 | ||||
| -rw-r--r-- | py/objproperty.h | 40 | ||||
| -rw-r--r-- | py/objtype.c | 5 | ||||
| -rw-r--r-- | py/parse.c | 3 | ||||
| -rw-r--r-- | py/runtime0.h | 2 |
15 files changed, 72 insertions, 16 deletions
diff --git a/py/argcheck.c b/py/argcheck.c index 8cef10b16..e12800a36 100644 --- a/py/argcheck.c +++ b/py/argcheck.c @@ -134,7 +134,7 @@ void mp_arg_parse_all_kw_array(size_t n_pos, size_t n_kw, const mp_obj_t *args, mp_arg_parse_all(n_pos, args, &kw_args, n_allowed, allowed, out_vals); } -#if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE || _MSC_VER +#if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE || defined(_MSC_VER) NORETURN void mp_arg_error_terse_mismatch(void) { mp_raise_msg(&mp_type_TypeError, "argument num/types mismatch"); } @@ -843,7 +843,10 @@ void gc_dump_alloc_table(void) { */ /* this prints the uPy object type of the head block */ case AT_HEAD: { +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wcast-align" void **ptr = (void**)(MP_STATE_MEM(gc_pool_start) + bl * BYTES_PER_BLOCK); +#pragma GCC diagnostic pop if (*ptr == &mp_type_tuple) { c = 'T'; } else if (*ptr == &mp_type_list) { c = 'L'; } else if (*ptr == &mp_type_dict) { c = 'D'; } diff --git a/py/modbuiltins.c b/py/modbuiltins.c index cbdcc9aae..401d9f541 100644 --- a/py/modbuiltins.c +++ b/py/modbuiltins.c @@ -470,9 +470,9 @@ STATIC mp_obj_t mp_builtin_round(size_t n_args, const mp_obj_t *args) { mp_float_t rounded = MICROPY_FLOAT_C_FUN(round)(val); mp_int_t r = rounded; // make rounded value even if it was halfway between ints - if (val - rounded == 0.5) { + if (val - rounded >= 0.5) { r = (r + 1) & (~1); - } else if (val - rounded == -0.5) { + } else if (val - rounded <= -0.5) { r &= ~1; } if (n_args > 1) { diff --git a/py/modmath.c b/py/modmath.c index 7c51eab03..7b67751bc 100644 --- a/py/modmath.c +++ b/py/modmath.c @@ -70,7 +70,7 @@ STATIC NORETURN void math_error(void) { } \ STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_math_## py_name ## _obj, mp_math_ ## py_name); -#if MP_NEED_LOG2 +#ifdef MP_NEED_LOG2 // 1.442695040888963407354163704 is 1/_M_LN2 #define log2(x) (log(x) * 1.442695040888963407354163704) #endif diff --git a/py/mpstate.h b/py/mpstate.h index 439ed6606..66504b527 100644 --- a/py/mpstate.h +++ b/py/mpstate.h @@ -146,12 +146,12 @@ typedef struct _mp_state_vm_t { // root pointers for extmod - #if MICROPY_PY_OS_DUPTERM + #ifdef MICROPY_PY_OS_DUPTERM mp_obj_t term_obj; mp_obj_t dupterm_arr_obj; #endif - #if MICROPY_PY_LWIP_SLIP + #ifdef MICROPY_PY_LWIP_SLIP mp_obj_t lwip_slip_stream; #endif @@ -41,6 +41,7 @@ struct _nlr_buf_t { nlr_buf_t *prev; void *ret_val; // always a concrete object (an exception instance) #if !defined(MICROPY_NLR_SETJMP) || !MICROPY_NLR_SETJMP +#define MICROPY_NLR_SETJMP (0) #if defined(__i386__) void *regs[6]; #elif defined(__x86_64__) @@ -513,8 +513,6 @@ struct _mp_obj_type_t { extern const mp_obj_type_t mp_type_type; extern const mp_obj_type_t mp_type_object; extern const mp_obj_type_t mp_type_NoneType; -extern const mp_obj_type_t mp_type_bool; -extern const mp_obj_type_t mp_type_int; extern const mp_obj_type_t mp_type_str; extern const mp_obj_type_t mp_type_bytes; extern const mp_obj_type_t mp_type_bytearray; diff --git a/py/objcomplex.c b/py/objcomplex.c index 96be25255..b302b1d56 100644 --- a/py/objcomplex.c +++ b/py/objcomplex.c @@ -39,6 +39,9 @@ #include <math.h> #include "py/formatfloat.h" +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wfloat-equal" + typedef struct _mp_obj_complex_t { mp_obj_base_t base; mp_float_t real; @@ -248,4 +251,6 @@ mp_obj_t mp_obj_complex_binary_op(mp_uint_t op, mp_float_t lhs_real, mp_float_t return mp_obj_new_complex(lhs_real, lhs_imag); } +#pragma GCC diagnostic pop + #endif diff --git a/py/objfloat.c b/py/objfloat.c index 73d07feac..4a32a9e96 100644 --- a/py/objfloat.c +++ b/py/objfloat.c @@ -39,6 +39,9 @@ #include <math.h> #include "py/formatfloat.h" +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wfloat-equal" + #if MICROPY_OBJ_REPR != MICROPY_OBJ_REPR_C && MICROPY_OBJ_REPR != MICROPY_OBJ_REPR_D // M_E and M_PI are not part of the math.h standard and may not be defined @@ -252,4 +255,6 @@ mp_obj_t mp_obj_float_binary_op(mp_uint_t op, mp_float_t lhs_val, mp_obj_t rhs_i return mp_obj_new_float(lhs_val); } +#pragma GCC diagnostic pop + #endif // MICROPY_PY_BUILTINS_FLOAT diff --git a/py/objmodule.c b/py/objmodule.c index 9b06e3b7b..7ed3175c0 100644 --- a/py/objmodule.c +++ b/py/objmodule.c @@ -201,13 +201,13 @@ STATIC const mp_rom_map_elem_t mp_builtin_module_table[] = { #if MICROPY_PY_USSL { MP_ROM_QSTR(MP_QSTR_ussl), MP_ROM_PTR(&mp_module_ussl) }, #endif -#if MICROPY_PY_LWIP +#ifdef MICROPY_PY_LWIP { MP_ROM_QSTR(MP_QSTR_lwip), MP_ROM_PTR(&mp_module_lwip) }, #endif #if MICROPY_PY_WEBSOCKET { MP_ROM_QSTR(MP_QSTR_websocket), MP_ROM_PTR(&mp_module_websocket) }, #endif -#if MICROPY_PY_WEBREPL +#ifdef MICROPY_PY_WEBREPL { MP_ROM_QSTR(MP_QSTR__webrepl), MP_ROM_PTR(&mp_module_webrepl) }, #endif #if MICROPY_PY_FRAMEBUF diff --git a/py/objproperty.c b/py/objproperty.c index 8189935d2..e7e5cd986 100644 --- a/py/objproperty.c +++ b/py/objproperty.c @@ -28,15 +28,11 @@ #include <assert.h> #include "py/nlr.h" +#include "py/objproperty.h" #include "py/runtime.h" #if MICROPY_PY_BUILTINS_PROPERTY -typedef struct _mp_obj_property_t { - mp_obj_base_t base; - mp_obj_t proxy[3]; // getter, setter, deleter -} mp_obj_property_t; - STATIC mp_obj_t property_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { enum { ARG_fget, ARG_fset, ARG_fdel, ARG_doc }; static const mp_arg_t allowed_args[] = { diff --git a/py/objproperty.h b/py/objproperty.h new file mode 100644 index 000000000..1852e6b6e --- /dev/null +++ b/py/objproperty.h @@ -0,0 +1,40 @@ +/* + * This file is part of the Micro Python project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2013, 2014 Damien P. George + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#ifndef __MICROPY_INCLUDED_PY_OBJPROPERTY_H__ +#define __MICROPY_INCLUDED_PY_OBJPROPERTY_H__ + +#include "py/obj.h" + +#if MICROPY_PY_BUILTINS_PROPERTY + +typedef struct _mp_obj_property_t { + mp_obj_base_t base; + mp_obj_t proxy[3]; // getter, setter, deleter +} mp_obj_property_t; + +#endif // MICROPY_PY_BUILTINS_PROPERTY + +#endif // __MICROPY_INCLUDED_PY_OBJPROPERTY_H__ diff --git a/py/objtype.c b/py/objtype.c index 8b46c5400..0fbc597cd 100644 --- a/py/objtype.c +++ b/py/objtype.c @@ -110,7 +110,10 @@ STATIC void mp_obj_class_lookup(struct class_lookup_data *lookup, const mp_obj_ // this should not be applied to class types, as will result in extra // lookup either. if (lookup->meth_offset != 0 && mp_obj_is_native_type(type)) { +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wcast-align" if (*(void**)((char*)type + lookup->meth_offset) != NULL) { +#pragma GCC diagnostic pop DEBUG_printf("mp_obj_class_lookup: matched special meth slot for %s\n", qstr_str(lookup->attr)); lookup->dest[0] = MP_OBJ_SENTINEL; return; @@ -368,7 +371,7 @@ STATIC mp_obj_t instance_unary_op(mp_uint_t op, mp_obj_t self_in) { if (member[0] == MP_OBJ_NULL) { // https://docs.python.org/3/reference/datamodel.html#object.__hash__ // "User-defined classes have __eq__() and __hash__() methods by default; - // with them, all objects compare unequal (except with themselves) and + // with them, all objects compare unequal (except with themselves) and // x.__hash__() returns an appropriate value such that x == y implies // both that x is y and hash(x) == hash(y)." return MP_OBJ_NEW_SMALL_INT((mp_uint_t)self_in); diff --git a/py/parse.c b/py/parse.c index 397d46d9f..1787265b3 100644 --- a/py/parse.c +++ b/py/parse.c @@ -152,6 +152,8 @@ typedef struct _parser_t { #endif } parser_t; +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wcast-align" STATIC void *parser_alloc(parser_t *parser, size_t num_bytes) { // use a custom memory allocator to store parse nodes sequentially in large chunks @@ -192,6 +194,7 @@ STATIC void *parser_alloc(parser_t *parser, size_t num_bytes) { chunk->union_.used += num_bytes; return ret; } +#pragma GCC diagnostic pop STATIC void push_rule(parser_t *parser, size_t src_line, const rule_t *rule, size_t arg_i) { if (parser->parse_error) { diff --git a/py/runtime0.h b/py/runtime0.h index 8d62403a7..a803c3665 100644 --- a/py/runtime0.h +++ b/py/runtime0.h @@ -26,6 +26,8 @@ #ifndef __MICROPY_INCLUDED_PY_RUNTIME0_H__ #define __MICROPY_INCLUDED_PY_RUNTIME0_H__ +#include "mpconfig.h" + // These must fit in 8 bits; see scope.h #define MP_SCOPE_FLAG_VARARGS (0x01) #define MP_SCOPE_FLAG_VARKEYWORDS (0x02) |
