From 9f61013faf98f8909e0853954218ec10c3b3c6fb Mon Sep 17 00:00:00 2001 From: Clyne Sullivan Date: Thu, 22 Feb 2018 11:14:33 -0500 Subject: things should work now --- src/clock.c | 2 +- src/heap.c | 19 +++++++++++++++---- src/main.c | 4 ++-- src/task.c | 10 ++-------- 4 files changed, 20 insertions(+), 15 deletions(-) (limited to 'src') diff --git a/src/clock.c b/src/clock.c index ab92386..7cb4ecf 100644 --- a/src/clock.c +++ b/src/clock.c @@ -54,7 +54,7 @@ void SysTick_Handler(void) // just keep counting ticks++; - if (!(ticks % 10)) + if (!(ticks % 4)) SCB->ICSR |= SCB_ICSR_PENDSVSET_Msk; asm("mov lr, %0; bx lr" :: "r" (lr)); diff --git a/src/heap.c b/src/heap.c index 5d32a14..0502e76 100644 --- a/src/heap.c +++ b/src/heap.c @@ -19,16 +19,27 @@ void heap_init(void *buf) // what to do... } +uint32_t heap_used(void) +{ + uint32_t total = 0; + alloc_t *a = &root; + while (a->next > 1) { + total += a->size; + a = (void *)(a->next & ~(1)); + } + return total; +} + void *malloc(uint32_t size) { task_hold(1); - if (size < 16) - size = 16; + if (size < HEAP_ALIGN) + size = HEAP_ALIGN; alloc_t *node = &root; while (node->next & 1 || node->size < size) { if ((node->next & ~(1)) == 0) { node->next |= (uint32_t)(heap_end + HEAP_ALIGN) & ~(HEAP_ALIGN - 1); - heap_end += 2 * HEAP_ALIGN + size; + heap_end += HEAP_ALIGN + size; node = (void *)(node->next & ~(1)); node->next = 0; node->size = size; @@ -46,7 +57,7 @@ void *malloc(uint32_t size) void *calloc(uint32_t count, uint32_t size) { uint8_t *buf = malloc(count * size); - for (uint8_t i = 0; i < count * size; i++) + for (uint32_t i = 0; i < count * size; i++) buf[i] = 0; return buf; } diff --git a/src/main.c b/src/main.c index 0245801..a946609 100644 --- a/src/main.c +++ b/src/main.c @@ -107,7 +107,7 @@ int script_color(interpreter *it) igetarg_integer(it, 2)); variable v; v.valtype = INTEGER; - v.value = c; + INT(&v) = c; v.svalue = 0; isetstr(&v); iret(it, &v); @@ -120,7 +120,7 @@ int script_rand(interpreter *it) next = (next * 182 + 1829) % igetarg_integer(it, 0); variable v; v.valtype = INTEGER; - v.value = next; + INT(&v) = next; v.svalue = 0; isetstr(&v); iret(it, &v); diff --git a/src/task.c b/src/task.c index 13e4e75..d0cb3f1 100644 --- a/src/task.c +++ b/src/task.c @@ -54,7 +54,6 @@ void task_init(void (*init)(void)) task_disable = 0; init(); - // you dirty dirty dog /*asm("\ cpsie i; \ mov pc, %0; \ @@ -65,9 +64,8 @@ void task_start(void (*task)(void), uint16_t stackSize) { task_hold(1); task_t *t = task_create(task, stackSize); - task_t *next = (task_t *)current->next; + t->next = current->next; current->next = t; - t->next = next; task_hold(0); } @@ -96,12 +94,8 @@ void PendSV_Handler(void) msr psp, r0; \ isb; \ dsb; \ - " :: "r" (current->sp)); - - // end - asm("\ cpsie i; \ bx lr; \ - "); + " :: "r" (current->sp)); } -- cgit v1.2.3