@@ -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-
9791const 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