Blame |
Last modification |
View Log
| RSS feed
/*
* Project: HARTIK (HA-rd R-eal TI-me K-ernel)
*
* Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
* Gerardo Lamastra <gerardo@sssup.it>
*
* Authors : Paolo Gai <pj@hartik.sssup.it>
* (see authors.txt for full list of hartik's authors)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://hartik.sssup.it
*/
/**
------------
CVS : $Id: testd.c,v 1.1.1.1 2002-09-02 09:37:48 pj Exp $
File: $File$
Revision: $Revision: 1.1.1.1 $
Last update: $Date: 2002-09-02 09:37:48 $
------------
Test Number 13 (D):
this is a part of the classic Hartik demo Aster.
it is based on test 10 (A), and use the CBS to serve the periodic tasks.
There still remain some periodic tasks, that are guaranteed basing on their
wcet.
It also tests the shutdown...
**/
/*
* Copyright (C) 2000 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
#include "kernel/kern.h"
#include "modules/edf.h"
#include "modules/cbs.h"
int num_aster
= 0;
#define ASTER_LIM 60
#define DISPLAY_MAX 15
#define ASTER_MAX 70
#define STAT_Y 9
#define PER_MAX 5
#define APER_MAX 8
#define PER_WCET 25000
#define APER_WCET 53000
#define CLOCK_WCET 1000
#define ASTER_WCET 1000
#define SOFT_MET 6300
#define APER_REP 22000
PID aper_table
[APER_MAX
];
int shutting_down
= 0;
TASK asteroide
(void)
{
int i
;
int y
= rand() % 7 + 1;
int load1
,j
;
char s
[2];
s
[0] = '*'; s
[1] = 0;
for (;;) {
i
= 1;
while (i
< ASTER_LIM
) {
load1
= 10000; //8000 + rand()%2000;
for (j
=0; j
<load1
; j
++) {
s
[0] = '*' + rand() % 100;
puts_xy
(i
,y
,rand()%15+1,s
);
}
task_activate
(aper_table
[rand()%APER_MAX
]);
task_endcycle
();
puts_xy
(i
,y
,WHITE
," ");
i
++;
}
}
//num_aster--;
}
TASK aper_asteroid
(void *a
)
{
int i
;
int y
= rand() % 7 + 1;
int load1
,j
;
int c
;
char s
[2];
c
= (int)a
;
s
[0] = '*'; s
[1] = 0;
for (;;) {
i
= 1;
while (i
< ASTER_LIM
) {
load1
= APER_REP
; //8000 + rand()%2000;
for (j
=0; j
<load1
; j
++) {
s
[0] = '*' + rand() % 100;
puts_xy
(i
,y
,rand()%15+1,s
);
}
s
[0] = c
;
puts_xy
(i
,y
,rand()%15+1,s
);
if (shutting_down
) {
kern_printf
("±%d±",exec_shadow
);
return 0;
}
task_endcycle
();
puts_xy
(i
,y
,WHITE
," ");
i
++;
}
}
}
TASK soft_aster
(void)
{
int i
;
int y
= rand() % 7 + 1;
int load1
,j
;
char s
[2];
s
[0] = '*'; s
[1] = 0;
/*for (;;)*/ {
i
= 1;
while (i
< ASTER_LIM
) {
load1
= 1000 + rand()%9000;
for (j
=0; j
<load1
; j
++) {
s
[0] = '*' + rand() % 100;
puts_xy
(i
,y
,rand()%15+1,s
);
}
s
[0] = 1;
puts_xy
(i
,y
,rand()%15+1,s
);
task_activate
(aper_table
[rand()%APER_MAX
]);
task_endcycle
();
puts_xy
(i
,y
,WHITE
," ");
i
++;
}
}
num_aster
--;
return 0;
}
TASK aster
()
{
PID p
;
HARD_TASK_MODEL m
;
SOFT_TASK_MODEL m_soft
;
int r
;
int x
; // adaptive bandwidth...
srand(7);
hard_task_default_model
(m
);
hard_task_def_wcet
(m
,PER_WCET
);
hard_task_def_ctrl_jet
(m
);
for (x
=0; x
<PER_MAX
; x
++) {
r
= (rand() % 200);
hard_task_def_mit
(m
, (64+r
)*1000);
p
= task_create
("per",asteroide
,&m
,NULL
);
if (p
!=-1) task_activate
(p
);
}
soft_task_default_model
(m_soft
);
soft_task_def_met
(m_soft
,SOFT_MET
);
soft_task_def_ctrl_jet
(m_soft
);
x
= 64;
while (1) {
if (num_aster
< ASTER_MAX
) {
r
= (rand() % 200);
soft_task_def_period
(m_soft
, (x
+r
)*1000);
p
= task_create
("aaa",soft_aster
,&m_soft
,NULL
);
if (p
== -1)
{
if (x
< 500 && errno
!= ENO_AVAIL_TASK
) x
+= 1;
printf_xy
(62,3,WHITE
,"adapt=%3u err=%d",freedesc
,errno
);
}
else {
num_aster
++;
printf_xy
(62,3,WHITE
,"adapt=%3u ",x
);//,errno);
task_activate
(p
);
x
/= 2;
if (x
<50) x
= 50;
}
}
task_endcycle
();
}
}
TASK
clock()
{
int s
= 0, m
= 0;
while(1) {
printf_xy
(62,1,WHITE
,"%2d:%2d ast=%d",m
,s
, num_aster
);
printf_xy
(62,2,WHITE
,"Uedf=%12u",EDF_usedbandwidth
(0));
printf_xy
(62,4,WHITE
,"Ucbs=%12u",CBS_usedbandwidth
(4));
task_endcycle
();
if (++s
> 59) {
s
= 0;
m
++;
}
printf_xy
(62,1,WHITE
,"%2d:%2d ast=%d",m
,s
, num_aster
);
printf_xy
(62,2,WHITE
,"Uedf=%12u",EDF_usedbandwidth
(0));
printf_xy
(62,4,WHITE
,"Ucbs=%12u",CBS_usedbandwidth
(4));
task_endcycle
();
}
}
/* we consider the first ASTER_MAX + 2 tasks from the PID 2
and plot on the screen the elapsed times... */
TASK jetcontrol
()
{
int i
; /* a counter */
TIME sum
, max
, curr
, last
[5];
int nact
;
int j
; /* the elements set by jet_gettable */
PID p
;
kern_cli
();
printf_xy
(0,STAT_Y
,WHITE
,"PID ³ Mean T.³ Max T. ³ N.A. ³ Curr. ³ Last1 ³ Last2 ³ Last3 ³ Last4 ³ Last5");
kern_sti
();
for (;;) {
for (i
=0,p
=0; i
<DISPLAY_MAX
+5 && p
<MAX_PROC
; p
++) {
if (jet_getstat
(p
, &sum
, &max
, &nact
, &curr
) == -1 ||
(proc_table
[p
].
pclass & 0xFF00) == HARD_PCLASS
) continue;
for (j
=0; j
<5; j
++) last
[j
] = 0;
jet_gettable
(p
, &last
[0], 5);
kern_cli
();
if (proc_table
[p
].
task_level == 4)
printf_xy
(0,STAT_Y
+i
+1,WHITE
,"%-3d ³ %-6d ³ %-6d ³ %-4d ³ %-7d ³ %-5d ³ %-5d ³ %-5d ³ %-5d ³ %-5d",
p
, (int)sum
/(nact
==0 ? 1 : nact
), (int)max
, nact
, (int)CBS_get_nact
(4,p
), (int)last
[0], (int)last
[1], (int)last
[2], (int)last
[3], (int)last
[4]);
else
printf_xy
(0,STAT_Y
+i
+1,WHITE
,"%-3d ³ %-6d ³ %-6d ³ %-4d ³ %-7d ³ %-5d ³ %-5d ³ %-5d ³ %-5d ³ %-5d",
p
, (int)sum
/(nact
==0 ? 1 : nact
), (int)max
, nact
, (int)curr
, (int)last
[0], (int)last
[1], (int)last
[2], (int)last
[3], (int)last
[4]);
kern_sti
();
i
++;
}
}
}
void fine
()
{
sys_end
();
}
void exiting
(void *arg
)
{
kern_printf
("EXITING");
shutting_down
= 1;
}
int main
(int argc
, char **argv
)
{
PID p1
,p2
,p3
; //,p4,p5,p6;
HARD_TASK_MODEL m
;
// NRT_TASK_MODEL m_nrt;
SOFT_TASK_MODEL m_aper
;
SOFT_TASK_MODEL m_soft
;
int i
;
struct timespec fineprg
;
sys_atrunlevel
(exiting
, NULL
, RUNLEVEL_SHUTDOWN
);
hard_task_default_model
(m
);
hard_task_def_wcet
(m
,ASTER_WCET
);
hard_task_def_mit
(m
,10000);
hard_task_def_group
(m
,1);
hard_task_def_ctrl_jet
(m
);
// nrt_task_default_model(m_nrt);
// nrt_task_def_group(m_nrt,1);
// nrt_task_def_ctrl_jet(m_nrt);
soft_task_default_model
(m_soft
);
soft_task_def_met
(m_soft
,1000);
soft_task_def_period
(m_soft
,100000);
soft_task_def_group
(m_soft
,1);
soft_task_def_ctrl_jet
(m_soft
);
soft_task_def_aperiodic
(m_soft
);
p1
= task_create
("Aster",aster
,&m
,NULL
);
if (p1
== -1) {
perror("test7.c(main): Could not create task <aster> ...");
sys_end
();
l1_exit
(-1);
}
hard_task_def_mit
(m
,500000);
hard_task_def_wcet
(m
,CLOCK_WCET
);
p2
= task_create
("Clock",clock,&m
,NULL
);
if (p2
== -1) {
perror("test7.c(main): Could not create task <Clock> ...");
sys_end
();
l1_exit
(-1);
}
// p3 = task_create("JetControl",jetcontrol,&m_nrt,NULL);
p3
= task_create
("JetControl",jetcontrol
,&m_soft
,NULL
);
if (p3
== -1) {
perror("test7.c(main): Could not create task <JetControl> ...");
sys_end
();
l1_exit
(-1);
}
soft_task_default_model
(m_aper
);
soft_task_def_wcet
(m_aper
,APER_WCET
);
soft_task_def_ctrl_jet
(m_aper
);
soft_task_def_system
(m_aper
);
soft_task_def_aperiodic
(m_aper
);
for (i
=0; i
<APER_MAX
; i
++) {
soft_task_def_level
(m_aper
, i
/4 + 2);
soft_task_def_arg
(m_aper
, (void *)(i
/4 ? 'Û' : '±'));
aper_table
[i
] = task_create
("aper",aper_asteroid
,&m_aper
,NULL
);
if (aper_table
[i
] == -1) {
perror("test7.c(main): Could not create task <aper> ...");
sys_end
();
l1_exit
(-1);
}
}
task_nopreempt
();
fineprg.
tv_sec = 6;
fineprg.
tv_nsec = 0;
// kern_event_post(&fineprg,fine,NULL);
group_activate
(1);
return 0;
}