32,21 → 32,23 |
*/ |
|
#include "kernel/kern.h" |
#include "time.h" |
#include "modules/elastic.h" |
#include <drivers/shark_keyb26.h> |
|
|
#define MAX_TASKS 7 |
|
extern unsigned int usleep(unsigned int usec); // include file for this?? |
|
/* A task that scrolls a number (the task number) across the screen */ |
|
TASK elastic_test(void *arg) { |
|
int y = (int)arg; |
int x = 0; |
int x = 0; |
|
char str[2]; |
str[0] = '0' + y; |
str[0] = '0' + y + 1; |
str[1] = '\0'; |
|
while(1) { |
58,18 → 60,20 |
} |
} |
|
/* A simple keyboard string input routine */ |
|
void myinput(char *str, char *buf, int len) { |
void myinput(char *query, char *buf, int len) { |
BYTE c; |
int n = 0; |
|
cprintf(str); |
cprintf(query); |
|
do { |
c = keyb_getch(NON_BLOCK); |
if (c == ENTER) break; |
if (c == 8) { // backspace |
if (c == '\r') break; |
if (c == '\b') { |
if (n > 0) { |
cprintf("%c", c); |
cprintf("%c", '\b'); |
n--; |
} |
} else if ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z')) { |
82,6 → 86,7 |
cprintf("\n"); |
} |
|
/* The main program */ |
|
int main(int argc, char **argv) |
{ |
94,10 → 99,37 |
int Tmin, Tmax, C, E, T, nbr, i; |
double U; |
|
for (i=0; i<MAX_TASKS; i++) pidvec[i] = NIL; |
clear(); |
|
for (i=0; i<MAX_TASKS; i++) pidvec[i] = NIL; |
|
/* Create predefined task 1 */ |
elastic_task_default_model(e); |
elastic_task_def_period(e, 50000, 200000); |
elastic_task_def_wcet(e, 25000); |
elastic_task_def_param(e, 5, PERIOD_SCALING); |
elastic_task_def_arg(e, (void *)0); |
el_pid = task_create("Elastic",elastic_test,&e,NULL); |
if (el_pid == NIL) { |
cprintf("ELASTIC_public_create failed!\n"); |
} else { |
pidvec[0] = el_pid; |
task_activate(el_pid); |
} |
|
/* Create predefined task 2 */ |
elastic_task_default_model(e); |
elastic_task_def_period(e, 100000, 150000); |
elastic_task_def_wcet(e, 40000); |
elastic_task_def_param(e, 10, PERIOD_SCALING); |
elastic_task_def_arg(e, (void *)1); |
el_pid = task_create("Elastic",elastic_test,&e,NULL); |
if (el_pid == NIL) { |
cprintf("ELASTIC_public_create failed!\n"); |
} else { |
pidvec[1] = el_pid; |
task_activate(el_pid); |
} |
|
do { |
|
for (y = 7; y <=15; y++) { |
115,7 → 147,7 |
E = ELASTIC_get_E(pidvec[i]); |
T = ELASTIC_get_period(pidvec[i])/1000; |
U += (double)C/(double)T; |
cprintf(" %1d %4d %4d %4d %4d %4d\n", i, Tmin, Tmax, C, E, T); |
cprintf(" %1d %4d %4d %4d %4d %4d\n", i+1, Tmin, Tmax, C, E, T); |
} |
} |
cprintf("Total utilization: %5.3f\n", U); |
123,23 → 155,29 |
puts_xy(0,16,LIGHTGRAY," "); |
place(0,16); |
|
myinput("(q)uit, (c)reate, (k)ill, force (p)eriod, set (e)lasticity? ", buf, 10); |
myinput("(q)uit, (c)reate, (k)ill, force (p)eriod, change (e)lasticity? ", buf, 10); |
for (y = 17; y <=24; y++) { |
puts_xy(0,y,LIGHTGRAY," "); |
} |
|
switch (buf[0]) { |
|
/* Quit */ |
case 'q': |
quit = 1; |
break; |
|
/* Create task */ |
case 'c': |
cprintf("Create task\n"); |
cprintf("Create task"); |
for (i=0; i<MAX_TASKS; i++) { |
if (pidvec[i] == NIL) break; |
} |
if (i == MAX_TASKS) { |
cprintf("No more task slots available!\n"); |
cprintf("\nNo more task slots available!\n"); |
break; |
} else { |
cprintf(" %d\n", i+1); |
} |
myinput("Tmin (ms): ", buf, 10); |
Tmin = 1000*atoi(buf); |
156,22 → 194,24 |
elastic_task_def_arg(e, (void *)i); |
el_pid = task_create("Elastic",elastic_test,&e,NULL); |
if (el_pid == NIL) { |
cprintf("task_create failed!\n"); |
cprintf("ELASTIC_public_create failed!\n"); |
} else { |
pidvec[i] = el_pid; |
task_activate(el_pid); |
} |
break; |
|
/* Force period */ |
case 'p': |
myinput("Force period\nTask nbr: ", buf, 10); |
nbr = atoi(buf); |
if (nbr < 0 || nbr >= MAX_TASKS) { |
if (nbr < 1 || nbr > MAX_TASKS) { |
cprintf("Invalid task number!\n"); |
break; |
} |
el_pid = pidvec[nbr]; |
el_pid = pidvec[nbr-1]; |
if (el_pid == NIL) { |
cprintf("Task doesn't exist!\n"); |
cprintf("Task does not exist!\n"); |
break; |
} |
myinput("T (ms): ", buf, 10); |
180,31 → 220,38 |
cprintf("ELASTIC_set_period failed!\n"); |
} |
break; |
|
/* Kill task */ |
case 'k': |
myinput("Kill task\nTask nbr: ", buf, 10); |
nbr = atoi(buf); |
if (nbr < 0 || nbr >= MAX_TASKS) { |
if (nbr < 1 || nbr > MAX_TASKS) { |
cprintf("Invalid task number!\n"); |
break; |
} |
el_pid = pidvec[nbr]; |
el_pid = pidvec[nbr-1]; |
if (el_pid == NIL) { |
cprintf("Task doesn't exist!\n"); |
cprintf("Task does not exist!\n"); |
break; |
} |
task_kill(el_pid); |
pidvec[nbr] = NIL; |
pidvec[nbr-1] = NIL; |
usleep(500000); // wait half a second before redrawing the task table!!! |
/* also erase task number */ |
puts_xy(0,nbr-1,LIGHTGRAY," "); |
break; |
|
/* Set elasticity */ |
case 'e': |
myinput("Set elasticity\nTask nbr: ", buf, 10); |
nbr = atoi(buf); |
if (nbr < 0 || nbr >= MAX_TASKS) { |
if (nbr < 1 || nbr > MAX_TASKS) { |
cprintf("Invalid task number!\n"); |
break; |
} |
el_pid = pidvec[nbr]; |
el_pid = pidvec[nbr-1]; |
if (el_pid == NIL) { |
cprintf("Task doesn't exist!\n"); |
cprintf("Task does not exist!\n"); |
break; |
} |
myinput("E: ", buf, 10); |
213,6 → 260,7 |
cprintf("ELASTIC_set_E failed!\n"); |
} |
break; |
|
default: |
cprintf("Unknown command\n"); |
break; |