Skip to content

Commit 540dcfc

Browse files
committed
remove redundant buffer object storage, start processing function
1 parent 10dfea4 commit 540dcfc

File tree

4 files changed

+53
-57
lines changed

4 files changed

+53
-57
lines changed

ports/raspberrypi/bindings/rp2pio/StateMachine.c

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -567,10 +567,6 @@ static mp_obj_t rp2pio_statemachine_background_write(size_t n_args, const mp_obj
567567

568568
size_t stride_in_bytes = 0;
569569

570-
self->once_write_buf_obj = args[ARG_once].u_obj;
571-
self->loop_write_buf_obj = args[ARG_loop].u_obj;
572-
self->loop2_write_buf_obj = args[ARG_loop2].u_obj;
573-
574570
fill_buf_info(&self->once_write_buf_info, args[ARG_once].u_obj, &stride_in_bytes, MP_BUFFER_READ);
575571
fill_buf_info(&self->loop_write_buf_info, args[ARG_loop].u_obj, &stride_in_bytes, MP_BUFFER_READ);
576572
fill_buf_info(&self->loop2_write_buf_info, args[ARG_loop2].u_obj, &stride_in_bytes, MP_BUFFER_READ);
@@ -696,10 +692,6 @@ static mp_obj_t rp2pio_statemachine_background_read(size_t n_args, const mp_obj_
696692

697693
size_t stride_in_bytes = 0;
698694

699-
self->once_read_buf_obj = args[ARG_once].u_obj;
700-
self->loop_read_buf_obj = args[ARG_loop].u_obj;
701-
self->loop2_read_buf_obj = args[ARG_loop2].u_obj;
702-
703695
fill_buf_info(&self->once_read_buf_info, args[ARG_once].u_obj, &stride_in_bytes, MP_BUFFER_WRITE);
704696
fill_buf_info(&self->loop_read_buf_info, args[ARG_loop].u_obj, &stride_in_bytes, MP_BUFFER_WRITE);
705697
fill_buf_info(&self->loop2_read_buf_info, args[ARG_loop2].u_obj, &stride_in_bytes, MP_BUFFER_WRITE);
@@ -1098,6 +1090,41 @@ MP_DEFINE_CONST_FUN_OBJ_1(rp2pio_statemachine_get_last_write_obj, rp2pio_statema
10981090
MP_PROPERTY_GETTER(rp2pio_statemachine_last_write_obj,
10991091
(mp_obj_t)&rp2pio_statemachine_get_last_write_obj);
11001092

1093+
static mp_obj_t rp2pio_statemachine_process(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
1094+
enum { ARG_target, ARG_parameters, ARG_input };
1095+
static const mp_arg_t allowed_args[] = {
1096+
{ MP_QSTR_target, MP_ARG_OBJ, {.u_obj = mp_const_none} },
1097+
{ MP_QSTR_parameters, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = mp_const_none} },
1098+
{ MP_QSTR_input, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = mp_const_none} },
1099+
};
1100+
rp2pio_statemachine_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]);
1101+
check_for_deinit(self);
1102+
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
1103+
mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
1104+
1105+
size_t stride_in_bytes = 0;
1106+
sm_buf_info target_buf_info, parameters_buf_info, input_buf_info;
1107+
1108+
fill_buf_info(&target_buf_info, args[ARG_target].u_obj, &stride_in_bytes, MP_BUFFER_WRITE);
1109+
fill_buf_info(&parameters_buf_info, args[ARG_parameters].u_obj, &stride_in_bytes, MP_BUFFER_WRITE);
1110+
fill_buf_info(&input_buf_info, args[ARG_input].u_obj, &stride_in_bytes, MP_BUFFER_WRITE);
1111+
1112+
if (!stride_in_bytes) {
1113+
return mp_const_none;
1114+
}
1115+
1116+
bool ok = common_hal_rp2pio_statemachine_process(self, stride_in_bytes, &target_buf_info, &parameters_buf_info, &input_buf_info);
1117+
1118+
if (mp_hal_is_interrupted()) {
1119+
return mp_const_none;
1120+
}
1121+
if (!ok) {
1122+
mp_raise_OSError(MP_EIO);
1123+
}
1124+
return mp_const_none;
1125+
}
1126+
MP_DEFINE_CONST_FUN_OBJ_KW(rp2pio_statemachine_process_obj, 1, rp2pio_statemachine_process);
1127+
11011128

