#include "task.h"
#include "spec.h"
#include "interface.h"
+#include "mem.h"
-#define TASKSPACE 128
+extern uint8_t *mem_top;
+extern uint8_t *mem_bottom;
+extern uint8_t *mem_task;
+extern uint8_t *mem_sds;
-uint8_t taskspace[TASKSPACE] = {0};
-uint8_t *spacepointer = (uint8_t *)&taskspace;
uint8_t taskid = 0;
-struct task *head = NULL;
-
-void task_init(void)
-{
- memset(&taskspace, 0, TASKSPACE);
- head = NULL;
-}
void task_register(void)
{
+ debug("free memory: %lu\n", mem_free());
int i;
- if(spacepointer+sizeof(struct task) > taskspace+TASKSPACE){
+ if(mem_task+sizeof(struct task) > mem_sds){
die("Out of memory... Not enough to allocate taskstruct");
}
- //We haven't had a task before, therefore we initialize head
- struct task *t = (struct task *)spacepointer;
- if(head == NULL) {
- head = t;
- }
+ struct task *t = (struct task *)mem_task;
//Read interval
t->interval = read16();
t->tasklength = read16();
debug("task interval: %d, length: %d\n", t->interval, t->tasklength);
- if(spacepointer+t->tasklength > taskspace+TASKSPACE){
+ if(mem_task+t->tasklength > mem_sds){
die("Out of memory... Not enough to allocate bytes");
}
- spacepointer += t->tasklength;
+ mem_task += sizeof(struct task);
+ t->bc = mem_task;
+ mem_task += t->tasklength;
//Read task bytecode
for(i = 0; i<t->tasklength; i++){
t->bc[i] = read_byte();
}
+
//Return the task number for later removal
debug("Received a task of length %d", t->tasklength);
t->lastrun = 0L;
write_byte('t');
write16(t->taskid);
write_byte('\n');
+ debug("free memory: %lu\n", mem_free());
}
bool is_interrupt_task(struct task *t)
struct task *task_head(void)
{
- return head;
+ return mem_task == mem_bottom ? NULL : (struct task *)mem_bottom;
}
struct task *task_next(struct task *t)
{
- if(t == NULL){
- return NULL;
- }
-
- uint8_t *next = (uint8_t *)t;
- next += sizeof(struct task);
- next += t->tasklength;
-
- return next > spacepointer ? NULL : (struct task *)next;
+ uint8_t *next = (uint8_t *)t + sizeof(struct task) + t->tasklength;
+ return next >= mem_task ? NULL : (struct task *)next;
}
-void task_delete(void)
+void task_delete(uint8_t c)
{
- uint8_t c = read16();
- struct task *t = NULL;
+ debug("Going to delete task: %i", c);
+ debug("mem_task: %p", mem_task);
+ struct task *t = task_head();
while(t != NULL){
if(t->taskid == c){
break;
}
t = task_next(t);
}
+
if(t != NULL){
//We found the task, now we move everything from the end of the task up
//to the spacepointer right
uint8_t *start = (uint8_t *)t;
uint8_t *end = start + sizeof(struct task) + t->tasklength;
- debug("Moving %lu bytes\n", spacepointer-end);
- for(int i = 0; i<spacepointer-end; i++){
+ debug("Moving %lu bytes\n", mem_task-end);
+ for(int i = 0; i<mem_task-end; i++){
start[i] = end[i];
}
//Decrement the spacepointer
- spacepointer -= end-start;
-
- if(t == head){
- head = task_next(t);
- }
-
- //Write acknowledgement
- write_byte('d');
- write16(c);
- write_byte('\n');
+ mem_task -= end-start;
}
+ debug("mem_task: %p", mem_task);
}