diff --git a/examples/first/first.c b/examples/first/first.c index 9603d54..9e6b247 100644 --- a/examples/first/first.c +++ b/examples/first/first.c @@ -4,13 +4,15 @@ int main(void) { uint8_t value = 0; + card_os_put_rect((card_os_rect){ 0, 0, 0, 0, 0, 240, 320 }); + + card_os_put_rect((card_os_rect){ + .r = 0xFF, .g = 0xFF, .b = 0xFF, .x = 60, .y = 80, .w = 120, .h = 160 }); + while (value < 250) { - card_os_put_rect((card_os_rect){ - .r = value++, .g = 0, .b = 0, .x = 0, .y = 0, .w = 240, .h = 320 }); - card_os_put_rect((card_os_rect){ - .r = 0xFF, .g = 0xFF, .b = 0xFF, .x = 60, .y = 80, .w = 60, .h = 60 }); + .r = value++, .g = 0, .b = 0, .x = 0, .y = 0, .w = 60, .h = 60 }); } return 0; diff --git a/include/user/card-os.h b/include/user/card-os.h index 56bda63..267fcb7 100644 --- a/include/user/card-os.h +++ b/include/user/card-os.h @@ -5,7 +5,6 @@ typedef enum { - OS_CMD_TERMINATE_PROGRAM, OS_CMD_SBRK, OS_CMD_DRAW_RECT } os_command; diff --git a/src/card-os-user.c b/src/card-os-user.c index 046b34d..d2b95a7 100644 --- a/src/card-os-user.c +++ b/src/card-os-user.c @@ -13,13 +13,7 @@ ssize_t _read(int file, void* ptr, size_t len) { return 0; } ssize_t _write(int file, const void* ptr, size_t len) { return len; } -void _exit(int status) -{ - oscall(&(os_message){ .command = OS_CMD_TERMINATE_PROGRAM, .data = NULL }); - while (1) - { - } -} +void _exit(int status) {} void* _sbrk(ptrdiff_t incr) { @@ -37,12 +31,12 @@ extern uint8_t __bss_start__; extern uint8_t __bss_end__; int main(void); -__attribute__((section(".start"))) void _start(void) +__attribute__((section(".start"))) int _start(void) { for (uint8_t* p = &__bss_start__; p < &__bss_end__; p++) { *p = 0; } - _exit(main()); + return main(); } diff --git a/src/card-os.c b/src/card-os.c index cca2ca8..309c372 100644 --- a/src/card-os.c +++ b/src/card-os.c @@ -89,14 +89,15 @@ void tud_vendor_rx_cb(uint8_t itf, const uint8_t* buffer, uint16_t bufsize) case RECV_LOW8_LENGTH: program_length |= buffer[bufidx]; recv_status = RECV_PROGRAM; + memset(&__user_ram_start, 0, 0x10000); break; case RECV_PROGRAM: (&__user_ram_start)[program_write_index++] = buffer[bufidx]; if (program_write_index == program_length) { - __dmb(); user_program = (user_program_fn)((uintptr_t)&__user_ram_start | 1); + __dmb(); __sev(); recv_status = RECV_WAITING; } @@ -113,25 +114,19 @@ static volatile os_ring_buffer core1_buffer void core1_entry(void) { - while (!user_program) - { - __wfe(); - } - - user_program(); - - // send message to terminate core 1 - int index = -1; - while (index < 0) - { - index = os_ring_buffer_write(&core1_buffer, - &(os_message){ .command = 1, .data = NULL }); - } - multicore_fifo_push_blocking(index); - - // stall until reset while (true) { + while (!user_program) + { + __wfe(); + } + + user_program_fn copied = user_program; + user_program = NULL; + __dmb(); + __sev(); + + int retrval = copied(); } } @@ -191,14 +186,6 @@ void os_handle_message(const os_message* msg, os_message* out) { switch (msg->command) { - case OS_CMD_TERMINATE_PROGRAM: - multicore_fifo_drain(); - multicore_reset_core1(); - __dmb(); - user_program = NULL; - __sev(); - multicore_launch_core1(core1_entry); - break; case OS_CMD_SBRK: os_sbrk(msg->data, &out->data); break;