From f39868397acdc4cdcb71b58926dee62327933336 Mon Sep 17 00:00:00 2001 From: Mart Lubbers <mart@martlubbers.net> Date: Wed, 5 Apr 2017 11:13:11 +0200 Subject: [PATCH] update --- client/.gitignore | 1 + client/client.c | 30 +++++------- client/linux/client | Bin 37712 -> 0 bytes client/mem.c | 3 ++ client/task.c | 112 +++++++++++++++++++++++++++++++------------- client/task.h | 15 +++--- 6 files changed, 103 insertions(+), 58 deletions(-) delete mode 100755 client/linux/client create mode 100644 client/mem.c diff --git a/client/.gitignore b/client/.gitignore index e6a8598..9308325 100644 --- a/client/.gitignore +++ b/client/.gitignore @@ -3,3 +3,4 @@ main build *.bin .dep +linux/client diff --git a/client/client.c b/client/client.c index 6502fb7..59c611f 100644 --- a/client/client.c +++ b/client/client.c @@ -79,34 +79,28 @@ void loop(void) #endif debug("Loop"); - int ct; + struct task *t; long cyclestart; - struct task *curtask; read_message(); //Run tasks cyclestart = getmillis(); - for(ct = 0; ct<MAXTASKS; ct++){ - //See whether the task is even in use - if((curtask = task_get(ct)) == NULL){ -// debug("Task %d not implemented\n", ct); - continue; - } + for(struct task *t = task_head(); t != NULL; t = task_next(t)){ //interrupt task - if(is_interrupt_task(curtask) && had_interrupt(curtask)){ - debug("Interrupt task %d not implemented", ct); - run_task(curtask); + if(is_interrupt_task(t) && had_interrupt(t)){ + debug("Interrupt task %d not implemented", t->taskid); + run_task(t); //Interval task, and interval passed - } else if(cyclestart-curtask->lastrun > curtask->interval){ - debug("Running interval task: %d", ct); - run_task(curtask); + } else if(cyclestart-t->lastrun > t->interval){ + debug("Running interval task: %d", t->taskid); + run_task(t); //Oneshot task, thus disable - if(curtask->interval == 0){ - curtask->used = false; - } - curtask->lastrun = cyclestart; +// if(t->interval == 0){ +// curtask->used = false; +// } + t->lastrun = cyclestart; } } } diff --git a/client/linux/client b/client/linux/client deleted file mode 100755 index b269fc2426cdf10b7d7f99a5cc5cf001ea469782..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37712 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%0AwZ6kj*wJJI7C&1+A11=d$Lg4m6K*@EC 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 diff --git a/client/mem.c b/client/mem.c new file mode 100644 index 0000000..38bd6bd --- /dev/null +++ b/client/mem.c @@ -0,0 +1,3 @@ +#include <stdlib.h> + +struct task *task_head = NULL; diff --git a/client/task.c b/client/task.c index 1c16ce5..12789ce 100644 --- a/client/task.c +++ b/client/task.c @@ -5,52 +5,62 @@ #include "spec.h" #include "interface.h" -struct task tasks[MAXTASKS]; +#define TASKSPACE 128 + +uint8_t taskspace[TASKSPACE] = {0}; +uint8_t *spacepointer = (uint8_t *)&taskspace; +uint8_t taskid = 0; +struct task *head = NULL; void task_init(void) { - memset(&tasks, 0, sizeof(struct task)*MAXTASKS); + memset(&taskspace, 0, TASKSPACE); + head = NULL; } void task_register(void) { - uint8_t ct; - uint16_t i; + int i; + if(spacepointer+sizeof(struct task) > taskspace+TASKSPACE){ + die("Out of memory... Not enough to allocate taskstruct"); + } - for(ct = 0; ct<MAXTASKS; ct++) - if(!tasks[ct].used) - break; - if(ct == MAXTASKS) - die("Trying to add too much tasks..."); + //We haven't had a task before, therefore we initialize head + struct task *t = (struct task *)spacepointer; + if(head == NULL) { + head = t; + } - memset(&tasks[ct], 0, sizeof(struct task)); //Read interval - tasks[ct].interval = read16(); - debug("interval: %d\n", tasks[ct].interval); + t->interval = read16(); + debug("interval: %d\n", t->interval); //Interrupt task - if(is_interrupt_task(&tasks[ct])) { + if(is_interrupt_task(t)) { } //Read tasklength - tasks[ct].tlen = read16(); - debug("task interval: %d, length: %d\n", - tasks[ct].interval, tasks[ct].tlen); + t->tasklength = read16(); + debug("task interval: %d, length: %d\n", t->interval, t->tasklength); + + if(spacepointer+t->tasklength > taskspace+TASKSPACE){ + die("Out of memory... Not enough to allocate bytes"); + } + + spacepointer += t->tasklength; - if(tasks[ct].tlen > MAXTASKSIZE) - die("Task is too long: %d", tasks[ct].tlen); //Read task bytecode - for(i = 0; i<tasks[ct].tlen; i++){ - tasks[ct].bc[i] = read_byte(); + 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", tasks[ct].tlen); - tasks[ct].used = true; - tasks[ct].lastrun = 0L; + debug("Received a task of length %d", t->tasklength); + t->lastrun = 0L; + t->taskid = taskid++; write_byte('t'); - write16(ct); + write16(t->taskid); write_byte('\n'); } @@ -66,16 +76,54 @@ bool had_interrupt(struct task* t) (void)t; } -void task_delete(void) +struct task *task_head(void) { - uint8_t c = read16(); - tasks[c].used = false; - write_byte('d'); - write16(c); - write_byte('\n'); + return head; +} + +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; } -struct task *task_get(int num) +void task_delete(void) { - return tasks[num].used ? &tasks[num] : NULL; + uint8_t c = read16(); + struct task *t = NULL; + 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++){ + 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'); + } } diff --git a/client/task.h b/client/task.h index 6542b1c..375aafc 100644 --- a/client/task.h +++ b/client/task.h @@ -1,8 +1,5 @@ #ifndef TASK_H #define TASK_H - -#define MAXTASKSIZE 1024 - #ifdef __cplusplus extern "C" { #endif @@ -11,20 +8,22 @@ extern "C" { #include <stdbool.h> struct task { - uint8_t bc[MAXTASKSIZE]; - uint16_t tlen; + uint16_t tasklength; uint16_t interval; - long lastrun; - bool used; + unsigned long lastrun; + uint8_t taskid; + struct task *next; + uint8_t *bc; }; bool is_interrupt_task(struct task* t); bool had_interrupt(struct task* t); +struct task *task_head(void); +struct task *task_next(struct task *t); void task_init(void); void task_register(void); void task_delete(void); -struct task *task_get(int num); #ifdef __cplusplus } -- 2.20.1