11021129

11031130
static const mp_rom_map_elem_t rp2pio_statemachine_locals_dict_table[] = {
@@ -1139,6 +1166,8 @@ static const mp_rom_map_elem_t rp2pio_statemachine_locals_dict_table[] = {
11391166
{ MP_ROM_QSTR(MP_QSTR_last_read), MP_ROM_PTR(&rp2pio_statemachine_last_read_obj) },
11401167
{ MP_ROM_QSTR(MP_QSTR_last_write), MP_ROM_PTR(&rp2pio_statemachine_last_write_obj) },
11411168

1169+
{ MP_ROM_QSTR(MP_QSTR_process), MP_ROM_PTR(&rp2pio_statemachine_process_obj) },
1170+
11421171
};
11431172
static MP_DEFINE_CONST_DICT(rp2pio_statemachine_locals_dict, rp2pio_statemachine_locals_dict_table);
11441173

ports/raspberrypi/bindings/rp2pio/StateMachine.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,3 +91,6 @@ mp_obj_t common_hal_rp2pio_statemachine_get_rxfifo(rp2pio_statemachine_obj_t *se
9191

9292
mp_obj_t common_hal_rp2pio_statemachine_get_last_read(rp2pio_statemachine_obj_t *self);
9393
mp_obj_t common_hal_rp2pio_statemachine_get_last_write(rp2pio_statemachine_obj_t *self);
94+
95+
bool common_hal_rp2pio_statemachine_process(rp2pio_statemachine_obj_t *self, uint8_t stride_in_bytes,
96+
sm_buf_info *target_buf_info, sm_buf_info *parameters_buf_info, sm_buf_info *input_buf_info);

ports/raspberrypi/common-hal/rp2pio/StateMachine.c

Lines changed: 13 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1075,36 +1075,27 @@ bool common_hal_rp2pio_statemachine_background_write(rp2pio_statemachine_obj_t *
10751075
if (!self->loop_write_buf_info.info.len) {
10761076
// If once_write_buf and loop_write_buf have zero length, write loop2_write_buf forever
10771077
self->once_write_buf_info = self->loop2_write_buf_info;
1078-
self->once_write_buf_obj = self->loop2_write_buf_obj;
10791078
self->loop_write_buf_info = self->loop2_write_buf_info;
1080-
self->loop_write_buf_obj = self->loop2_write_buf_obj;
10811079
} else {
10821080
if (!(self->loop2_write_buf_info.info.len)) {
10831081
// If once_write_buf and loop2_write_buf have zero length, write loop_write_buf forever
10841082
self->once_write_buf_info = self->loop_write_buf_info;
1085-
self->once_write_buf_obj = self->loop_write_buf_obj;
10861083
self->loop2_write_buf_info = self->loop_write_buf_info;
1087-
self->loop2_write_buf_obj = self->loop_write_buf_obj;
10881084
} else {
10891085
// If only once_write_buf has zero length, write loop_write_buf, loop2_write_buf, and repeat last two forever
10901086
self->once_write_buf_info = self->loop_write_buf_info;
1091-
self->once_write_buf_obj = self->loop_write_buf_obj;
10921087
self->loop_write_buf_info = self->loop2_write_buf_info;
1093-
self->loop_write_buf_obj = self->loop2_write_buf_obj;
10941088
self->loop2_write_buf_info = self->once_write_buf_info;
1095-
self->loop2_write_buf_obj = self->once_write_buf_obj;
10961089
}
10971090
}
10981091
} else {
10991092
if (!(self->loop_write_buf_info.info.len)) {
11001093
// If once_write_buf has nonzero length and loop_write_buf has zero length, write once_write_buf, loop2_write_buf and repeat last buf forever
11011094
self->loop_write_buf_info = self->loop2_write_buf_info;
1102-
self->loop_write_buf_obj = self->loop2_write_buf_obj;
11031095
} else {
11041096
if (!self->loop2_write_buf_info.info.len) {
11051097
// If once_write_buf has nonzero length and loop2_write_buf have zero length, write once_write_buf, loop_write_buf and repeat last buf forever
11061098
self->loop2_write_buf_info = self->loop_write_buf_info;
1107-
self->loop2_write_buf_obj = self->loop_write_buf_obj;
11081099
}
11091100
}
11101101
}
@@ -1128,11 +1119,8 @@ bool common_hal_rp2pio_statemachine_background_write(rp2pio_statemachine_obj_t *
11281119

11291120
common_hal_mcu_disable_interrupts();
11301121
self->next_write_buf_1 = self->once_write_buf_info;
1131-
self->next_write_buf_1_obj = self->once_write_buf_obj;
11321122
self->next_write_buf_2 = self->loop_write_buf_info;
1133-
self->next_write_buf_2_obj = self->loop_write_buf_obj;
11341123
self->next_write_buf_3 = self->loop2_write_buf_info;
1135-
self->next_write_buf_3_obj = self->loop2_write_buf_obj;
11361124
self->pending_buffers_write = pending_buffers_write;
11371125

11381126
if (self->dma_completed_write && self->next_write_buf_1.info.len) {
@@ -1159,13 +1147,9 @@ bool common_hal_rp2pio_statemachine_background_write(rp2pio_statemachine_obj_t *
11591147
dma_channel_config c_write;
11601148

11611149
self->current_write_buf = self->once_write_buf_info;
1162-
self->current_write_buf_obj = self->once_write_buf_obj;
11631150
self->next_write_buf_1 = self->loop_write_buf_info;
1164-
self->next_write_buf_1_obj = self->loop_write_buf_obj;
11651151
self->next_write_buf_2 = self->loop2_write_buf_info;
1166-
self->next_write_buf_2_obj = self->loop2_write_buf_obj;
11671152
self->next_write_buf_3 = self->loop_write_buf_info;
1168-
self->next_write_buf_3_obj = self->loop_write_buf_obj;
11691153

11701154
self->pending_buffers_write = pending_buffers_write;
11711155
self->dma_completed_write = false;
@@ -1201,13 +1185,9 @@ bool common_hal_rp2pio_statemachine_background_write(rp2pio_statemachine_obj_t *
12011185

12021186
void rp2pio_statemachine_dma_complete_write(rp2pio_statemachine_obj_t *self, int channel_write) {
12031187
self->current_write_buf = self->next_write_buf_1;
1204-
self->current_write_buf_obj = self->next_write_buf_1_obj;
12051188
self->next_write_buf_1 = self->next_write_buf_2;
1206-
self->next_write_buf_1_obj = self->next_write_buf_2_obj;
12071189
self->next_write_buf_2 = self->next_write_buf_3;
1208-
self->next_write_buf_2_obj = self->next_write_buf_3_obj;
12091190
self->next_write_buf_3 = self->next_write_buf_1;
1210-
self->next_write_buf_3_obj = self->next_write_buf_1_obj;
12111191

12121192
if (self->current_write_buf.info.buf) {
12131193
if (self->pending_buffers_write > 0) {
@@ -1260,36 +1240,28 @@ bool common_hal_rp2pio_statemachine_background_read(rp2pio_statemachine_obj_t *s
12601240
if (!(self->loop_read_buf_info.info.len)) {
12611241
// If once_read_buf and loop_read_buf have zero length, read loop2_read_buf forever
12621242
self->once_read_buf_info = self->loop2_read_buf_info;
1263-
self->once_read_buf_obj = self->loop2_read_buf_obj;
12641243
self->loop_read_buf_info = self->loop2_read_buf_info;
1265-
self->loop_read_buf_obj = self->loop2_read_buf_obj;
12661244
} else {
12671245
if (!(self->loop2_read_buf_info.info.len)) {
12681246
// If once_read_buf and loop2_read_buf have zero length, read loop_read_buf forever
12691247
self->once_read_buf_info = self->loop_read_buf_info;
1270-
self->once_read_buf_obj = self->loop_read_buf_obj;
12711248
self->loop2_read_buf_info = self->loop_read_buf_info;
1272-
self->loop2_read_buf_obj = self->loop_read_buf_obj;
12731249
} else {
12741250
// If only once_read_buf has zero length, read loop_read_buf, loop2_read_buf, and repeat last two forever
12751251
self->once_read_buf_info = self->loop_read_buf_info;
1276-
self->once_read_buf_obj = self->loop_read_buf_obj;
12771252
self->loop_read_buf_info = self->loop2_read_buf_info;
1278-
self->loop_read_buf_obj = self->loop2_read_buf_obj;
12791253
self->loop2_read_buf_info = self->once_read_buf_info;
1280-
self->loop2_read_buf_obj = self->once_read_buf_obj;
12811254
}
12821255
}
12831256
} else {
12841257
if (!(self->loop_read_buf_info.info.len)) {
12851258
// If once_read_buf has nonzero length and loop_read_buf has zero length, read once_read_buf, loop2_read_buf and repeat last buf forever
12861259
self->loop_read_buf_info = self->loop2_read_buf_info;
1287-
self->loop_read_buf_obj = self->loop2_read_buf_obj;
12881260
} else {
12891261
if (!(self->loop2_read_buf_info.info.len)) {
12901262
// If once_read_buf has nonzero length and loop2_read_buf have zero length, read once_read_buf, loop_read_buf and repeat last buf forever
12911263
self->loop2_read_buf_info = self->loop_read_buf_info;
1292-
self->loop2_read_buf_obj = self->loop_read_buf_obj;
1264+
12931265
}
12941266
}
12951267
}
@@ -1311,11 +1283,8 @@ bool common_hal_rp2pio_statemachine_background_read(rp2pio_statemachine_obj_t *s
13111283

13121284
common_hal_mcu_disable_interrupts();
13131285
self->next_read_buf_1 = self->once_read_buf_info;
1314-
self->next_read_buf_1_obj = self->once_read_buf_obj;
13151286
self->next_read_buf_2 = self->loop_read_buf_info;
1316-
self->next_read_buf_2_obj = self->loop_read_buf_obj;
13171287
self->next_read_buf_3 = self->loop2_read_buf_info;
1318-
self->next_read_buf_3_obj = self->loop2_read_buf_obj;
13191288
self->pending_buffers_read = pending_buffers_read;
13201289

13211290
if (self->dma_completed_read && self->next_read_buf_1.info.len) {
@@ -1343,13 +1312,9 @@ bool common_hal_rp2pio_statemachine_background_read(rp2pio_statemachine_obj_t *s
13431312
dma_channel_config c_read;
13441313

13451314
self->current_read_buf = self->once_read_buf_info;
1346-
self->current_read_buf_obj = self->once_read_buf_obj;
13471315
self->next_read_buf_1 = self->loop_read_buf_info;
1348-
self->next_read_buf_1_obj = self->loop_read_buf_obj;
13491316
self->next_read_buf_2 = self->loop2_read_buf_info;
1350-
self->next_read_buf_2_obj = self->loop2_read_buf_obj;
13511317
self->next_read_buf_3 = self->loop_read_buf_info;
1352-
self->next_read_buf_3_obj = self->loop_read_buf_obj;
13531318

13541319
self->pending_buffers_read = pending_buffers_read;
13551320
self->dma_completed_read = false;
@@ -1384,13 +1349,9 @@ bool common_hal_rp2pio_statemachine_background_read(rp2pio_statemachine_obj_t *s
13841349
void rp2pio_statemachine_dma_complete_read(rp2pio_statemachine_obj_t *self, int channel_read) {
13851350

13861351
self->current_read_buf = self->next_read_buf_1;
1387-
self->current_read_buf_obj = self->next_read_buf_1_obj;
13881352
self->next_read_buf_1 = self->next_read_buf_2;
1389-
self->next_read_buf_1_obj = self->next_read_buf_2_obj;
13901353
self->next_read_buf_2 = self->next_read_buf_3;
1391-
self->next_read_buf_2_obj = self->next_read_buf_3_obj;
13921354
self->next_read_buf_3 = self->next_read_buf_1;
1393-
self->next_read_buf_3_obj = self->next_read_buf_1_obj;
13941355

13951356
if (self->current_read_buf.info.buf) {
13961357
if (self->pending_buffers_read > 0) {
@@ -1452,19 +1413,29 @@ mp_obj_t common_hal_rp2pio_statemachine_get_rxfifo(rp2pio_statemachine_obj_t *se
14521413
mp_obj_t common_hal_rp2pio_statemachine_get_last_read(rp2pio_statemachine_obj_t *self) {
14531414
if (self->switched_read_buffers) {
14541415
self->switched_read_buffers = false;
1455-
return self->next_read_buf_1_obj;
1416+
return self->next_read_buf_1.obj;
14561417
}
14571418
return mp_const_empty_bytes;
14581419
}
14591420

14601421
mp_obj_t common_hal_rp2pio_statemachine_get_last_write(rp2pio_statemachine_obj_t *self) {
14611422
if (self->switched_write_buffers) {
14621423
self->switched_write_buffers = false;
1463-
return self->next_write_buf_1_obj;
1424+
return self->next_write_buf_1.obj;
14641425
}
14651426
return mp_const_empty_bytes;
14661427
}
14671428

1429+
bool common_hal_rp2pio_statemachine_process(rp2pio_statemachine_obj_t *self, uint8_t stride_in_bytes,
1430+
sm_buf_info *target_buf_info, sm_buf_info *parameters_buf_info, sm_buf_info *input_buf_info) {
1431+
for (void *i = target_buf_info->info.buf; i < target_buf_info->info.buf + (target_buf_info->info.len * stride_in_bytes); i += stride_in_bytes)
1432+
{};
1433+
1434+
return 1;
1435+
}
1436+
1437+
1438+
14681439
// Use a compile-time constant for MP_REGISTER_POINTER so the preprocessor will
14691440
// not split the expansion across multiple lines.
14701441
MP_REGISTER_ROOT_POINTER(mp_obj_t background_pio[enum_NUM_DMA_CHANNELS]);

ports/raspberrypi/common-hal/rp2pio/StateMachine.h

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,16 +55,9 @@ typedef struct {
5555
sm_buf_info write_buf[RP2PIO_STATEMACHINE_N_BUFS];
5656
sm_buf_info read_buf[RP2PIO_STATEMACHINE_N_BUFS];
5757

58-
mp_obj_t once_read_buf_obj, loop_read_buf_obj, loop2_read_buf_obj;
5958
sm_buf_info once_read_buf_info, loop_read_buf_info, loop2_read_buf_info;
60-
6159
sm_buf_info current_read_buf, next_read_buf_1, next_read_buf_2, next_read_buf_3;
62-
mp_obj_t current_read_buf_obj, next_read_buf_1_obj, next_read_buf_2_obj, next_read_buf_3_obj;
63-
64-
mp_obj_t once_write_buf_obj, loop_write_buf_obj, loop2_write_buf_obj;
6560
sm_buf_info once_write_buf_info, loop_write_buf_info, loop2_write_buf_info;
66-
67-
mp_obj_t current_write_buf_obj, next_write_buf_1_obj, next_write_buf_2_obj, next_write_buf_3_obj;
6861
sm_buf_info current_write_buf, next_write_buf_1, next_write_buf_2, next_write_buf_3;
6962

7063
bool switched_write_buffers, switched_read_buffers;

0 commit comments

Comments
 (0)