aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/clock.c2
-rw-r--r--src/heap.c19
-rw-r--r--src/main.c4
-rw-r--r--src/task.c10
4 files changed, 20 insertions, 15 deletions
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));
}