#include <stdint.h>
void heap_init(void *buf);
+uint32_t heap_used(void);
void *malloc(uint32_t size);
void *calloc(uint32_t count, uint32_t size);
set y (y + 20)
while (y < 270)
-line 80 250 380 90 511
+#line 80 250 380 90 511
+set purple 511
+do
+ rand 219 > x
+ rand 379 > y
+ rand 219 > i
+ rand 379 > j
+ line (x + 50) (y + 50) (i + 50) (j + 50) purple
+ delay 1000
+ set purple (purple + 11)
+while (1)
#!/bin/bash
-openocd -f /usr/share/openocd/scripts/board/st_nucleo_l476rg.cfg \
- -c "init; reset halt; flash write_image erase main.hex; reset run; exit"
+#openocd -f /usr/share/openocd/scripts/board/st_nucleo_l476rg.cfg \
+# -c "init; reset halt; flash write_image erase main.hex; reset run; exit"
-#openocd -f /usr/share/openocd/scripts/board/st_nucleo_l476rg.cfg > /dev/null &
-#gdb-multiarch
+openocd -f /usr/share/openocd/scripts/board/st_nucleo_l476rg.cfg > /dev/null &
+gdb-multiarch -iex "target remote localhost:3333" out/main.elf
// just keep counting
ticks++;
- if (!(ticks % 10))
+ if (!(ticks % 4))
SCB->ICSR |= SCB_ICSR_PENDSVSET_Msk;
asm("mov lr, %0; bx lr" :: "r" (lr));
// 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;
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;
}
igetarg_integer(it, 2));\r
variable v;\r
v.valtype = INTEGER;\r
- v.value = c;\r
+ INT(&v) = c;\r
v.svalue = 0;\r
isetstr(&v);\r
iret(it, &v);\r
next = (next * 182 + 1829) % igetarg_integer(it, 0);\r
variable v;\r
v.valtype = INTEGER;\r
- v.value = next;\r
+ INT(&v) = next;\r
v.svalue = 0;\r
isetstr(&v);\r
iret(it, &v);\r
task_disable = 0;
init();
- // you dirty dirty dog
/*asm("\
cpsie i; \
mov pc, %0; \
{
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);
}
msr psp, r0; \
isb; \
dsb; \
- " :: "r" (current->sp));
-
- // end
- asm("\
cpsie i; \
bx lr; \
- ");
+ " :: "r" (current->sp));
}