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

Commit 4f91c05

Browse files
committed
Call_handler 개선하고 Signal_Handler 삭제
1 parent f41fb93 commit 4f91c05

1 file changed

Lines changed: 23 additions & 31 deletions

File tree

src/machine.c

Lines changed: 23 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -54,52 +54,44 @@ void Reset_Handler(void) {
5454
}
5555

5656

57-
STATIC mp_obj_t signal_hook0(mp_obj_t none_obj) {
58-
mp_call_function_1(signal_hook_obj, MP_OBJ_NEW_SMALL_INT(0));
59-
return mp_const_none;
60-
}
61-
62-
MP_DEFINE_CONST_FUN_OBJ_1(signal_hook0_obj, signal_hook0);
63-
64-
65-
void Signal_Handler() {
57+
int Call_Handler(void *handler, int n_args, int *args) {
6658
nlr_buf_t nlr;
6759
if (nlr_push(&nlr) == 0) {
68-
if (signal_hook_obj != mp_const_none) {
69-
mp_sched_schedule((mp_obj_t)&signal_hook0_obj, mp_const_none);
60+
int result = 0;
61+
switch (n_args) {
62+
case 0:
63+
result = ((int (*)())handler)();
64+
break;
65+
case 1:
66+
result = ((int (*)(int))handler)(args[0]);
67+
break;
68+
case 2:
69+
result = ((int (*)(int, int))handler)(args[0], args[1]);
70+
break;
71+
case 3:
72+
result = ((int (*)(int, int, int))handler)(args[0], args[1], args[2]);
73+
break;
74+
case 4:
75+
result = ((int (*)(int, int, int, int))handler)(args[0], args[1], args[2], args[3]);
76+
break;
77+
default:
78+
__fatal_error("invalid n_args");
7079
}
7180

7281
nlr_pop();
82+
__syscall1(SYS_CONTROL_RETURN, result);
7383
} else {
74-
__fatal_error("Signal_Handler() fail");
84+
__syscall1(SYS_CONTROL_RETURN, 0);
7585
}
7686

77-
__syscall0(SYS_CONTROL_RETURN);
87+
__fatal_error("invalid control");
7888
}
7989

8090

81-
typedef int (*Handler)(int, int, int);
82-
83-
void Call_Handler(Handler handler, int a1, int a2, int a3) {
84-
__fatal_error("call handler called");
85-
nlr_buf_t nlr;
86-
if (nlr_push(&nlr) == 0) {
87-
int value = handler(a1, a2, a3);
88-
__syscall1(SYS_CONTROL_RETURN, value);
89-
nlr_pop();
90-
} else {
91-
// TODO: handle exception
92-
int value = -1;
93-
__syscall1(SYS_CONTROL_RETURN, value);
94-
}
95-
}
96-
9791
const uint32_t startup_vector[] __attribute__((section(".startup"))) = {
9892
(uint32_t) &_estack,
9993
(uint32_t) &Reset_Handler,
100-
(uint32_t) &Signal_Handler,
10194
(uint32_t) &Call_Handler,
102-
// TODO: increase memory size
10395
// TODO: add custom handler for detect failure (or just turn off computer?)
10496
};
10597

0 commit comments

Comments
 (0)