2020#include "py/gc.h"
2121#include "py/mperrno.h"
2222#include "py/persistentcode.h"
23+ #include "py/stackctrl.h"
2324#include "lib/utils/pyexec.h"
2425#include "lib/utils/interrupt_char.h"
2526
@@ -80,7 +81,7 @@ void nxt_init() {
8081 udp_init ();
8182 systick_wait_ms (100 );
8283 sound_freq (500 , 100 , 30 );
83- systick_wait_ms (1000 );
84+ systick_wait_ms (100 );
8485 display_init ();
8586 sp_init ();
8687 display_set_auto_update_period (DEFAULT_UPDATE_PERIOD );
@@ -102,7 +103,10 @@ void nxt_deinit() {
102103 shutdown (1 );
103104}
104105
105- static char * stack_top ;
106+ // defined in linker script
107+ extern uint32_t _estack ;
108+ extern uint32_t __bss_end__ ;
109+
106110#if MICROPY_ENABLE_GC
107111static char heap [PYBRICKS_HEAP_KB * 1024 ];
108112#endif
@@ -143,20 +147,21 @@ static const pbsys_user_program_callbacks_t user_program_callbacks = {
143147 .stdin_event = user_program_stdin_event_func ,
144148};
145149
150+ // Defined in linker script
151+ extern uint32_t _pb_user_mpy_size ;
152+ extern uint8_t _pb_user_mpy_data ;
153+
146154int main (int argc , char * * argv ) {
147- int stack_dummy ;
148- stack_top = (char * )& stack_dummy ;
149155
150156 pbio_init ();
151157 nxt_init ();
152158
159+ mp_stack_set_top (& _estack );
160+ mp_stack_set_limit ((char * )& _estack - (char * )& __bss_end__ - 1024 );
161+
153162 #if MICROPY_ENABLE_GC
154163 gc_init (heap , heap + sizeof (heap ));
155164 #endif
156-
157- // (re)boot message
158- mp_print_str (& mp_plat_print , "Pybricks\n" );
159-
160165 // Get system hardware ready
161166 pbsys_user_program_prepare (& user_program_callbacks );
162167 // make sure any pending events are handled before starting MicroPython
@@ -167,11 +172,29 @@ int main(int argc, char **argv) {
167172 mp_init ();
168173
169174 // Run a program
170- // TODO
175+ nlr_buf_t nlr ;
176+ if (nlr_push (& nlr ) == 0 ) {
177+ // run user .mpy file
178+ mp_reader_t reader ;
179+ mp_reader_new_mem (& reader , & _pb_user_mpy_data , _pb_user_mpy_size , 0 );
180+ mp_raw_code_t * raw_code = mp_raw_code_load (& reader );
181+ mp_obj_t module_fun = mp_make_function_from_raw_code (raw_code , MP_OBJ_NULL , MP_OBJ_NULL );
182+ mp_hal_set_interrupt_char (3 );
183+ mp_call_function_0 (module_fun );
184+ mp_hal_set_interrupt_char (-1 );
185+ mp_handle_pending (true);
186+ nlr_pop ();
187+ } else {
188+ // uncaught exception
189+ mp_hal_set_interrupt_char (-1 ); // disable interrupt
190+ mp_handle_pending (false); // clear any pending exceptions (and run any callbacks)
191+
192+ pbsys_user_program_unprepare ();
193+ mp_obj_print_exception (& mp_plat_print , (mp_obj_t )nlr .ret_val );
194+ }
171195
172196 // Uninitialize MicroPython and the system hardware
173197 mp_deinit ();
174- pbsys_user_program_unprepare ();
175198
176199 nxt_deinit ();
177200 return 0 ;
0 commit comments