diff --git a/qemu-arm/test_main.c b/qemu-arm/test_main.c
index 44f9cc6663bb079fdc3e63ffff5f1c886ead79a8..6b935bbab072dfc8df5a4c4bd73c1fe884e7509f 100644
--- a/qemu-arm/test_main.c
+++ b/qemu-arm/test_main.c
@@ -15,8 +15,14 @@
 #include "tinytest.h"
 #include "tinytest_macros.h"
 
+#define HEAP_SIZE (128 * 1024)
+STATIC void *heap;
+
 void do_str(const char *src);
 inline void do_str(const char *src) {
+    gc_init(heap, (char*)heap + HEAP_SIZE);
+    mp_init();
+
     mp_lexer_t *lex = mp_lexer_new_from_str_len(MP_QSTR__lt_stdin_gt_, src, strlen(src), 0);
     if (lex == NULL) {
         tt_abort_msg("Lexer initialization error");
@@ -36,13 +42,13 @@ inline void do_str(const char *src) {
             // TODO: That can be always true, we should set up convention to
             // use specific exit code as skip indicator.
             tinytest_set_test_skipped_();
-            return;
+            goto end;
         }
         mp_obj_print_exception(&mp_plat_print, exc);
         tt_abort_msg("Uncaught exception");
     }
 end:
-    ;
+    mp_deinit();
 }
 
 #include "genhdr/tests.h"
@@ -51,11 +57,8 @@ int main() {
     const char a[] = {"sim"};
     mp_stack_ctrl_init();
     mp_stack_set_limit(10240);
-    void *heap = malloc(256 * 1024);
-    gc_init(heap, (char*)heap + 256 * 1024);
-    mp_init();
+    heap = malloc(HEAP_SIZE);
     int r = tinytest_main(1, (const char **) a, groups);
-    mp_deinit();
     printf( "status: %i\n", r);
     return r;
 }