Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commita4d2276

Browse files
committed
extmod/machine_mem: Support slices for reading/writing memory.
Signed-off-by: Daniël van de Giessen <daniel@dvdgiessen.nl>
1 parent27b7bf3 commita4d2276

File tree

5 files changed

+75
-12
lines changed

5 files changed

+75
-12
lines changed

‎extmod/machine_mem.c‎

Lines changed: 55 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,11 @@
2424
* THE SOFTWARE.
2525
*/
2626

27+
#include"py/binary.h"
28+
#include"py/objarray.h"
2729
#include"py/runtime.h"
2830
#include"extmod/modmachine.h"
31+
#include<string.h>
2932

3033
#ifMICROPY_PY_MACHINE_MEMX
3134

@@ -39,8 +42,7 @@
3942
// implementations, if the default implementation isn't used.
4043

4144
#if !defined(MICROPY_MACHINE_MEM_GET_READ_ADDR)|| !defined(MICROPY_MACHINE_MEM_GET_WRITE_ADDR)
42-
staticuintptr_tmachine_mem_get_addr(mp_obj_taddr_o,uintalign) {
43-
uintptr_taddr=mp_obj_get_int_truncated(addr_o);
45+
staticuintptr_tmachine_mem_get_addr(uintptr_taddr,uintalign) {
4446
if ((addr& (align-1))!=0) {
4547
mp_raise_msg_varg(&mp_type_ValueError,MP_ERROR_TEXT("address %08x is not aligned to %d bytes"),addr,align);
4648
}
@@ -60,15 +62,63 @@ static void machine_mem_print(const mp_print_t *print, mp_obj_t self_in, mp_prin
6062
mp_printf(print,"<%u-bit memory>",8*self->elem_size);
6163
}
6264

65+
#ifMICROPY_PY_MACHINE_MEMX_SLICE&&MICROPY_PY_BUILTINS_SLICE
66+
staticinlineintmachine_mem_typecode(machine_mem_obj_t*self) {
67+
switch (self->elem_size) {
68+
case1:
69+
return'B';
70+
case2:
71+
return'H';
72+
default:
73+
return'I';
74+
}
75+
}
76+
#endif
77+
6378
staticmp_obj_tmachine_mem_subscr(mp_obj_tself_in,mp_obj_tindex,mp_obj_tvalue) {
64-
// TODO support slice index to read/write multiple values at once
6579
machine_mem_obj_t*self=MP_OBJ_TO_PTR(self_in);
6680
if (value==MP_OBJ_NULL) {
6781
// delete
6882
returnMP_OBJ_NULL;// op not supported
83+
#ifMICROPY_PY_MACHINE_MEMX_SLICE&&MICROPY_PY_BUILTINS_SLICE
84+
}elseif (mp_obj_is_type(index,&mp_type_slice)) {
85+
mp_bound_slice_tslice;
86+
if (!mp_seq_get_fast_slice_indexes(INT32_MAX,index,&slice)) {
87+
mp_raise_NotImplementedError(MP_ERROR_TEXT("only slices with step=1 (aka None) are supported"));
88+
}
89+
if (value==MP_OBJ_SENTINEL) {
90+
// load
91+
#ifMICROPY_PY_BUILTINS_MEMORYVIEW
92+
returnmp_obj_new_memoryview(
93+
machine_mem_typecode(self) |MP_OBJ_ARRAY_TYPECODE_FLAG_RW,
94+
(slice.stop-slice.start) /self->elem_size,
95+
(void*)MICROPY_MACHINE_MEM_GET_READ_ADDR((uintptr_t)slice.start,self->elem_size)
96+
);
97+
#else
98+
mp_raise_NotImplementedError(MP_ERROR_TEXT("memoryviews are not supported"));
99+
#endif
100+
}else {
101+
// store
102+
mp_buffer_info_tbufinfo;
103+
mp_get_buffer_raise(value,&bufinfo,MP_BUFFER_READ);
104+
if (
105+
mp_binary_get_size('@',bufinfo.typecode,NULL)!=self->elem_size
106+
||
107+
bufinfo.len!= (size_t)(slice.stop-slice.start)
108+
) {
109+
mp_raise_ValueError(MP_ERROR_TEXT("lhs and rhs should be compatible"));
110+
}
111+
memcpy(
112+
(void*)MICROPY_MACHINE_MEM_GET_READ_ADDR((uintptr_t)slice.start,self->elem_size),
113+
bufinfo.buf,
114+
bufinfo.len
115+
);
116+
returnmp_const_none;
117+
}
118+
#endif
69119
}elseif (value==MP_OBJ_SENTINEL) {
70120
// load
71-
uintptr_taddr=MICROPY_MACHINE_MEM_GET_READ_ADDR(index,self->elem_size);
121+
uintptr_taddr=MICROPY_MACHINE_MEM_GET_READ_ADDR(mp_obj_get_int_truncated(index),self->elem_size);
72122
uint32_tval;
73123
switch (self->elem_size) {
74124
case1:
@@ -84,7 +134,7 @@ static mp_obj_t machine_mem_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t va
84134
returnmp_obj_new_int(val);
85135
}else {
86136
// store
87-
uintptr_taddr=MICROPY_MACHINE_MEM_GET_WRITE_ADDR(index,self->elem_size);
137+
uintptr_taddr=MICROPY_MACHINE_MEM_GET_WRITE_ADDR(mp_obj_get_int_truncated(index),self->elem_size);
88138
uint32_tval=mp_obj_get_int_truncated(value);
89139
switch (self->elem_size) {
90140
case1:

‎extmod/modmachine.h‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -238,10 +238,10 @@ extern const mp_obj_type_t machine_usb_device_type;
238238
#endif
239239

240240
#if defined(MICROPY_MACHINE_MEM_GET_READ_ADDR)
241-
uintptr_tMICROPY_MACHINE_MEM_GET_READ_ADDR(mp_obj_taddr_o,uintalign);
241+
uintptr_tMICROPY_MACHINE_MEM_GET_READ_ADDR(uintptr_taddr,uintalign);
242242
#endif
243243
#if defined(MICROPY_MACHINE_MEM_GET_WRITE_ADDR)
244-
uintptr_tMICROPY_MACHINE_MEM_GET_WRITE_ADDR(mp_obj_taddr_o,uintalign);
244+
uintptr_tMICROPY_MACHINE_MEM_GET_WRITE_ADDR(uintptr_taddr,uintalign);
245245
#endif
246246

247247
MP_NORETURNmp_obj_tmachine_bootloader(size_tn_args,constmp_obj_t*args);

‎ports/unix/modmachine.c‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,7 @@
3636
#defineMICROPY_PAGE_MASK (MICROPY_PAGE_SIZE - 1)
3737
#endif
3838

39-
uintptr_tmod_machine_mem_get_addr(mp_obj_taddr_o,uintalign) {
40-
uintptr_taddr=mp_obj_get_int_truncated(addr_o);
39+
uintptr_tmod_machine_mem_get_addr(uintptr_taddr,uintalign) {
4140
if ((addr& (align-1))!=0) {
4241
mp_raise_msg_varg(&mp_type_ValueError,MP_ERROR_TEXT("address %08x is not aligned to %d bytes"),addr,align);
4342
}

‎py/mpconfig.h‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2025,6 +2025,11 @@ typedef time_t mp_timestamp_t;
20252025
#defineMICROPY_PY_MACHINE_MEMX (MICROPY_PY_MACHINE)
20262026
#endif
20272027

2028+
// Whether "machine.mem8/16/32" objects support reading/writing slices
2029+
#ifndefMICROPY_PY_MACHINE_MEMX_SLICE
2030+
#defineMICROPY_PY_MACHINE_MEMX_SLICE (MICROPY_CONFIG_ROM_LEVEL_AT_LEAST_EVERYTHING)
2031+
#endif
2032+
20282033
// Whether to provide the "machine.Signal" class
20292034
#ifndefMICROPY_PY_MACHINE_SIGNAL
20302035
#defineMICROPY_PY_MACHINE_SIGNAL (MICROPY_PY_MACHINE)

‎tests/extmod/machine1.py‎

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,25 @@ def test_alignment(self):
2222
withself.assertRaises(ValueError):
2323
machine.mem16[1]=1
2424

25+
withself.assertRaises(ValueError):
26+
machine.mem32[2]
27+
28+
withself.assertRaises(ValueError):
29+
machine.mem32[2]=1
30+
2531
deftest_operations(self):
2632
withself.assertRaises(TypeError):
2733
delmachine.mem8[0]
2834

29-
withself.assertRaises(TypeError):
30-
machine.mem8[0:1]
31-
3235
withself.assertRaises(TypeError):
3336
machine.mem8[0:1]=10
3437

38+
withself.assertRaises(ValueError):
39+
try:
40+
machine.mem8[0:1]=bytes([0,1,2])
41+
exceptTypeError:
42+
raiseValueError("Slice support not enabled")
43+
3544
withself.assertRaises(TypeError):
3645
machine.mem8["hello"]
3746

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp