/** This file is part of the MicroPython 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.*/#include "py/runtime.h"#include "extmod/machine_mem.h"#if MICROPY_PY_MACHINE// If you wish to override the functions for mapping the machine_mem read/write// address, then add a #define for MICROPY_MACHINE_MEM_GET_READ_ADDR and/or// MICROPY_MACHINE_MEM_GET_WRITE_ADDR in your mpconfigport.h. Since the// prototypes are identical, it is allowable for both of the macros to evaluate// the to same function.//// It is expected that the modmachine.c file for a given port will provide the// implementations, if the default implementation isn't used.#if !defined(MICROPY_MACHINE_MEM_GET_READ_ADDR) || !defined(MICROPY_MACHINE_MEM_GET_WRITE_ADDR)STATIC uintptr_t machine_mem_get_addr(mp_obj_t addr_o, uint align) {uintptr_t addr = mp_obj_int_get_truncated(addr_o);if ((addr & (align - 1)) != 0) {nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, "address %08x is not aligned to %d bytes", addr, align));}return addr;}#if !defined(MICROPY_MACHINE_MEM_GET_READ_ADDR)#define MICROPY_MACHINE_MEM_GET_READ_ADDR machine_mem_get_addr#endif#if !defined(MICROPY_MACHINE_MEM_GET_WRITE_ADDR)#define MICROPY_MACHINE_MEM_GET_WRITE_ADDR machine_mem_get_addr#endif#endifSTATIC void machine_mem_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {(void)kind;machine_mem_obj_t *self = MP_OBJ_TO_PTR(self_in);mp_printf(print, "<%u-bit memory>", 8 * self->elem_size);}STATIC mp_obj_t machine_mem_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) {// TODO support slice index to read/write multiple values at oncemachine_mem_obj_t *self = MP_OBJ_TO_PTR(self_in);if (value == MP_OBJ_NULL) {// deletereturn MP_OBJ_NULL; // op not supported} else if (value == MP_OBJ_SENTINEL) {// loaduintptr_t addr = MICROPY_MACHINE_MEM_GET_READ_ADDR(index, self->elem_size);uint32_t val;switch (self->elem_size) {case 1: val = (*(uint8_t*)addr); break;case 2: val = (*(uint16_t*)addr); break;default: val = (*(uint32_t*)addr); break;}return mp_obj_new_int(val);} else {// storeuintptr_t addr = MICROPY_MACHINE_MEM_GET_WRITE_ADDR(index, self->elem_size);uint32_t val = mp_obj_get_int_truncated(value);switch (self->elem_size) {case 1: (*(uint8_t*)addr) = val; break;case 2: (*(uint16_t*)addr) = val; break;default: (*(uint32_t*)addr) = val; break;}return mp_const_none;}}const mp_obj_type_t machine_mem_type = {{ &mp_type_type },.name = MP_QSTR_mem,.print = machine_mem_print,.subscr = machine_mem_subscr,};const machine_mem_obj_t machine_mem8_obj = {{&machine_mem_type}, 1};const machine_mem_obj_t machine_mem16_obj = {{&machine_mem_type}, 2};const machine_mem_obj_t machine_mem32_obj = {{&machine_mem_type}, 4};#endif // MICROPY_PY_MACHINE
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。