Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 1642 → Rev 1643

/advdemos/trunk/elastic/elastic.c
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;