Skip to content
This repository was archived by the owner on Apr 25, 2021. It is now read-only.

Commit eb0110b

Browse files
committed
메모리 대신 인터럽트 방식으로 통신
1 parent bbf54c1 commit eb0110b

9 files changed

Lines changed: 73 additions & 113 deletions

File tree

src/Makefile

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,6 @@ SRC_LIB = $(addprefix lib/,\
7474

7575
SRC_MP_LIB = $(addprefix lib/,\
7676
utils/sys_stdio_mphal.c \
77-
utils/stdout_helpers.c \
7877
utils/interrupt_char.c \
7978
utils/pyexec.c \
8079
libc/string0.c \

src/machine.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
#include "py/objexcept.h"
44
#include "lib/utils/interrupt_char.h"
55
#include "gccollect.h"
6-
#include "openpie_mcu.h"
76
#include "machine.h"
87
#include "syscall.h"
98

@@ -38,9 +37,9 @@ void Reset_Handler(void) {
3837
*dest++ = 0;
3938
}
4039

41-
OPENPIE_CONTROLLER->PENDING = (uint32_t) &MP_STATE_VM(mp_pending_exception);
42-
OPENPIE_CONTROLLER->EXCEPTION = (uint32_t) &MP_STATE_VM(mp_kbd_exception);
43-
OPENPIE_CONTROLLER->INTR_CHAR = (uint32_t) &mp_interrupt_char;
40+
// OPENPIE_CONTROLLER->PENDING = (uint32_t) &MP_STATE_VM(mp_pending_exception);
41+
// OPENPIE_CONTROLLER->EXCEPTION = (uint32_t) &MP_STATE_VM(mp_kbd_exception);
42+
// OPENPIE_CONTROLLER->INTR_CHAR = (uint32_t) &mp_interrupt_char;
4443

4544
// jump to board initialisation
4645
_start();

src/main.c

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
#include "gccollect.h"
1313
#include "machine.h"
1414
#include "syscall.h"
15-
#include "openpie_mcu.h"
1615
#include <stdarg.h>
1716

1817
#define _debug(s) __syscall2(SYS_DEBUG, (int)s, (int)strlen(s));
@@ -50,11 +49,8 @@ int main(int argc, char **argv) {
5049
mp_pystack_init(&pystack, &pystack[MP_ARRAY_SIZE(pystack)]);
5150
#endif
5251

53-
size_t ram_size = (size_t)OPENPIE_CONTROLLER->RAM_SIZE;
54-
if (!ram_size)
55-
gc_init(&_ram_start, &_ram_end);
56-
else
57-
gc_init(&_ram_start, (&_ram_start) + ram_size);
52+
size_t ram_size = (size_t) __syscall1(SYS_INFO, SYS_INFO_RAM_SIZE);
53+
gc_init(&_ram_start, (&_ram_start) + ram_size);
5854

5955
mp_init();
6056
mp_obj_list_init(mp_sys_path, 0);
@@ -88,13 +84,8 @@ int main(int argc, char **argv) {
8884

8985
nlr_pop();
9086
} else {
91-
if (nlr_push(&nlr) == 0) {
92-
mp_obj_print_exception(&debug_print, (mp_obj_t) nlr.ret_val);
93-
mp_deinit();
94-
nlr_pop();
95-
} else {
96-
__fatal_error("unexpected error");
97-
}
87+
mp_obj_print_exception(&debug_print, (mp_obj_t) nlr.ret_val);
88+
mp_deinit();
9889
}
9990

10091
return 0;

src/modmachine.c

Lines changed: 29 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
#include "py/objstr.h"
1212
#include "py/runtime.h"
1313
#include "openpie_vfs.h"
14-
#include "openpie_mcu.h"
1514
#include "syscall.h"
1615
#include "msgpack.h"
1716
#include "py/mphal.h"
@@ -129,15 +128,36 @@ STATIC mp_obj_t usystem_repl_call(mp_obj_t func, mp_obj_t locals_obj) {
129128
MP_DEFINE_CONST_FUN_OBJ_2(usystem_repl_call_obj, usystem_repl_call);
130129

131130

132-
mp_obj_t print_hook = NULL;
131+
mp_obj_t interrupt_hook_obj = mp_const_none;
132+
133+
STATIC mp_obj_t usystem_interrupt_hook(mp_obj_t hook) {
134+
interrupt_hook_obj = hook;
135+
return mp_const_none;
136+
}
137+
138+
MP_DEFINE_CONST_FUN_OBJ_1(usystem_interrupt_hook_obj, usystem_interrupt_hook);
139+
140+
141+
mp_obj_t print_hook_obj = mp_const_none;
133142

134143
STATIC mp_obj_t usystem_print_hook(mp_obj_t hook) {
135-
print_hook = hook;
144+
print_hook_obj = hook;
136145
return mp_const_none;
137146
}
138147

139148
MP_DEFINE_CONST_FUN_OBJ_1(usystem_print_hook_obj, usystem_print_hook);
140149

150+
151+
mp_obj_t input_hook_obj = mp_const_none;
152+
153+
STATIC mp_obj_t usystem_input_hook(mp_obj_t hook) {
154+
input_hook_obj = hook;
155+
return mp_const_none;
156+
}
157+
158+
MP_DEFINE_CONST_FUN_OBJ_1(usystem_input_hook_obj, usystem_input_hook);
159+
160+
141161
STATIC mp_obj_t usystem_invoke(size_t n_args, const mp_obj_t *args) {
142162
byte *data = NULL;
143163
size_t size = 0;
@@ -186,12 +206,13 @@ STATIC mp_obj_t usystem_invoke(size_t n_args, const mp_obj_t *args) {
186206
MP_DEFINE_CONST_FUN_OBJ_VAR(usystem_invoke_obj, 2, usystem_invoke);
187207

188208

189-
STATIC mp_obj_t usystem_signal() {
190-
void *result = (void *) __syscall1(SYS_REQUEST, 0); // 0 = signal
209+
STATIC mp_obj_t usystem_signal(mp_obj_t ticks_obj) {
210+
mp_int_t ticks = mp_obj_get_int(ticks_obj);
211+
void *result = (void *) __syscall2(SYS_SIGNAL, SYS_SIGNAL_REQUEST, (int) ticks); // sleep with ticks
191212
return parse_2(result);
192213
}
193214

194-
MP_DEFINE_CONST_FUN_OBJ_0(usystem_signal_obj, usystem_signal);
215+
MP_DEFINE_CONST_FUN_OBJ_1(usystem_signal_obj, usystem_signal);
195216

196217

197218
STATIC mp_obj_t usystem_components() {
@@ -237,28 +258,6 @@ STATIC mp_obj_t usystem_annotations(mp_obj_t address_obj, mp_obj_t method_obj) {
237258
MP_DEFINE_CONST_FUN_OBJ_2(usystem_annotations_obj, usystem_annotations);
238259

239260

240-
mp_obj_t usystem_set_stdin_char(mp_obj_t obj) {
241-
if (MP_OBJ_IS_INT(obj)) {
242-
mp_int_t value = mp_obj_get_int(obj);
243-
OPENPIE_IO->RXR = value;
244-
return mp_const_true;
245-
}
246-
247-
return mp_const_false;
248-
}
249-
250-
MP_DEFINE_CONST_FUN_OBJ_1(usystem_set_stdin_char_obj, usystem_set_stdin_char);
251-
252-
253-
mp_obj_t usystem_get_stdout_str() {
254-
void *result = (void *) __syscall1(SYS_LEGACY, SYS_LEGACY_usystem_get_stdout_str);
255-
return parse_2(result);
256-
}
257-
258-
MP_DEFINE_CONST_FUN_OBJ_0(usystem_get_stdout_str_obj, usystem_get_stdout_str);
259-
260-
261-
262261
mp_obj_t usystem_shutdown() {
263262
__syscall1(SYS_CONTROL, SYS_CONTROL_SHUTDOWN);
264263
__fatal_error("shutdown failure");
@@ -293,23 +292,21 @@ STATIC const mp_rom_map_elem_t machine_module_globals_table[] = {
293292
{MP_ROM_QSTR(MP_QSTR_repl_compile), MP_ROM_PTR(&usystem_repl_compile_obj)},
294293
{MP_ROM_QSTR(MP_QSTR_repl_call), MP_ROM_PTR(&usystem_repl_call_obj)},
295294

295+
{MP_ROM_QSTR(MP_QSTR_interrupt_hook), MP_ROM_PTR(&usystem_interrupt_hook_obj)},
296+
{MP_ROM_QSTR(MP_QSTR_input_hook), MP_ROM_PTR(&usystem_input_hook_obj)},
296297
{MP_ROM_QSTR(MP_QSTR_print_hook), MP_ROM_PTR(&usystem_print_hook_obj)},
297298
{MP_ROM_QSTR(MP_QSTR_invoke), MP_ROM_PTR(&usystem_invoke_obj)},
298299
{MP_ROM_QSTR(MP_QSTR_signal), MP_ROM_PTR(&usystem_signal_obj)},
299300
{MP_ROM_QSTR(MP_QSTR_components), MP_ROM_PTR(&usystem_components_obj)},
300301
{MP_ROM_QSTR(MP_QSTR_methods), MP_ROM_PTR(&usystem_methods_obj)},
301302
{MP_ROM_QSTR(MP_QSTR_annotations), MP_ROM_PTR(&usystem_annotations_obj)},
302-
{MP_ROM_QSTR(MP_QSTR_set_stdin_char), MP_ROM_PTR(&usystem_set_stdin_char_obj)},
303-
{MP_ROM_QSTR(MP_QSTR_get_stdout_str), MP_ROM_PTR(&usystem_get_stdout_str_obj)},
304303
{MP_ROM_QSTR(MP_QSTR_shutdown), MP_ROM_PTR(&usystem_shutdown_obj)},
305304
{MP_ROM_QSTR(MP_QSTR_reboot), MP_ROM_PTR(&usystem_reboot_obj)},
306305
{MP_ROM_QSTR(MP_QSTR_debug), MP_ROM_PTR(&usystem_debug_obj)},
307306

308-
/*
309307
{MP_ROM_QSTR(MP_QSTR_mem8), MP_ROM_PTR(&machine_mem8_obj)},
310308
{MP_ROM_QSTR(MP_QSTR_mem16), MP_ROM_PTR(&machine_mem16_obj)},
311309
{MP_ROM_QSTR(MP_QSTR_mem32), MP_ROM_PTR(&machine_mem32_obj)},
312-
*/
313310
};
314311
STATIC MP_DEFINE_CONST_DICT(machine_module_globals, machine_module_globals_table);
315312

src/modmachine.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
11
#ifndef MICROPY_INCLUDED_MODMACHINE_H
22
#define MICROPY_INCLUDED_MODMACHINE_H
33

4-
#include "openpie_mcu.h"
5-
6-
74
#endif

src/modutime.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,15 @@
66
#include "py/obj.h"
77
#include "lib/timeutils/timeutils.h"
88
#include "extmod/utime_mphal.h"
9-
#include "openpie_mcu.h"
109

1110
STATIC const mp_rom_map_elem_t time_module_globals_table[] = {
1211
{MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_utime)},
1312

1413
{MP_ROM_QSTR(MP_QSTR_sleep), MP_ROM_PTR(&mp_utime_sleep_obj)},
1514
{MP_ROM_QSTR(MP_QSTR_sleep_ms), MP_ROM_PTR(&mp_utime_sleep_ms_obj)},
15+
{MP_ROM_QSTR(MP_QSTR_sleep_us), MP_ROM_PTR(&mp_utime_sleep_us_obj)},
1616
{MP_ROM_QSTR(MP_QSTR_ticks_ms), MP_ROM_PTR(&mp_utime_ticks_ms_obj)},
17+
{MP_ROM_QSTR(MP_QSTR_ticks_us), MP_ROM_PTR(&mp_utime_ticks_us_obj)},
1718
{MP_ROM_QSTR(MP_QSTR_ticks_cpu), MP_ROM_PTR(&mp_utime_ticks_cpu_obj)},
1819
{MP_ROM_QSTR(MP_QSTR_ticks_add), MP_ROM_PTR(&mp_utime_ticks_add_obj)},
1920
{MP_ROM_QSTR(MP_QSTR_ticks_diff), MP_ROM_PTR(&mp_utime_ticks_diff_obj)},

src/mphalport.c

Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,48 @@
11
#include <stdint.h>
22
#include <stdio.h>
3+
#include <string.h>
34

45
#include "py/runtime.h"
56
#include "py/objstr.h"
6-
#include "openpie_mcu.h"
77
#include "mphalport.h"
88
#include "syscall.h"
99

10-
extern mp_obj_t print_hook;
10+
extern mp_obj_t interrupt_hook_obj;
11+
extern mp_obj_t input_hook_obj;
12+
extern mp_obj_t print_hook_obj;
1113

1214
int mp_hal_stdin_rx_chr(void) {
13-
unsigned char c = 0;
14-
while (c == 0) {
15-
mp_handle_pending();
16-
c = OPENPIE_IO->RXR;
15+
if (input_hook_obj == mp_const_none) {
16+
return 0;
17+
} else {
18+
mp_obj_t obj = mp_call_function_0(input_hook_obj);
19+
return (int) mp_obj_get_int(obj);
1720
}
21+
}
1822

19-
return c;
23+
void mp_hal_stdout_tx_str(const char *str) {
24+
mp_hal_stdout_tx_strn(str, strlen(str));
2025
}
2126

2227
void mp_hal_stdout_tx_strn(const char *str, mp_uint_t len) {
23-
mp_obj_t signal_buf = mp_obj_new_str(str, len);
24-
nlr_buf_t nlr;
25-
26-
if (nlr_push(&nlr) == 0) {
27-
mp_obj_t handler = mp_obj_dict_get(
28-
MP_OBJ_FROM_PTR(&MP_STATE_VM(dict_main)),
29-
MP_OBJ_NEW_QSTR(MP_QSTR_print_handler)
30-
);
31-
32-
mp_call_function_1_protected(handler, signal_buf);
33-
nlr_pop();
34-
} else {
28+
if (print_hook_obj == mp_const_none) {
3529
__syscall2(SYS_DEBUG, (int)str, (int)len);
30+
} else {
31+
mp_obj_t str_obj = mp_obj_new_str(str, len);
32+
mp_call_function_1(print_hook_obj, str_obj);
3633
}
3734
}
3835

36+
void mp_hal_stdout_tx_strn_cooked(const char *str, size_t len) {
37+
mp_hal_stdout_tx_strn(str, len);
38+
}
39+
3940
void mp_hal_delay_ms(mp_uint_t ms) {
4041
uint32_t start = mp_hal_ticks_ms();
4142
extern void mp_handle_pending(void);
4243
while (mp_hal_ticks_ms() - start < ms) {
4344
mp_handle_pending();
44-
OPENPIE_CONTROLLER->IDLE = 1;
45+
// OPENPIE_CONTROLLER->IDLE = 1;
4546
}
4647
}
4748

@@ -52,14 +53,15 @@ void mp_hal_delay_us(mp_uint_t us) {
5253
}
5354
}
5455

55-
mp_uint_t mp_hal_ticks_us(void) {
56-
return mp_hal_ticks_ms() * 1000;
56+
mp_uint_t mp_hal_ticks_ms(void) {
57+
return (mp_uint_t) __syscall1(SYS_TIMER, SYS_TIMER_TICKS_MS);
5758
}
5859

59-
mp_uint_t mp_hal_ticks_ms(void) {
60-
return RTC->TICKS_MS;
60+
mp_uint_t mp_hal_ticks_us(void) {
61+
return (mp_uint_t) __syscall1(SYS_TIMER, SYS_TIMER_TICKS_US);
6162
}
6263

6364
mp_uint_t mp_hal_ticks_cpu(void) {
64-
return OPENPIE_CONTROLLER->INSNS;
65+
// return OPENPIE_CONTROLLER->INSNS;
66+
return 0; // return (mp_uint_t) __syscall1(SYS_TIMER, SYS_TIMER_TICKS_CPU);
6567
}

src/mphalport.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
#include "py/obj.h"
22
#include "modmachine.h"
33

4+
int mp_hal_stdin_rx_chr(void);
5+
6+
void mp_hal_stdout_tx_str(const char *str);
7+
8+
void mp_hal_stdout_tx_strn(const char *str, size_t len);
9+
10+
void mp_hal_stdout_tx_strn_cooked(const char *str, size_t len);
11+
412
void mp_hal_delay_ms(mp_uint_t ms);
513

614
void mp_hal_delay_us(mp_uint_t us);
@@ -12,5 +20,3 @@ mp_uint_t mp_hal_ticks_us(void);
1220
mp_uint_t mp_hal_ticks_cpu(void);
1321

1422
void mp_hal_set_interrupt_char(int c);
15-
16-
static inline void mp_hal_delay_us_fast(uint32_t us) { return; }

src/openpie_mcu.h

Lines changed: 0 additions & 32 deletions
This file was deleted.

0 commit comments

Comments
 (0)