/demos/tags/rel_1_5_beta1/orbit/orbit.dat |
---|
0,0 → 1,21 |
---------------------------------------------------- |
period: 10000 wcet: 100 |
delta: 1. scala: 150. |
G: 6.6e-15 |
r_pianeta: 4 r_Terra: 8 |
X_centro: 320 Y_centro: 240 |
------------------- pianeti ------------------------ |
massa pos.x pos.y vel.x vel.y |
0: 6.0e21 0. 0. 0. 0. |
1: 1.0e21 10000. 8000. -60. 0. |
2: 1.0e8 5000. 0. 0. 80. |
3: 5.0e18 10000. 8000. -50. 0. |
4: 1.0e9 10000. 8000. -40. 20. |
5: 1.0e15 1000. 5000. -80. 0. |
6: 1.0e5 1000. 5000. -80. 0. |
7: 1.0e17 1000. 5000. -80. 0. |
8: 1.0e5 1000. 5000. -80. 0. |
9: 1.0e5 1000. 5000. -80. 0. |
10: 1.0e5 1000. 5000. -80. 0. |
---------------------------------------------------- |
/demos/tags/rel_1_5_beta1/orbit/initfile.c |
---|
0,0 → 1,198 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Giacomo Guidi <giacomo@gandalf.sssup.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/* |
* 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 "intdrive/intdrive/intdrive.h" |
#include "edf/edf/edf.h" |
#include "hardcbs/hardcbs/hardcbs.h" |
#include "rr/rr/rr.h" |
#include "dummy/dummy/dummy.h" |
#include "sem/sem/sem.h" |
#include "hartport/hartport/hartport.h" |
#include "cabs/cabs/cabs.h" |
#include <drivers/shark_linuxc26.h> |
#include <drivers/shark_pci26.h> |
#include <drivers/shark_input26.h> |
#include <drivers/shark_keyb26.h> |
#include <drivers/shark_fb26.h> |
#define FRAME_BUFFER_DEVICE 0 |
/*+ sysyem tick in us +*/ |
#define TICK 0 |
/*+ RR tick in us +*/ |
#define RRTICK 2000 |
/*+ Interrupt Server +*/ |
#define INTDRIVE_Q 1000 |
#define INTDRIVE_T 10000 |
#define INTDRIVE_FLAG 0 |
void call_shutdown_task(void *arg); |
int device_drivers_init(); |
int device_drivers_close(); |
void set_shutdown_task(); |
TASK shutdown_task_body(void *arg); |
PID shutdown_task_PID = -1; |
TIME __kernel_register_levels__(void *arg) |
{ |
struct multiboot_info *mb = (struct multiboot_info *)arg; |
INTDRIVE_register_level(INTDRIVE_Q,INTDRIVE_T,INTDRIVE_FLAG); |
EDF_register_level(EDF_ENABLE_ALL); |
HCBS_register_level(HCBS_ENABLE_ALL, 1); |
RR_register_level(RRTICK, RR_MAIN_YES, mb); |
dummy_register_level(); |
SEM_register_module(); |
CABS_register_module(); |
//read_file(); |
return TICK; |
} |
TASK __init__(void *arg) |
{ |
struct multiboot_info *mb = (struct multiboot_info *)arg; |
HARTPORT_init(); |
/* Create the shutdown task. It will be activated at RUNLEVEL |
SHUTDOWN */ |
set_shutdown_task(); |
/* Init the drivers */ |
device_drivers_init(); |
/* Set the shutdown task activation */ |
sys_atrunlevel(call_shutdown_task, NULL, RUNLEVEL_SHUTDOWN); |
__call_main__(mb); |
return (void *)0; |
} |
void set_shutdown_task() { |
/* WARNING: the shutdown task is a background thread. It cannot execute |
if the system is overloaded */ |
NRT_TASK_MODEL nrt; |
nrt_task_default_model(nrt); |
nrt_task_def_system(nrt); |
shutdown_task_PID = task_create("Shutdown Task",shutdown_task_body,&nrt,NULL); |
if (shutdown_task_PID == NIL) { |
sys_shutdown_message("Error: Cannot create shutdown task\n"); |
exit(1); |
} |
} |
int device_drivers_init() { |
int res; |
KEYB_PARMS kparms = BASE_KEYB; |
LINUXC26_register_module(); |
PCI26_init(); |
INPUT26_init(); |
keyb_def_ctrlC(kparms, NULL); |
KEYB26_init(&kparms); |
FB26_init(); |
res = FB26_open(FRAME_BUFFER_DEVICE); |
if (res) { |
cprintf("Error: Cannot open graphical mode\n"); |
KEYB26_close(); |
INPUT26_close(); |
exit(1); |
} |
FB26_use_grx(FRAME_BUFFER_DEVICE); |
FB26_setmode(FRAME_BUFFER_DEVICE,"640x480-16"); |
return 0; |
} |
int device_drivers_close() { |
FB26_close(FRAME_BUFFER_DEVICE); |
KEYB26_close(); |
INPUT26_close(); |
return 0; |
} |
#define SHUTDOWN_TIMEOUT_SEC 3 |
void call_shutdown_task(void *arg) |
{ |
struct timespec t; |
sys_gettime(&t); |
t.tv_sec += SHUTDOWN_TIMEOUT_SEC; |
/* Emergency timeout to exit from RUNLEVEL_SHUTDOWN */ |
kern_event_post(&t,(void *)((void *)sys_abort_shutdown),(void *)0); |
task_activate(shutdown_task_PID); |
} |
TASK shutdown_task_body(void *arg) { |
device_drivers_close(); |
sys_shutdown_message("-- S.Ha.R.K. Closed --\n"); |
return NULL; |
} |
/demos/tags/rel_1_5_beta1/orbit/orbit.c |
---|
0,0 → 1,351 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Paolo Gai <pj@gandalf.sssup.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/* |
------------ |
CVS : $Id: orbit.c,v 1.9 2005-01-08 14:34:48 pj Exp $ |
File: $File$ |
Revision: $Revision: 1.9 $ |
Last update: $Date: 2005-01-08 14:34:48 $ |
------------ |
*/ |
/* |
* Copyright (C) 2000 Giorgio Buttazzo and 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 |
* |
*/ |
/****************************************************************/ |
/* SIMULAZIONE DI MASSE CHE ORBITANO */ |
/****************************************************************/ |
#include <kernel/kern.h> |
#include <semaphore.h> |
#include <stdlib.h> |
#include <math.h> |
#include <string.h> |
#include <drivers/shark_fb26.h> |
#include <drivers/shark_keyb26.h> |
#define MAX 11 /* numero massimo pianeti */ |
#define XMAX 639 /* valore massimo coordinata X */ |
#define YMAX 479 /* valore massimo coordinata Y */ |
extern int vga16color[16]; |
struct coord { |
double x; |
double y; |
}; |
int flen; // file length |
double mass[MAX]; /* vettore masse pianeti */ |
struct coord pos[MAX]; /* vettore posizioni attuali */ |
struct coord vel[MAX]; /* vettore velocita' iniziali */ |
int XGS, YGS; /* Coordinate centro spazio */ |
int RP, RT; /* raggio pianeta, raggio Terra */ |
int np; /* numero attuale di pianeti */ |
double G; /* Gravitazione Universale */ |
double tick; /* tick di sistema */ |
double delta; /* incremento temporale */ |
double scala; /* fattore grafico di scala */ |
char fbuf[1000] ="\ |
----------------------------------------------------\n\ |
period: 10000 wcet: 500\n\ |
delta: 1. scala: 150.\n\ |
G: 6.6e-15\n\ |
r_pianeta: 4 r_Terra: 8\n\ |
X_centro: 320 Y_centro: 240\n\ |
------------------- pianeti ------------------------\n\ |
massa pos.x pos.y vel.x vel.y\n\ |
0: \t 6.0e21 \t 0. \t 0. \t 0. \t 0. \n\ |
1: \t 1.0e21 \t 10000. \t 8000. \t -60. \t 0. \n\ |
2: \t 1.0e8 \t 5000. \t 0. \t 0. \t 80. \n\ |
3: \t 5.0e18 \t 10000. \t 8000. \t -50. \t 0. \n\ |
4: \t 1.0e9 \t 10000. \t 8000. \t -40. \t 20. \n\ |
5: \t 1.0e15 \t 1000. \t 5000. \t -80. \t 0. \n\ |
6: \t 1.0e5 \t 1000. \t 5000. \t -80. \t 0. \n\ |
7: \t 1.0e17 \t 1000. \t 5000. \t -80. \t 0. \n\ |
8: \t 1.0e5 \t 1000. \t 5000. \t -80. \t 0. \n\ |
9: \t 1.0e5 \t 1000. \t 5000. \t -80. \t 0. \n\ |
10: \t 1.0e5 \t 1000. \t 5000. \t -80. \t 0. \n\ |
----------------------------------------------------\n"; |
// ------------------------------------------------------- |
// NOTA: %f o %lf significa double e %nf significa float |
// ------------------------------------------------------- |
PID pid; |
int period; /* task period */ |
int wcet; /* task wcet */ |
sem_t mutex; /* semaforo di mutua esclusione */ |
void get_par(void); |
/*--------------------------------------------------------------*/ |
int inside(int x, int y) |
{ |
return ((x > RP) && (x < XMAX-RP) && |
(y > RP) && (y < YMAX-RP)); |
} |
/*--------------------------------------------------------------*/ |
TASK massa(void *xxx) |
{ |
int i = (int)xxx; /* parametro del task */ |
int gx, gy; /* coordinate grafiche pallina */ |
int ox, oy; /* vecchia posizione pallina */ |
int j; |
int r, col; /* raggio e colore pianeta */ |
double dt; /* incremento temporale */ |
double dist=0.0, dx, dy; /* distanze pianeta-pianeta */ |
double dist0=0.0; /* distanze pianeta-Terra */ |
double x, y; /* posizione del pianeta */ |
double vx, vy; /* velocita' del pianeta */ |
double ax, ay; /* accelerazione del pianeta */ |
double k; /* variabile ausiliaria */ |
double arg; /* variabile di appoggio */ |
x = pos[i].x; y = pos[i].y; |
vx = vel[i].x; vy = vel[i].y; |
ox = XGS + x / scala; |
oy = YGS + y / scala; |
dt = delta; |
do { |
x = pos[i].x; |
y = pos[i].y; |
ax = ay = 0.0; |
for (j=0; j<np; j++) { |
if (j != i) { |
dx = pos[j].x - x; |
dy = pos[j].y - y; |
arg = dx*dx + dy*dy; |
dist = sqrt(arg); |
if (dist < RP*scala) dist = RP*scala; |
k = G * mass[j] / (dist*dist*dist); |
ax += k * dx; |
ay += k * dy; |
} |
if (j == 0) dist0 = dist - (RP+RT)*scala; |
} |
x += vx*dt + 0.5*ax*dt*dt; |
y += vy*dt + 0.5*ay*dt*dt; |
vx += ax * dt; |
vy += ay * dt; |
gx = XGS + x / scala; |
gy = YGS + y / scala; |
r = RP; |
col = i + 1; |
sem_wait(&mutex); |
grx_disc(ox,oy,r,vga16color[0]); |
grx_disc(gx,gy,r,vga16color[col]); |
sem_post(&mutex); |
pos[i].x = x; pos[i].y = y; |
ox = gx; oy = gy; |
task_endcycle(); |
} while ((dist0 > 0) && inside(gx,gy)); |
sem_wait(&mutex); |
grx_disc(ox,oy,r,vga16color[0]); |
grx_disc(XGS,YGS,RT,vga16color[12]); |
grx_circle(XGS,YGS,RT,vga16color[14]); |
sem_post(&mutex); |
return NULL; |
} |
/*--------------------------------------------------------------*/ |
/* MAIN */ |
/*--------------------------------------------------------------*/ |
int main() |
{ |
HARD_TASK_MODEL m; |
char c; /* carattere letto da tastiera */ |
sem_init(&mutex,0,1); |
get_par(); |
grx_disc(XGS,YGS,RT,vga16color[12]); |
grx_circle(XGS,YGS,RT,vga16color[14]); |
np = 0; |
do { |
if (np < MAX-1) { |
np++; |
hard_task_default_model(m); |
hard_task_def_arg (m, (void *)np); |
hard_task_def_wcet (m, wcet); |
hard_task_def_mit (m, period); |
hard_task_def_usemath (m); |
pid = task_create("massa", massa, &m, NULL); |
if (pid == NIL) { |
sys_shutdown_message("Could not create task"); |
exit(1); |
} |
task_activate(pid); |
} |
c = keyb_getch(BLOCK); |
} while (c != ESC); |
exit(1); |
return 0; |
} |
/*------------------------------------------------------*/ |
/* file reading */ |
/*------------------------------------------------------*/ |
void read_file(void) |
{ |
int err; |
DOS_FILE *fp; |
fp = DOS_fopen("orbit.dat","r"); |
if (!fp) { |
err = DOS_error(); |
cprintf("Error %d opening myfile.txt...\n", err); |
flen = 0; |
return; |
} |
flen = DOS_fread(&fbuf, 1, 1000, fp); |
cprintf("Read %d bytes from orbit.dat\n", flen); |
DOS_fclose(fp); |
} |
/*------------------------------------------------------*/ |
/* get data from buffer */ |
/*------------------------------------------------------*/ |
void get_par(void) |
{ |
int x = 0; |
int i; |
double vx, vy, px, py; |
flen = strlen(fbuf); |
while ((fbuf[x] != ':') && (x < flen)) x++; |
x++; |
sscanf(&fbuf[x], "%d", &period); |
while ((fbuf[x] != ':') && (x < flen)) x++; |
x++; |
sscanf(&fbuf[x], "%d", &wcet); |
while ((fbuf[x] != ':') && (x < flen)) x++; |
x++; |
sscanf(&fbuf[x], "%lf", &delta); |
while ((fbuf[x] != ':') && (x < flen)) x++; |
x++; |
sscanf(&fbuf[x], "%lf", &scala); |
while ((fbuf[x] != ':') && (x < flen)) x++; |
x++; |
sscanf(&fbuf[x], "%lf", &G); |
while ((fbuf[x] != ':') && (x < flen)) x++; |
x++; |
sscanf(&fbuf[x], "%d", &RP); |
while ((fbuf[x] != ':') && (x < flen)) x++; |
x++; |
sscanf(&fbuf[x], "%d", &RT); |
while ((fbuf[x] != ':') && (x < flen)) x++; |
x++; |
sscanf(&fbuf[x], "%d", &XGS); |
while ((fbuf[x] != ':') && (x < flen)) x++; |
x++; |
sscanf(&fbuf[x], "%d", &YGS); |
for (i=0; i<MAX; i++) { |
mass[i] = 0.; |
px = 0.; |
py = 0.; |
vx = 0.; |
vy = 0.; |
while ((fbuf[x] != '\t') && (x < flen)) x++; |
x++; |
sscanf(&fbuf[x], "%lf", &mass[i]); |
while ((fbuf[x] != '\t') && (x < flen)) x++; |
x++; |
sscanf(&fbuf[x], "%lf", &px); |
while ((fbuf[x] != '\t') && (x < flen)) x++; |
x++; |
sscanf(&fbuf[x], "%lf", &py); |
while ((fbuf[x] != '\t') && (x < flen)) x++; |
x++; |
sscanf(&fbuf[x], "%lf", &vx); |
while ((fbuf[x] != '\t') && (x < flen)) x++; |
x++; |
sscanf(&fbuf[x], "%lf", &vy); |
pos[i].x = px; pos[i].y = py; |
vel[i].x = vx; vel[i].y = vy; |
} |
} |
/*--------------------------------------------------------------*/ |
/demos/tags/rel_1_5_beta1/orbit/makefile |
---|
0,0 → 1,16 |
# |
# |
# |
ifndef BASE |
BASE=../.. |
endif |
include $(BASE)/config/config.mk |
PROGS= orbit |
include $(BASE)/config/example.mk |
orbit: |
make -f $(SUBMAKE) APP=orbit INIT= OTHEROBJS="initfile.o" OTHERINCL= SHARKOPT="__LINUXC26__ __PCI__ __INPUT__ __FB__" |
/demos/tags/rel_1_5_beta1/mix/mix.dat |
---|
0,0 → 1,12 |
TASK NAME PERIOD WCET |
------------------------------------------ |
task1 watch: 1000000 200 |
task2 tasto: 2000 200 |
task3 palla: 2000 200 |
task4 mosca: 20000 200 |
task5 infor: 20000 300 |
task6 ruota: 5000 400 |
task7 color: 2000 200 |
task8 pendo: 5000 400 |
------------------------------------------ |
/demos/tags/rel_1_5_beta1/mix/readme |
---|
0,0 → 1,7 |
MIX |
--- |
This simple applications is a pout-pourri of simple graphic tasks |
that does different things with different timing constraints... |
Paolo |
/demos/tags/rel_1_5_beta1/mix/initfile.c |
---|
0,0 → 1,198 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Giacomo Guidi <giacomo@gandalf.sssup.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/* |
* 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 "intdrive/intdrive/intdrive.h" |
#include "edf/edf/edf.h" |
#include "hardcbs/hardcbs/hardcbs.h" |
#include "rr/rr/rr.h" |
#include "dummy/dummy/dummy.h" |
#include "sem/sem/sem.h" |
#include "hartport/hartport/hartport.h" |
#include "cabs/cabs/cabs.h" |
#include <drivers/shark_linuxc26.h> |
#include <drivers/shark_pci26.h> |
#include <drivers/shark_input26.h> |
#include <drivers/shark_keyb26.h> |
#include <drivers/shark_fb26.h> |
#define FRAME_BUFFER_DEVICE 0 |
/*+ sysyem tick in us +*/ |
#define TICK 0 |
/*+ RR tick in us +*/ |
#define RRTICK 2000 |
/*+ Interrupt Server +*/ |
#define INTDRIVE_Q 1000 |
#define INTDRIVE_T 10000 |
#define INTDRIVE_FLAG 0 |
void call_shutdown_task(void *arg); |
int device_drivers_init(); |
int device_drivers_close(); |
void set_shutdown_task(); |
TASK shutdown_task_body(void *arg); |
PID shutdown_task_PID = -1; |
TIME __kernel_register_levels__(void *arg) |
{ |
struct multiboot_info *mb = (struct multiboot_info *)arg; |
INTDRIVE_register_level(INTDRIVE_Q,INTDRIVE_T,INTDRIVE_FLAG); |
EDF_register_level(EDF_ENABLE_ALL); |
HCBS_register_level(HCBS_ENABLE_ALL, 1); |
RR_register_level(RRTICK, RR_MAIN_YES, mb); |
dummy_register_level(); |
SEM_register_module(); |
CABS_register_module(); |
//read_file(); |
return TICK; |
} |
TASK __init__(void *arg) |
{ |
struct multiboot_info *mb = (struct multiboot_info *)arg; |
HARTPORT_init(); |
/* Create the shutdown task. It will be activated at RUNLEVEL |
SHUTDOWN */ |
set_shutdown_task(); |
/* Init the drivers */ |
device_drivers_init(); |
/* Set the shutdown task activation */ |
sys_atrunlevel(call_shutdown_task, NULL, RUNLEVEL_SHUTDOWN); |
__call_main__(mb); |
return (void *)0; |
} |
void set_shutdown_task() { |
/* WARNING: the shutdown task is a background thread. It cannot execute |
if the system is overloaded */ |
NRT_TASK_MODEL nrt; |
nrt_task_default_model(nrt); |
nrt_task_def_system(nrt); |
shutdown_task_PID = task_create("Shutdown Task",shutdown_task_body,&nrt,NULL); |
if (shutdown_task_PID == NIL) { |
sys_shutdown_message("Error: Cannot create shutdown task\n"); |
exit(1); |
} |
} |
int device_drivers_init() { |
int res; |
KEYB_PARMS kparms = BASE_KEYB; |
LINUXC26_register_module(); |
PCI26_init(); |
INPUT26_init(); |
keyb_def_ctrlC(kparms, NULL); |
KEYB26_init(&kparms); |
FB26_init(); |
res = FB26_open(FRAME_BUFFER_DEVICE); |
if (res) { |
cprintf("Error: Cannot open graphical mode\n"); |
KEYB26_close(); |
INPUT26_close(); |
exit(1); |
} |
FB26_use_grx(FRAME_BUFFER_DEVICE); |
FB26_setmode(FRAME_BUFFER_DEVICE,"640x480-16"); |
return 0; |
} |
int device_drivers_close() { |
FB26_close(FRAME_BUFFER_DEVICE); |
KEYB26_close(); |
INPUT26_close(); |
return 0; |
} |
#define SHUTDOWN_TIMEOUT_SEC 3 |
void call_shutdown_task(void *arg) |
{ |
struct timespec t; |
sys_gettime(&t); |
t.tv_sec += SHUTDOWN_TIMEOUT_SEC; |
/* Emergency timeout to exit from RUNLEVEL_SHUTDOWN */ |
kern_event_post(&t,(void *)((void *)sys_abort_shutdown),(void *)0); |
task_activate(shutdown_task_PID); |
} |
TASK shutdown_task_body(void *arg) { |
device_drivers_close(); |
sys_shutdown_message("-- S.Ha.R.K. Closed --\n"); |
return NULL; |
} |
/demos/tags/rel_1_5_beta1/mix/mix.c |
---|
0,0 → 1,766 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Paolo Gai <pj@gandalf.sssup.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/* |
------------ |
CVS : $Id: mix.c,v 1.7 2005-01-08 14:33:10 pj Exp $ |
File: $File$ |
Revision: $Revision: 1.7 $ |
Last update: $Date: 2005-01-08 14:33:10 $ |
------------ |
*/ |
/* |
* Copyright (C) 2000 Giorgio Buttazzo and 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 |
* |
*/ |
/*--------------------------------------------------------------*/ |
/* DEMO with 9 INDEPENDENT TASKS */ |
/*--------------------------------------------------------------*/ |
#include <kernel/kern.h> |
#include <drivers/shark_fb26.h> |
#include <drivers/shark_keyb26.h> |
#include <semaphore.h> |
#include <stdlib.h> |
#include <string.h> |
#include <math.h> |
#define PIG 3.1415 |
#define DURATA 10000 /* counter duration in tick */ |
#define LW 200 /* window length */ |
#define HW 150 /* window height */ |
#define HLOAD 30 /* Y level for the max load */ |
#define LLOAD (HW-HLOAD-5) /* length for the max load */ |
#define XWL 10 /* left X of LEFT window */ |
#define XWM 220 /* left X of MIDDLE window */ |
#define XWR 430 /* left X RIGHT window */ |
#define YWH 5 /* top Y of HIGH window */ |
#define YWM 165 /* top Y of MIDDLE window */ |
#define YWL 325 /* top Y of LOW window */ |
int flen = 0; /* file length */ |
int fine = 0; /* ending flag */ |
sem_t mx_mat, mx_grf; /* mutex semaphores */ |
int wcet[10]; /* array of task wcets */ |
int period[10]; /* array of task periods */ |
double load(long); /* load evaluation function */ |
PID ptas; |
char talk[5][25] = {" SHARK Demonstration ", |
" RETIS Lab -- Scuola ", |
" Superiore S. Anna ", |
" HARD REAL-TIME DEMO ", |
" June 5, 2001 "}; |
char fbuf[1000] = "\ |
TASK NAME PERIOD WCET\n\ |
------------------------------------------\n\ |
task1 watch: 1000000 200\n\ |
task2 tasto: 2000 200\n\ |
task3 palla: 2000 200\n\ |
task4 mosca: 20000 200\n\ |
task5 infor: 20000 300\n\ |
task6 ruota: 5000 400\n\ |
task7 color: 2000 200\n\ |
task8 pendo: 5000 400\n\ |
------------------------------------------\n"; |
extern int vga16color[16]; |
/*------------------------------------------------------*/ |
/* file reading */ |
/*------------------------------------------------------*/ |
void read_file(void) |
{ |
int err; |
DOS_FILE *fp; |
fp = DOS_fopen("mix.dat","r"); |
if (!fp) { |
err = DOS_error(); |
cprintf("Error %d opening myfile.txt...\n", err); |
flen = 0; |
return; |
} |
flen = DOS_fread(&fbuf, 1, 1000, fp); |
cprintf("Read %d bytes from file\n", flen); |
DOS_fclose(fp); |
} |
/*------------------------------------------------------*/ |
/* get data from buffer */ |
/*------------------------------------------------------*/ |
void get_par(void) |
{ |
int x = 0; |
int i; |
flen = strlen(fbuf); |
for (i=1; i<=8; i++) { |
while ((fbuf[x] != ':') && (x < flen)) x++; |
x++; |
sscanf(&fbuf[x], "%d %d", &period[i], &wcet[i]); |
} |
} |
/*--------------------------------------------------------------*/ |
void finish1() |
{ |
exit(1); |
} |
/*--------------------------------------------------------------*/ |
void finish2() |
{ |
fine = 1; |
} |
/****************************************************************/ |
/* PROCESSO OROLOGIO */ |
/****************************************************************/ |
#define LLAN 40 /* length of watch stick */ |
TASK watch() |
{ |
int x0 = XWL + LW/2; |
int y0 = YWH + HW/2; |
int grad; |
int xg, yg; |
int xt, yt, d; |
int sec, min; |
char s[5]; |
double rad, x, y; |
xg = x0; |
yg = y0 - LLAN; |
xt = XWL + 78; |
yt = YWH + 12; |
sec = min = 0; |
while (1) { |
sec = (sec + 1) % 60; |
if (sec == 0) min++; |
grad = 90 - sec * 6; |
rad = (double)grad * PIG / 180.; |
sem_wait(&mx_mat); |
x = (double)x0 + (double)LLAN * cos(rad); |
y = (double)y0 - (double)LLAN * sin(rad); |
sem_post(&mx_mat); |
sem_wait(&mx_grf); |
grx_line(x0, y0, xg, yg, vga16color[0]); |
sem_post(&mx_grf); |
xg = x; |
yg = y; |
sem_wait(&mx_grf); |
grx_line(x0, y0, xg, yg, vga16color[14]); |
sem_post(&mx_grf); |
sem_wait(&mx_grf); |
grx_text("0 :0 ", xt, yt, vga16color[14], vga16color[0]); |
sprintf(s, "%d", min); |
grx_text(s, xt+8, yt, vga16color[14], vga16color[0]); |
sprintf(s, "%d", sec); |
if (sec > 9) d = 24; else d = 32; |
grx_text(s, xt+d, yt, vga16color[14], vga16color[0]); |
sem_post(&mx_grf); |
task_endcycle(); |
} |
} |
/****************************************************************/ |
/* PROCESSO DI RIEMPIMENTO */ |
/****************************************************************/ |
#define CIMA (YWH+5) /* fondo del recipiente */ |
#define FONDO (YWH+HW-5) /* cima del recipiente */ |
#define LREC (XWM+75) /* lato sinistro recipiente */ |
#define DREC 50 /* diametro del recipiente */ |
TASK tasto() |
{ |
int x, y; |
int x0; /* coord. sinistra recipiente */ |
int col, cliq, bkg; |
int i; |
int liv; /* livello del liquido */ |
cliq = 9; |
bkg = 14; |
x0 = LREC; |
x = x0 + DREC/2; |
y = CIMA; |
liv = FONDO; |
while (1) { |
col = cliq; |
for (i=0; i<2; i++) { /* disegna goccia */ |
while (y < liv) { |
sem_wait(&mx_grf); |
grx_plot(x,y,vga16color[col]); |
sem_post(&mx_grf); |
y++; |
} |
y = CIMA; |
col = bkg; |
} |
liv--; |
sem_wait(&mx_grf); |
grx_line(x0+1, liv, x0+DREC-1, liv, vga16color[cliq]); |
sem_post(&mx_grf); |
if (liv <= CIMA+1) { /* swap colors */ |
i = bkg; bkg = cliq; cliq = i; |
liv = FONDO; |
} |
task_endcycle(); |
} |
} |
/****************************************************************/ |
void kboar() |
{ |
task_activate(ptas); |
} |
/****************************************************************/ |
/* PROCESSO PALLA */ |
/****************************************************************/ |
#define VMIN 11. /* velocit minima per suono */ |
#define LP 3 /* lato della pallina */ |
TASK palla() |
{ |
int ox, oy; /* vecchia posizione pallina */ |
int x0; /* posizione iniziale pallina */ |
int xmin, xmax; |
int base, top; |
int xg, yg; /* coordinate grafiche pallina */ |
double x, y; /* coordinate pallina */ |
double G = 9.8; |
double vx, vy, v0; /* velocit della pallina */ |
double t, tx; /* variabile temporale */ |
double dt; /* incremento temporale */ |
double arg; /* variabile di appoggio */ |
xmin = XWR+LP+1; |
xmax = XWR+LW-LP-1; |
base = YWH+HW-LP-1; |
top = HW-10-LP; |
x = ox = x0 = xmin; |
y = oy = top; |
arg = 2.*G*(double)top; |
vy = v0 = sqrt(arg); |
vx = 15.; |
tx = 0.0; |
t = vy / G; |
dt = .02; |
while (1) { |
x = x0 + vx*tx; |
y = base - vy*t + .5*G*t*t; |
if (y >= base) { |
t = 0.0; |
vy = v0; |
y = base - vy*t + .5*G*t*t; |
} |
if (x >= xmax) { |
tx = 0.0; |
x0 = xmax; |
vx = -vx; |
x = x0 + vx*tx; |
} |
if (x <= xmin) { |
tx = 0.0; |
x0 = xmin; |
vx = -vx; |
x = x0 + vx*tx; |
} |
xg = x; yg = y; |
sem_wait(&mx_grf); |
grx_disc(ox,oy,LP,vga16color[0]); |
grx_disc(xg,yg,LP,vga16color[10]); |
sem_post(&mx_grf); |
oy = yg; ox = xg; |
t += dt; |
tx += dt; |
task_endcycle(); |
} |
} |
/****************************************************************/ |
/* PROCESSO MOSCA */ |
/****************************************************************/ |
TASK mosca() |
{ |
int x, y, Ax, Ay, h; |
int x0, y0, tet; |
int xmax,ymax; |
double A, B; |
double r; |
double rnd; |
xmax = LW/2-1; ymax = HW/2-1; |
x = 0; y = 0; tet = 0; |
x0 = XWL+LW/2; y0 = YWM+HW/2; |
A = 5.; B = 30.; |
while (1) { |
rnd = (rand()%100)/100.; /* rnd = [0,1] */ |
h = (2. * B * rnd) - B; /* h = [-B,B] */ |
tet = tet + h; |
if (tet > 360) tet = tet - 360; |
if (tet < 0) tet = tet + 360; |
r = tet * PIG / 180.; |
sem_wait(&mx_mat); |
Ax = (double)(A * cos(r)); |
Ay = (double)(A * sin(r)); |
sem_post(&mx_mat); |
x = x + Ax; |
y = y + Ay; |
if ((x >= xmax) || (x <= -xmax) || |
(y >= ymax) || (y <= -ymax)) { |
x = x - Ax; |
y = y - Ay; |
tet = tet - 180; |
if (tet > 360) tet = tet - 360; |
if (tet < 0) tet = tet + 360; |
r = tet * PIG / 180.; |
sem_wait(&mx_mat); |
Ax = (double)(A * cos(r)); |
Ay = (double)(A * sin(r)); |
sem_post(&mx_mat); |
x = x + Ax; |
y = y + Ay; |
} |
sem_wait(&mx_grf); |
grx_plot(x+x0, y+y0, vga16color[10]); |
sem_post(&mx_grf); |
task_endcycle(); |
} |
} |
/****************************************************************/ |
/* PROCESSO INFORMAZIONI */ |
/****************************************************************/ |
TASK infor() |
{ |
char s[2]; |
int x, y; |
int r; |
int i = 0; |
int leng; |
int col = 0; |
r = 0; |
x = XWM + 16; |
y = YWM + 40; |
s[1] = 0; |
leng = 0; |
while (talk[0][leng] != 0) leng++; |
while (1) { |
s[0] = talk[r][i]; |
sem_wait(&mx_grf); |
grx_text(s,x+i*8,y+r*8,vga16color[col+10],vga16color[1]); |
sem_post(&mx_grf); |
i++; |
if (i == leng) { |
i = 0; |
r = (r + 1) % 5; |
if (r == 0) col = (col + 1) % 6; |
} |
task_endcycle(); |
} |
} |
/****************************************************************/ |
/* PROCESSO RUOTA */ |
/****************************************************************/ |
TASK ruota() |
{ |
int x0 = XWR + LW/2; |
int y0 = YWM + HW/2; |
int grad = 90; |
int xg, yg; |
double rad, x, y; |
xg = x0; |
yg = y0 + LLAN; |
while (1) { |
rad = (double)grad * PIG / 180.; |
sem_wait(&mx_mat); |
x = (double)x0 + (double)LLAN * cos(rad); |
y = (double)y0 + (double)LLAN * sin(rad); |
sem_post(&mx_mat); |
sem_wait(&mx_grf); |
grx_disc(xg, yg, 4, vga16color[0]); |
sem_post(&mx_grf); |
xg = x; yg = y; |
sem_wait(&mx_grf); |
grx_disc(xg, yg, 4, vga16color[13]); |
sem_post(&mx_grf); |
grad = (grad + 1) % 360; |
task_endcycle(); |
} |
} |
/****************************************************************/ |
/* PROCESSO COLORI */ |
/****************************************************************/ |
TASK color() |
{ |
int xx0 = XWL+5; |
int yy0 = YWL+5; |
int n, col; |
int x, y; |
x = 0; y = 0; |
while (1) { |
n = 19. * ((rand()%100)/100.); |
x = xx0 + n * 10; |
n = 14. * ((rand()%100)/100.); |
y = yy0 + n * 10; |
col = 16. * ((rand()%100)/100.); |
/* xg = xx0 + x; |
yg = yy0 + y; |
x = (x + 10)%(LW-10); |
y = (y + 10)%(HW-10); |
*/ |
sem_wait(&mx_grf); |
grx_box(x, y, x+9, y+9, vga16color[col]); |
sem_post(&mx_grf); |
task_endcycle(); |
} |
} |
/****************************************************************/ |
/* PROCESSO PENDOLO */ |
/****************************************************************/ |
TASK pendo() |
{ |
int x0 = XWM+LW/2; |
int y0 = YWL+10; |
int xg, yg; |
int col = 11; |
double x, y, teta; |
double v, a, dt; |
double g, l; |
g = 9.8; |
l = 80.; |
dt = 0.1; |
teta = 40. * PIG / 180.; |
v = 0.; |
sem_wait(&mx_mat); |
x = l * sin((double)teta); |
y = l * cos((double)teta); |
a = -(g/l) * sin((double)teta); |
sem_post(&mx_mat); |
xg = x0 + x; |
yg = y0 + y; |
while (1) { |
v += a * dt; |
teta += v * dt; |
sem_wait(&mx_mat); |
x = l * sin((double)teta); |
y = l * cos((double)teta); |
a = -(g/l) * sin((double)teta); |
sem_post(&mx_mat); |
sem_wait(&mx_grf); |
grx_line(x0, y0, xg, yg, vga16color[0]); |
grx_circle(xg, yg, 5, vga16color[0]); |
grx_disc(xg, yg, 4, vga16color[0]); |
sem_post(&mx_grf); |
xg = x0+x; yg = y0+y; |
sem_wait(&mx_grf); |
grx_line(x0, y0, xg, yg, vga16color[col]); |
grx_circle(xg, yg, 5, vga16color[col+2]); |
grx_disc(xg, yg, 4, vga16color[col+1]); |
sem_post(&mx_grf); |
task_endcycle(); |
} |
} |
/****************************** gener ******************************/ |
TASK gener() |
{ |
HARD_TASK_MODEL m; |
SOFT_TASK_MODEL am; |
PID pid; |
//--------------------------------------------- |
hard_task_default_model(m); |
hard_task_def_wcet (m, wcet[1]); |
hard_task_def_mit (m, period[1]); |
hard_task_def_usemath (m); |
pid = task_create("watch", watch, &m, NULL); |
task_activate(pid); |
keyb_getch(BLOCK); |
//--------------------------------------------- |
soft_task_default_model(am); |
soft_task_def_met (am, wcet[2]); |
soft_task_def_period (am, period[2]); |
soft_task_def_aperiodic(am); |
soft_task_def_usemath (am); |
ptas = task_create("tasto", tasto, &am, NULL); |
task_activate(ptas); |
keyb_getch(BLOCK); |
//--------------------------------------------- |
hard_task_default_model(m); |
hard_task_def_wcet (m, wcet[3]); |
hard_task_def_mit (m, period[3]); |
hard_task_def_usemath (m); |
pid = task_create("palla", palla, &m, NULL); |
task_activate(pid); |
keyb_getch(BLOCK); |
//--------------------------------------------- |
hard_task_default_model(m); |
hard_task_def_wcet (m, wcet[4]); |
hard_task_def_mit (m, period[4]); |
hard_task_def_usemath (m); |
pid = task_create("mosca", mosca, &m, NULL); |
task_activate(pid); |
keyb_getch(BLOCK); |
//--------------------------------------------- |
hard_task_default_model(m); |
hard_task_def_wcet (m, wcet[5]); |
hard_task_def_mit (m, period[5]); |
hard_task_def_usemath (m); |
pid = task_create("infor", infor, &m, NULL); |
task_activate(pid); |
keyb_getch(BLOCK); |
//--------------------------------------------- |
hard_task_default_model(m); |
hard_task_def_wcet (m, wcet[6]); |
hard_task_def_mit (m, period[6]); |
hard_task_def_usemath (m); |
pid = task_create("ruota", ruota, &m, NULL); |
task_activate(pid); |
keyb_getch(BLOCK); |
//--------------------------------------------- |
hard_task_default_model(m); |
hard_task_def_wcet (m, wcet[7]); |
hard_task_def_mit (m, period[7]); |
hard_task_def_usemath (m); |
pid = task_create("color", color, &m, NULL); |
task_activate(pid); |
keyb_getch(BLOCK); |
//--------------------------------------------- |
hard_task_default_model(m); |
hard_task_def_wcet (m, wcet[8]); |
hard_task_def_mit (m, period[8]); |
hard_task_def_usemath (m); |
pid = task_create("pendo", pendo, &m, NULL); |
task_activate(pid); |
//--------------------------------------------- |
return NULL; |
} |
/****************************** MAIN ******************************/ |
int main() |
{ |
char s[20]; /* carattere letto da tastiera */ |
int x0, y0; |
int x, y; |
TIME t1, count; /* contatori valutazione carico */ |
double car; /* valore del carico corrente */ |
TIME seme; |
PID pid; |
NRT_TASK_MODEL m2; |
KEY_EVT eva, evx, evs; |
/* set the keyboard handler */ |
eva.ascii = 'a'; |
eva.scan = KEY_A; |
eva.flag = 0; |
eva.status = KEY_PRESSED; |
keyb_hook(eva,kboar,FALSE); |
evx.ascii = 'x'; |
evx.scan = KEY_X; |
evx.flag = ALTL_BIT; |
evx.status = KEY_PRESSED; |
keyb_hook(evx,finish1,FALSE); |
evs.ascii = ESC; |
evs.scan = KEY_ESC; |
evs.flag = 0; |
evs.status = KEY_PRESSED; |
keyb_hook(evs,finish2,FALSE); |
sem_init(&mx_mat,0,1); |
sem_init(&mx_grf,0,1); |
seme = sys_gettime(NULL); |
srand(seme); |
get_par(); |
grx_rect(XWL,YWH,XWL+LW,YWH+HW,vga16color[14]); |
grx_rect(XWM,YWH,XWM+LW,YWH+HW,vga16color[14]); |
grx_rect(XWR,YWH,XWR+LW,YWH+HW,vga16color[14]); |
grx_rect(XWL,YWM,XWL+LW,YWM+HW,vga16color[14]); |
grx_rect(XWM,YWM,XWM+LW,YWM+HW,vga16color[14]); |
grx_rect(XWR,YWM,XWR+LW,YWM+HW,vga16color[14]); |
grx_rect(XWL,YWL,XWL+LW,YWL+HW,vga16color[14]); |
grx_rect(XWM,YWL,XWM+LW,YWL+HW,vga16color[14]); |
grx_rect(XWR,YWL,XWR+LW,YWL+HW,vga16color[14]); |
x0 = XWL + LW/2; |
y0 = YWH + HW/2; |
grx_circle(x0, y0, LLAN+3, vga16color[12]); |
grx_rect(XWL+74, YWH+7, XWL+120, YWH+22, vga16color[12]); |
x0 = LREC; |
grx_line(x0, CIMA, x0, FONDO, vga16color[15]); |
grx_line(x0+DREC, CIMA, x0+DREC, FONDO, vga16color[15]); |
grx_line(x0, FONDO, x0+DREC, FONDO, vga16color[15]); |
grx_box(x0+1, CIMA, x0+DREC-1, FONDO-1, vga16color[14]); |
grx_text("Press A", XWM+16, YWH+48, vga16color[10], vga16color[0]); |
grx_text("to fill", XWM+16, YWH+64, vga16color[10], vga16color[0]); |
grx_text("Press:", XWM+18, YWM+HW-50, vga16color[10], vga16color[0]); |
grx_text("ESC to exit", XWM+18, YWM+HW-40, vga16color[10], vga16color[0]); |
grx_text("SPACE to create", XWM+18, YWM+HW-30, vga16color[10], vga16color[0]); |
x0 = XWR + LW/2; |
y0 = YWM + HW/2; |
grx_circle(x0, y0, LLAN/3, vga16color[14]); |
grx_disc(x0, y0, LLAN/3-1, vga16color[12]); |
x0 = XWR+5; |
y0 = YWL+HW-5; |
grx_line(x0, YWL+HLOAD, x0+LW-10, YWL+HLOAD, vga16color[12]); |
grx_text("SYSTEM WORKLOAD:", x0+5, YWL+HLOAD-10, vga16color[10], vga16color[0]); |
count = 0; |
t1 = sys_gettime(NULL); |
do count++; while (sys_gettime(NULL) < (t1 + DURATA)); |
nrt_task_default_model(m2); |
pid = task_create("gener", gener, &m2, NULL); |
task_activate(pid); |
x = 0; |
while (!fine) { |
car = load(count); |
y = (double)LLOAD*car; |
sem_wait(&mx_grf); |
grx_line(x0+x, y0-LLOAD+1, x0+x, y0, vga16color[0]); |
grx_line(x0+x, y0-y, x0+x, y0, vga16color[15]); |
grx_text(" ", x0+LW-60, YWL+HLOAD-10, vga16color[0], vga16color[0]); |
sprintf(s, "%.3f", car); |
grx_text(s, x0+LW-50, YWL+HLOAD-10, vga16color[15], vga16color[0]); |
sem_post(&mx_grf); |
x = (x + 1) % (LW-10); |
} |
exit(1); |
return 0; |
} |
/****************************************************************/ |
double load(long n) |
{ |
TIME i, t1; |
double carico; |
i = 0; |
t1 = sys_gettime(NULL); |
do i++; while (sys_gettime(NULL) < (t1 + DURATA)); |
carico = 1. - (double)i / (double)n; |
return(carico); |
} |
/****************************************************************/ |
/demos/tags/rel_1_5_beta1/mix/makefile |
---|
0,0 → 1,16 |
# |
# |
# |
ifndef BASE |
BASE=../.. |
endif |
include $(BASE)/config/config.mk |
PROGS= mix |
include $(BASE)/config/example.mk |
mix: |
make -f $(SUBMAKE) APP=mix INIT= OTHEROBJS="initfile.o" OTHERINCL= SHARKOPT="__LINUXC26__ __PCI__ __INPUT__ __FB__" |
/demos/tags/rel_1_5_beta1/pci6025e/readme |
---|
0,0 → 1,7 |
These are the demos available for the National Instruments PCI6025e boards. |
These demos and the PCI driver have been made by |
Marco Ziglioli (zi_mar@libero.it). Please send any comments to: |
zi_mar@libero.it or to shark-help@gandalf.sssup.it. |
Paolo |
/demos/tags/rel_1_5_beta1/pci6025e/wave.c |
---|
0,0 → 1,312 |
/***************************************************************************** |
* Filename: wave.c * |
* Author: Marco Ziglioli (Doctor Stein) * |
* Date: 12/06/2001 * |
* Description: Little test program for Analog Output section of PCI6025E * |
*----------------------------------------------------------------------------* |
* Notes: Connect an oscilloscope to DACs output pins (20 & 21) and * |
* watch the waveforms. * |
* and decrise voltage * |
*****************************************************************************/ |
/* This file is part of the S.Ha.R.K. Project - http://shark.sssup.it |
* |
* Copyright (C) 2001 Marco Ziglioli |
* |
* 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 <drivers/shark_fb26.h> |
#include <drivers/shark_keyb26.h> |
#include <sem/sem/sem.h> |
#include <drivers/pci6025e/dac.h> |
#define MAX_VAL 500 |
#define WAVE_PERIOD 1000 |
#define WAVE_WCET 200 |
#define GRAPH_PERIOD 1000 |
#define GRAPH_WCET 550 |
#define TASK_GROUP 1 |
#define DAC0_CONV 0.1 |
#define DAC1_CONV 0.05 |
#define INC 40 |
void createWaves(void); |
void drawInterface(void); |
void endfun(KEY_EVT *); |
void close_event(void *); |
TASK wave_body(int); |
TASK video_body(int); |
WORD wave0[MAX_VAL], wave1[MAX_VAL]; |
int black = rgb16(0,0,0), |
white = rgb16(255, 255, 255); |
BYTE sys = 0; |
int main(int argc, char **argv) |
{ |
KEY_EVT k; |
HARD_TASK_MODEL wave0, wave1; |
HARD_TASK_MODEL video; |
PID wave0_pid, wave1_pid, video_pid; |
k.flag = CNTR_BIT; |
k.scan = KEY_X; |
k.ascii = 'x'; |
k.status = KEY_PRESSED; |
keyb_hook(k, endfun, FALSE); |
k.flag = CNTL_BIT; |
k.status = KEY_PRESSED; |
keyb_hook(k, endfun, FALSE); |
hard_task_default_model(wave0); |
hard_task_def_wcet(wave0, WAVE_WCET); |
hard_task_def_mit(wave0, WAVE_PERIOD); |
hard_task_def_arg(wave0, 0); |
hard_task_def_group(wave0, TASK_GROUP); |
if( (wave0_pid = task_create("Wave 0", wave_body, &wave0, NULL)) == NIL ){ |
sys = 10; |
exit(1); |
} |
hard_task_default_model(wave1); |
hard_task_def_wcet(wave1, WAVE_WCET); |
hard_task_def_mit(wave1, WAVE_PERIOD); |
hard_task_def_arg(wave1, (void *)1); |
hard_task_def_group(wave1, TASK_GROUP); |
if( (wave1_pid = task_create("Wave 1", wave_body, &wave1, NULL)) == NIL ){ |
sys = 11; |
exit(1); |
} |
hard_task_default_model(video); |
hard_task_def_wcet(video, GRAPH_WCET); |
hard_task_def_mit(video, GRAPH_PERIOD); |
hard_task_def_group(video, TASK_GROUP); |
if( (video_pid = task_create("Video task", video_body, &video, NULL)) |
== NIL ){ |
sys = 12; |
exit(1); |
} |
if(!reMap()){ |
sys = 21; |
exit(1); |
} |
createWaves(); |
drawInterface(); |
//Analog output section set up |
DAC_Init(); |
/* |
*AI_TIMEBASE div by 2; OUT_TIMEBASE div by 2; single DAC mode |
*TMRDACWR = 3 OUT_TIMEBASE period; FIFO flags polarity active low |
*TMRDACWR disabled; DMA PIO control = FIFO DATA interface mode |
*UPDATE signal timebase = AO_UPDATE pulse width |
*UPDATE pulsewidth = 3-3.5 OUT_TIMEBASE period |
*UPDATE signal polarity = HIGH Z |
*/ |
DAC_boardInit(0x02, 0x4000); |
/* |
*LDAC0 source = UPDATE |
*DAC0 update immediately |
*LDAC1 source = UPDATE |
*DAC1 update immediately |
*/ |
DAC_LDACSourceUpdate(0x00); |
//End of Analog output section setup |
group_activate(TASK_GROUP); |
return 0; |
} |
void endfun(KEY_EVT *k) |
{ |
close_event(NULL); |
exit(1); |
} |
void close_event(void *arg) |
{ |
switch(sys){ |
case 0: sys_shutdown_message("Regular End!\n"); break; |
case 10: sys_shutdown_message("Cannot create <wave 0> task!\n"); break; |
case 11: sys_shutdown_message("Cannot create <wave 1> task!\n"); break; |
case 12: sys_shutdown_message("Cannot create <video> task!\n"); break; |
case 20: sys_shutdown_message("No PCI bus found!\n"); break; |
case 21: sys_shutdown_message("No NATIONAL PCI E-Series board found on PCI bus!\n"); |
break; |
case 30: sys_shutdown_message("Cannot start graphic envirorment!\n"); break; |
case 31: sys_shutdown_message("800x600x16 video mode not supported!\n"); |
default: sys_shutdown_message("Unknown exit event!\n"); break; |
} |
} |
/* |
* Wave's samples generation |
*/ |
void createWaves(void) |
{ |
int i; |
int value0, value1; |
BYTE direction; |
/* Wave0 |
* * * * * * * * |
** ** ** ** ** ** ** ** |
* ** * * ** ** ** ** ** * |
* * ** * * * * * * |
--------------------------... |
Wave 1 |
* * |
* * * * |
* * * * |
* * * * |
-------*-------*-------*--... |
* * * |
* * * |
* * |
* */ |
value0 = 0; |
value1 = 0; |
direction = 0; |
for(i=0; i<MAX_VAL; i++){ |
wave0[i] = (value0 & 0x0FFF); |
wave1[i] = (value1 & 0x0FFF); |
value0 = (value0 + INC) % 2000; |
if(!direction) value1 += INC; |
else value1 -= INC; |
if(value1 >= 2000) direction = 1; |
if(value1 <= -2000) direction = 0; |
} |
} |
void drawInterface(void) |
{ |
int i; |
grx_rect(1, 1, 799, 69, rgb16(105, 0, 105)); |
grx_rect(2, 2, 798, 68, rgb16(155, 0, 155)); |
grx_rect(3, 3, 797, 67, rgb16(205, 0, 205)); |
grx_rect(4, 4, 796, 66, rgb16(255, 0, 255)); |
grx_text("Test program for Analog output section of PCI6025E", |
7, 10, rgb16(50, 255, 50), black); |
grx_text("DAC0 and DAC1 should generate saw-toothed wave and triangular wave", |
7, 33, rgb16(0, 255, 255), black); |
grx_text("Use an oscilloscope to test this software", |
7, 40, rgb16(0, 255, 255), black); |
grx_text("CTRL-X for Exit", 7, 55, rgb16(200, 200, 0), black); |
grx_text("DAC 0", 100, 92, rgb16(200, 200, 0), black); |
grx_rect(1, 100, 799, 325, rgb16(0, 105, 0)); |
grx_rect(2, 101, 798, 324, rgb16(0, 155, 0)); |
grx_rect(3, 102, 797, 323, rgb16(0, 205, 0)); |
grx_rect(4, 103, 796, 322, rgb16(0, 255, 0)); |
grx_line(19, 115, 19, 320, white); |
grx_line(14, 315, 530, 315, white); |
grx_text("DAC 1", 100, 362, rgb16(200, 200, 0), black); |
grx_rect(1, 370, 799, 595, rgb16(105, 0, 0)); |
grx_rect(2, 371, 798, 594, rgb16(155, 0, 0)); |
grx_rect(3, 372, 797, 593, rgb16(205, 0, 0)); |
grx_rect(4, 373, 796, 592, rgb16(255, 0, 0)); |
grx_line(19, 385, 19, 585, white); |
grx_line(14, 485, 530, 485, white); |
for(i=22; i<530; i+=2){ |
//DAC0 |
grx_plot(i, 115, white); |
grx_plot(i, 215, white); |
//DAC1 |
grx_plot(i, 385, white); |
grx_plot(i, 435, white); |
grx_plot(i, 535, white); |
grx_plot(i, 585, white); |
} |
grx_text("5 V", 540, 211, rgb16(0, 255, 0), black); |
grx_text("10 V", 540, 111, rgb16(0, 255, 0), black); |
grx_text("+5 V", 540, 431, rgb16(0, 255, 0), black); |
grx_text("+10 V", 540, 381, rgb16(0, 255, 0), black); |
grx_text("-5 V", 540, 531, rgb16(255, 0, 0), black); |
grx_text("-10 V", 540, 581, rgb16(255, 0 , 0), black); |
} |
/* |
* Sends out waves' samples |
*/ |
TASK wave_body(int wv) |
{ |
int i = 0; |
while(1){ |
if(wv) |
DAC_output(DAC1, wave1[i]); |
else |
DAC_output(DAC0, wave0[i]); |
i = (i + 1) % 500; |
task_endcycle(); |
} |
} |
/* |
* Shows wave on screen |
*/ |
TASK video_body(int dummy) |
{ |
int i = 0; |
int n_tmp = 0, o_tmp; |
//char buf[10]; |
while(1){ |
o_tmp = n_tmp; |
if( (wave1[i] & 0x0800) != 0 ) n_tmp = wave1[i]-0x0FFF; |
else n_tmp = wave1[i]; |
if(i>0){ |
grx_line(19+i, 314-wave0[i-1]*DAC0_CONV, |
20+i, 314-wave0[i]*DAC0_CONV, rgb16(255, 255, 0)); |
grx_line(19+i, 485-o_tmp*DAC1_CONV, |
20+i, 485-n_tmp*DAC1_CONV, rgb16(0, 255, 255)); |
} |
i = (i + 1) % 500; |
task_endcycle(); |
} |
} |
/demos/tags/rel_1_5_beta1/pci6025e/initfile.c |
---|
0,0 → 1,196 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Giacomo Guidi <giacomo@gandalf.sssup.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/* |
* 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 "intdrive/intdrive/intdrive.h" |
#include "edf/edf/edf.h" |
#include "hardcbs/hardcbs/hardcbs.h" |
#include "rr/rr/rr.h" |
#include "dummy/dummy/dummy.h" |
#include "sem/sem/sem.h" |
#include "hartport/hartport/hartport.h" |
#include "cabs/cabs/cabs.h" |
#include <drivers/shark_linuxc26.h> |
#include <drivers/shark_pci26.h> |
#include <drivers/shark_input26.h> |
#include <drivers/shark_keyb26.h> |
#include <drivers/shark_fb26.h> |
#define FRAME_BUFFER_DEVICE 0 |
/*+ sysyem tick in us +*/ |
#define TICK 0 |
/*+ RR tick in us +*/ |
#define RRTICK 2000 |
/*+ Interrupt Server +*/ |
#define INTDRIVE_Q 1000 |
#define INTDRIVE_T 10000 |
#define INTDRIVE_FLAG 0 |
void call_shutdown_task(void *arg); |
int device_drivers_init(); |
int device_drivers_close(); |
void set_shutdown_task(); |
TASK shutdown_task_body(void *arg); |
PID shutdown_task_PID = -1; |
TIME __kernel_register_levels__(void *arg) |
{ |
struct multiboot_info *mb = (struct multiboot_info *)arg; |
INTDRIVE_register_level(INTDRIVE_Q,INTDRIVE_T,INTDRIVE_FLAG); |
EDF_register_level(EDF_ENABLE_ALL); |
HCBS_register_level(HCBS_ENABLE_ALL, 1); |
RR_register_level(RRTICK, RR_MAIN_YES, mb); |
dummy_register_level(); |
SEM_register_module(); |
CABS_register_module(); |
return TICK; |
} |
TASK __init__(void *arg) |
{ |
struct multiboot_info *mb = (struct multiboot_info *)arg; |
HARTPORT_init(); |
/* Create the shutdown task. It will be activated at RUNLEVEL |
SHUTDOWN */ |
set_shutdown_task(); |
/* Init the drivers */ |
device_drivers_init(); |
/* Set the shutdown task activation */ |
sys_atrunlevel(call_shutdown_task, NULL, RUNLEVEL_SHUTDOWN); |
__call_main__(mb); |
return (void *)0; |
} |
void set_shutdown_task() { |
/* WARNING: the shutdown task is a background thread. It cannot execute |
if the system is overloaded */ |
NRT_TASK_MODEL nrt; |
nrt_task_default_model(nrt); |
nrt_task_def_system(nrt); |
shutdown_task_PID = task_create("Shutdown Task",shutdown_task_body,&nrt,NULL); |
if (shutdown_task_PID == NIL) { |
sys_shutdown_message("Error: Cannot create shutdown task\n"); |
exit(1); |
} |
} |
int device_drivers_init() { |
int res; |
KEYB_PARMS kparms = BASE_KEYB; |
LINUXC26_register_module(); |
PCI26_init(); |
INPUT26_init(); |
keyb_def_ctrlC(kparms, NULL); |
KEYB26_init(&kparms); |
FB26_init(); |
res = FB26_open(FRAME_BUFFER_DEVICE); |
if (res) { |
cprintf("Error: Cannot open graphical mode\n"); |
KEYB26_close(); |
INPUT26_close(); |
exit(1); |
} |
FB26_use_grx(FRAME_BUFFER_DEVICE); |
FB26_setmode(FRAME_BUFFER_DEVICE,"800x600-16"); |
return 0; |
} |
int device_drivers_close() { |
FB26_close(FRAME_BUFFER_DEVICE); |
KEYB26_close(); |
INPUT26_close(); |
return 0; |
} |
#define SHUTDOWN_TIMEOUT_SEC 3 |
void call_shutdown_task(void *arg) |
{ |
struct timespec t; |
sys_gettime(&t); |
t.tv_sec += SHUTDOWN_TIMEOUT_SEC; |
/* Emergency timeout to exit from RUNLEVEL_SHUTDOWN */ |
kern_event_post(&t,(void *)((void *)sys_abort_shutdown),(void *)0); |
task_activate(shutdown_task_PID); |
} |
TASK shutdown_task_body(void *arg) { |
device_drivers_close(); |
sys_shutdown_message("-- S.Ha.R.K. Closed --\n"); |
return NULL; |
} |
/demos/tags/rel_1_5_beta1/pci6025e/test_bms.c |
---|
0,0 → 1,262 |
/***************************************************************************** |
* Filename: test_bms.c * |
* Author: Marco Ziglioli (Doctor Stein) * |
* Date: 27/06/2001 * |
* Description: Test program for buffered period and semiperiod measurement * |
* capacity of National PCI6025E board * |
*----------------------------------------------------------------------------* |
* Notes: FOUT are enable and avaiable on pin 50 to provide 1 Mhz frequency * |
* You should connect source 0 (PIN 41) and source 1 (pin 45) to this * |
* freq source. Gate 0 (pin 42) and gate 1 (pin 44) must be connected * |
* rispectivly to DIO7 (pin 32) and DIO6 (pin 30). * |
* Use 'g' button to activate gate_action_task which generate a square * |
* wave with a freq of 0.5 Hz and Duty cycle of 75%. * |
* 's' button should show counters countent but gate_action_task * |
* when active shows counters content automatically so 's' button isn't* |
* useful. * |
*****************************************************************************/ |
/* This file is part of the S.Ha.R.K. Project - http://shark.sssup.it |
* |
* Copyright (C) 2001 Marco Ziglioli |
* |
* 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 <drivers/shark_keyb26.h> |
#include <drivers/shark_fb26.h> |
#include <drivers/pci6025e/timer.h> |
#include <drivers/pci6025e/dio_ppi.h> |
#define SHOW_MET 30000 |
#define SHOW_WCET 50000 |
#define SHOW_PERIOD 1000000 |
#define GATE_MET 2000 |
#define GATE_WCET 5000 |
#define GATE_PERIOD 2000000 |
#define GATE_ACTION_P 500000 |
#define GATE_ACTION_W 10000 |
#define black rgb16(0, 0, 0) |
void endFun(KEY_EVT *); |
void gateEvent(KEY_EVT *); |
void showEvent(KEY_EVT *); |
void closeEvent(void *); |
void drawInterface(void); |
TASK show_val_body(int); |
TASK gate_action_body(int); |
BYTE sys = 0; |
PID show_val_pid, gate_action_pid; |
int main(int argc, char **argv) |
{ |
KEY_EVT k; |
SOFT_TASK_MODEL show_val_mod; |
HARD_TASK_MODEL gate_action_model; |
k.flag = CNTL_BIT; |
k.scan = KEY_X; |
k.ascii = 'x'; |
k.status = KEY_PRESSED; |
keyb_hook(k, endFun, FALSE); |
k.flag = CNTR_BIT; |
k.status = KEY_PRESSED; |
keyb_hook(k, endFun, FALSE); |
k.flag = 0; |
k.scan = KEY_G; |
k.ascii = 'g'; |
k.status = KEY_PRESSED; |
keyb_hook(k, gateEvent, FALSE); |
k.scan = KEY_S; |
k.ascii = 's'; |
k.status = KEY_PRESSED; |
keyb_hook(k, showEvent, FALSE); |
if(!reMap()){ |
sys = 11; |
exit(1); |
} |
soft_task_default_model(show_val_mod); |
soft_task_def_aperiodic(show_val_mod); |
soft_task_def_level(show_val_mod, 2); |
soft_task_def_met(show_val_mod, SHOW_MET); |
soft_task_def_wcet(show_val_mod, SHOW_WCET); |
soft_task_def_period(show_val_mod, SHOW_PERIOD); |
if( (show_val_pid = task_create("Show task", show_val_body, &show_val_mod, NULL)) |
== NIL ){ |
sys = 20; |
exit(1); |
} |
hard_task_default_model(gate_action_model); |
hard_task_def_mit(gate_action_model, GATE_ACTION_P); |
hard_task_def_wcet(gate_action_model, GATE_ACTION_W); |
if( (gate_action_pid = task_create("Gate Action", gate_action_body, &gate_action_model, NULL)) |
== NIL ){ |
sys = 22; |
exit(1); |
} |
drawInterface(); |
DIO_init(); |
DIO_setup(0xFF); |
DIO_write(0x00); |
//All PFI configured as input |
PFIprogramming(0x0000); |
//Fout provide 1MHz: timebase = 20MHz; divided by 2; on FOUT pin also divided by 10 |
setIntClock(0, 1, 10); |
//Reset both counters |
TIM_reset(2); |
//C0 measures period on PFI3 with gate from PFI 4 driven by DIO7 |
TIM_bufferedTimeMeasurement(C0, 0x04, 0x45, 0, 0); |
//C1 measures semiperiod on PFI 6 with gate from PFI 5 driven by FIO6 |
TIM_bufferedTimeMeasurement(C1, 0x87, 0x46, 1, 0); |
//arm both counters |
TIM_arm(2); |
return 0; |
} |
void endFun(KEY_EVT *k) |
{ |
closeEvent(NULL); |
exit(1); |
} |
void showEvent(KEY_EVT *k) |
{ |
task_activate(show_val_pid); |
} |
void gateEvent(KEY_EVT *k) |
{ |
task_activate(gate_action_pid); |
} |
void drawInterface(void) |
{ |
grx_rect(1, 1, 799, 129, rgb16(105, 0, 0)); |
grx_rect(2, 2, 798, 128, rgb16(155, 0, 0)); |
grx_rect(3, 3, 797, 127, rgb16(205, 0, 0)); |
grx_rect(4, 4, 796, 126, rgb16(255, 0, 0)); |
grx_text("Test program for Buffered Period and Semiperiod measure through PCI6025E timers", |
7, 10, rgb16(50, 255, 50), black); |
grx_text("This program counting rise edges on counters source (PFI3 & PFI6) between two rising", |
7, 25, rgb16(0, 255, 255), black); |
grx_text("edges on gate (PFI 42) and beetwen each gate edge (PFI44).FOUT is enabled and", |
7, 33, rgb16(0, 255, 255), black); |
grx_text("provides a frequency of 1 MHz", 7, 41, rgb16(0, 255, 255), black); |
grx_text("Instruction:",7, 53, rgb16(255, 0, 0), black); |
grx_text("Use 's' to see counters value", |
7, 61, rgb16(0, 255, 255), black); |
grx_text("Use 'g' to enbale automatic tasks which generate square wave with freq of 0.5Hz", |
7, 68, rgb16(0, 255, 255), black); |
grx_text("And duty cycle of 75%. Counter 0 must be loaded with about 2E6 ticks and counter 1", |
7, 75, rgb16(0, 255, 255), black); |
grx_text("must be loaded alternativly with about 1.5E6 and 0.5E6 ticks", |
7, 83, rgb16(0, 255, 255), black); |
grx_text("Please connect DIO7 (pin 32) to PFI4 (pin 42) and DIO6 (pin 30) to PFI5 (pin 44)", |
7, 95, rgb16(0, 255, 0), black); |
grx_text("CTRL-X for Exit", 7, 110, rgb16(200, 200, 0), black); |
grx_rect(1, 147, 355, 183, rgb16(0, 105, 0)); |
grx_rect(2, 148, 354, 182, rgb16(0, 155, 0)); |
grx_rect(3, 149, 353, 181, rgb16(0, 205, 0)); |
grx_rect(4, 150, 352, 180, rgb16(0, 255, 0)); |
grx_text("Period", 7, 155, rgb16(255, 255, 0), black); |
grx_rect(455, 147, 799, 183, rgb16(0, 105, 0)); |
grx_rect(456, 148, 798, 182, rgb16(0, 155, 0)); |
grx_rect(457, 149, 797, 181, rgb16(0, 205, 0)); |
grx_rect(458, 150, 796, 180, rgb16(0, 255, 0)); |
grx_text("Semiperiod", 461, 155, rgb16(255, 0, 255), black); |
} |
TASK show_val_body(int dummy) |
{ |
DWORD val; |
char buf[40]; |
while(1){ |
val = TIM_readHWSaveReg(C0); |
sprintf(buf,"C0 %07ld", val); |
grx_text(buf, 7, 165, rgb16(255, 0, 0), rgb16(0, 0, 0)); |
val = TIM_readHWSaveReg(C1); |
sprintf(buf,"C1 %07ld", val); |
grx_text(buf, 461, 165, rgb16(0, 255, 0), rgb16(0, 0, 0)); |
task_endcycle(); |
} |
} |
TASK gate_action_body(int dummy) |
{ |
int i; |
i = 0; |
while(1){ |
if( (i%4)==0 ) DIO_write(0xC0); |
if( (i%4)==3 ) DIO_write(0x00); |
i++; |
task_activate(show_val_pid); |
task_endcycle(); |
} |
} |
void closeEvent(void *arg) |
{ |
TIM_disarm(2); |
switch(sys){ |
case 0: sys_shutdown_message("Ok\n"); break; |
case 10: sys_shutdown_message("No PCI\n"); break; |
case 11: sys_shutdown_message("No National Board\n"); break; |
case 20: sys_shutdown_message("task <show val> down\n"); break; |
case 22: sys_shutdown_message("task <gate action> down\n"); break; |
case 30: sys_shutdown_message("Cannot initialize grx\n"); break; |
case 31: sys_shutdown_message("Resolution 800x600x16 not supported\n"); break; |
case 32: sys_shutdown_message("Cannot sets up graphic envirorment\n"); break; |
default: sys_shutdown_message("????????????\n"); break; |
} |
} |
/demos/tags/rel_1_5_beta1/pci6025e/test_mes.c |
---|
0,0 → 1,278 |
/***************************************************************************** |
* Filename: test_mes.c * |
* Author: Marco Ziglioli (Doctor Stein) * |
* Date: 25/06/2001 * |
* Description: Test file for single period and pulsewidth measurement feature* |
* of PCI6025E timers/counters * |
*----------------------------------------------------------------------------* |
* Notes: board is configured to provide a frequency of 1 MHZ through its FOUT* |
* pin (50). PFI3 (41) and PFI6 (45) are configured like source pins * |
* counter 0 and counter 1. PFI4 (42) and PFI 5(44) are the gates for * |
* the two counters. Please connect DIO7(32) to PFI4 and DIO6(30) to * |
* PFI 5. * |
* With 'g' key a task is started which generate a square wave on DIO7 * |
* with a period of 2 secs. With 'h' key the same square wave is * |
* generated on DIO6. * |
* When measurement is performed data are stored into Hardware Save * |
* Registers: use key 's' to show this values * |
*****************************************************************************/ |
/* This file is part of the S.Ha.R.K. Project - http://shark.sssup.it |
* |
* Copyright (C) 2001 Marco Ziglioli |
* |
* 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 <drivers/shark_keyb26.h> |
#include <drivers/shark_fb26.h> |
#include <drivers/pci6025e/timer.h> |
#include <drivers/pci6025e/dio_ppi.h> |
#define TASK_MET 20000 |
#define TASK_WCET 50000 |
#define TASK_PERIOD 100000 |
#define PERIOD 1000000 |
void endFun(KEY_EVT *); |
void gateEvent(KEY_EVT *); |
void drawInterface(void); |
void closeEvent(void *); |
TASK show_body(int); |
TASK gate_body(int); |
BYTE sys = 0; |
PID c0_gate_pid, c1_gate_pid, show_pid; |
int black = rgb16(0, 0, 0); |
int main(int argc, char **argv) |
{ |
KEY_EVT k; |
SOFT_TASK_MODEL show_model; |
HARD_TASK_MODEL gating; |
k.flag = CNTL_BIT; |
k.scan = KEY_X; |
k.ascii = 'x'; |
k.status = KEY_PRESSED; |
keyb_hook(k, endFun, FALSE); |
k.flag = CNTR_BIT; |
k.status = KEY_PRESSED; |
keyb_hook(k, endFun, FALSE); |
k.flag = 0; |
k.scan = KEY_G; |
k.ascii = 'g'; |
k.status = KEY_PRESSED; |
keyb_hook(k, gateEvent, FALSE); |
k.scan = KEY_H; |
k.ascii = 'h'; |
k.status = KEY_PRESSED; |
keyb_hook(k, gateEvent, FALSE); |
k.scan = KEY_S; |
k.ascii = 's'; |
k.status = KEY_PRESSED; |
keyb_hook(k, gateEvent, FALSE); |
if(!reMap()){ |
sys = 11; |
exit(1); |
} |
soft_task_default_model(show_model); |
soft_task_def_level(show_model, 2); |
soft_task_def_met(show_model, TASK_MET); |
soft_task_def_wcet(show_model, TASK_WCET); |
soft_task_def_aperiodic(show_model); |
soft_task_def_period(show_model, TASK_PERIOD); |
if( (show_pid = task_create("Show task", show_body, &show_model, NULL)) |
== NIL ){ |
sys = 20; |
exit(1); |
} |
hard_task_default_model(gating); |
hard_task_def_mit(gating, PERIOD); |
hard_task_def_wcet(gating, 20000); |
hard_task_def_arg(gating, C0); |
if( (c0_gate_pid = task_create("C0 Gate task", gate_body, &gating, NULL)) == NIL ){ |
sys = 21; |
exit(1); |
} |
hard_task_def_arg(gating, (void *)C1); |
if( (c1_gate_pid = task_create("C1 Gate task", gate_body, &gating, NULL)) == NIL ){ |
sys = 22; |
exit(1); |
} |
drawInterface(); |
//Enable DIO to manage gates |
DIO_init(); |
DIO_setup(0xFF); |
DIO_write(0x00); |
//All PFI configured as input |
PFIprogramming(0x0000); |
//Fout provide 1MHz: timebase = 20MHz; divided by 2; on FOUT pin also divided by 10 |
setIntClock(0, 1, 10); |
//Reset both counters |
TIM_reset(2); |
//Source PFI3(41); Gate PFI 4(42); Measure period |
TIM_timeMeasurement(C0, 0x04, 0x45, 0, 0x00, 0); |
//Source PFI6(45); Gate PFI 5(44); Measure pulsewidth |
TIM_timeMeasurement(C1, 0x87, 0x46, 1, 0x00, 0); |
//Arm both counter |
TIM_arm(2); |
return 0; |
} |
TASK show_body(int dummy) |
{ |
DWORD val; |
char buf[20]; |
while(1){ |
val = TIM_readHWSaveReg(C0); |
sprintf(buf, "%ld", val); |
grx_text(buf, 600, 471, rgb16(0, 255, 0), black); |
val = TIM_readHWSaveReg(C1); |
sprintf(buf, "%ld", val); |
grx_text(buf, 200, 471, rgb16(255, 0, 0), black); |
task_endcycle(); |
} |
} |
TASK gate_body(int counter) |
{ |
BYTE out; |
if(counter == C0) out = 0x80; |
else out = 0x40; |
while(1){ |
DIO_write(out); |
if(counter == C0){ |
if(out) out = 0x00; |
else out = 0x80; |
} else { |
if(out) out = 0x40; |
else out = 0x00; |
} |
task_endcycle(); |
} |
} |
void drawInterface(void) |
{ |
grx_rect(1, 1, 799, 120, rgb16(105, 0, 0)); |
grx_rect(2, 2, 798, 119, rgb16(155, 0, 0)); |
grx_rect(3, 3, 797, 118, rgb16(205, 0, 0)); |
grx_rect(4, 4, 796, 117, rgb16(255, 0, 0)); |
grx_text("Test program for single period and pulsewidth measurement features", |
7, 10, rgb16(200, 200, 0), black); |
grx_text("This program measures single period and pulsewidth of a square wave", |
7, 20, rgb16(0, 255, 0), black); |
grx_text("with frequency of 0.5 Hz", 7, 28, rgb16(0, 255, 0), black); |
grx_text("Please connect PFI3 & PFI6 (41 & 45) to FOUT pin (50) or to 1Mhz frequency source", |
7, 40, rgb16(255, 0, 0), black); |
grx_text("Connect also DIO7 (32) to PFI4 (42) and DIO6 to PFI5 (44)", |
7, 48, rgb16(255, 0, 0), black); |
grx_text("Commands:", 7, 60, rgb16(0, 120, 0), black); |
grx_text("Use 'g' to start wave generation on DIO7", |
7, 70, rgb16(0, 255, 255), black); |
grx_text("Use 'h' to start wave generation on DIO6", |
7, 78, rgb16(0, 255, 255), black); |
grx_text("Use 's' to show Hardware Save Registers content", |
7, 86, rgb16(0, 255, 255), black); |
grx_text("CTRL-X to exit", 7, 105, rgb16(255, 255, 0), black); |
grx_rect(197, 127, 603, 423, rgb16(0, 255, 0)); |
grx_rect(198, 128, 602, 422, rgb16(0, 205, 0)); |
grx_rect(199, 129, 601, 421, rgb16(0, 155, 0)); |
grx_rect(200, 130, 600, 420, rgb16(0, 105, 0)); |
grx_line(215, 405, 215, 150, rgb16(255, 255, 255)); |
grx_line(210, 400, 580, 400, rgb16(255, 255, 255)); |
grx_line(220, 395, 220, 170, rgb16(0, 0, 255)); |
grx_line(220, 170, 390, 170, rgb16(0, 0, 255)); |
grx_line(390, 170, 390, 395, rgb16(0, 0, 255)); |
grx_line(390, 395, 560, 395, rgb16(0, 0, 255)); |
grx_line(220, 150, 560, 150, rgb16(0, 255, 0)); |
grx_line(220, 155, 390, 155, rgb16(255, 0, 0)); |
grx_rect(1, 450, 390, 503, rgb16(105, 0, 0)); |
grx_rect(2, 451, 389, 502, rgb16(155, 0, 0)); |
grx_rect(3, 452, 388, 501, rgb16(205, 0, 0)); |
grx_rect(4, 453, 387, 500, rgb16(255, 0, 0)); |
grx_text("Pulsewidth: [us]", 7, 471, rgb16(255, 0, 0), black); |
grx_rect(410, 450, 799, 503, rgb16(105, 0, 0)); |
grx_rect(411, 451, 798, 502, rgb16(155, 0, 0)); |
grx_rect(412, 452, 797, 501, rgb16(205, 0, 0)); |
grx_rect(413, 453, 796, 500, rgb16(255, 0, 0)); |
grx_text("Period: [us]", 416, 471, rgb16(0, 255, 0), black); |
} |
void endFun(KEY_EVT *k) |
{ |
closeEvent(NULL); |
exit(1); |
} |
void gateEvent(KEY_EVT *k) |
{ |
if(k->scan == KEY_G) task_activate(c0_gate_pid); |
if(k->scan == KEY_H) task_activate(c1_gate_pid); |
if(k->scan == KEY_S) task_activate(show_pid); |
} |
void closeEvent(void *arg) |
{ |
TIM_disarm(2); |
switch(sys){ |
case 0: sys_shutdown_message("OK\n"); break; |
case 10: sys_shutdown_message("No PCI bus found\n"); break; |
case 11: sys_shutdown_message("No NATIONAL board found\n"); break; |
case 20: sys_shutdown_message("task <show value> down!!\n"); break; |
case 21: sys_shutdown_message("task <C0 gate manage> down!!!\n"); break; |
case 22: sys_shutdown_message("task <C1 gate manage> down!!!\n"); break; |
case 30: sys_shutdown_message("Cannot init graphic envirorment\n"); break; |
case 31: sys_shutdown_message("graphic mode 800x600x16 not supported\n"); break; |
default: sys_shutdown_message("???????????????\n"); break; |
} |
} |
/demos/tags/rel_1_5_beta1/pci6025e/test_dac.c |
---|
0,0 → 1,352 |
/***************************************************************************** |
* Filename: test_dac.c * |
* Author: Marco Ziglioli (Doctor Stein) * |
* Date: 12/06/2001 * |
* Description: Little test program for Analog Output section of PCI6025E * |
*----------------------------------------------------------------------------* |
* Notes: Connect a multimeter to DAC1 output (pin 21) and watch * |
* tension value. Use '+' and '-' on numeric pad to increase * |
* and decrise voltage * |
* With this program it's possible to point out possible * |
* offset errors. To correct them no software are written but * |
* in National board package there's the program to calibrate * |
* the board. Otherwise you can see how much is the offset * |
* and you can compensate it through software value * |
*****************************************************************************/ |
/* This file is part of the S.Ha.R.K. Project - http://shark.sssup.it |
* |
* Copyright (C) 2001 Marco Ziglioli |
* |
* 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 <drivers/shark_fb26.h> |
#include <drivers/shark_keyb26.h> |
#include <drivers/pci6025e/dac.h> |
#define TASK_VOLT_PERIOD 150E3 |
#define TASK_VOLT_WCET 080E3 |
#define TASK_DAC_PERIOD 050E3 |
#define TASK_DAC_WCET 020E3 |
#define CONV 10/2048 |
#define TASK_GROUP 1 |
WORD dac0_value = 0, |
dac1_value = 0; |
BYTE sys = 0; |
BYTE dac = 0; |
//some colors |
int black = rgb16(0, 0, 0), |
white = rgb16(255, 255, 255); |
void drawInterface(void); |
void endfun(KEY_EVT *); |
void inc(KEY_EVT *); |
void dec(KEY_EVT *); |
void change_dac(KEY_EVT *); |
void close_event(void *); |
TASK Voltage_body(int); |
TASK DAC_Check_body(int); |
int main(int argc, char **argv) |
{ |
KEY_EVT k; |
HARD_TASK_MODEL m, d; |
PID pid_m, pid_d; |
k.flag = CNTR_BIT; |
k.scan = KEY_X; |
k.ascii = 'x'; |
k.status = KEY_PRESSED; |
keyb_hook(k, endfun, FALSE); |
k.flag = CNTL_BIT; |
k.status = KEY_PRESSED; |
keyb_hook(k, endfun, FALSE); |
k.flag = 0; |
k.scan = 78; |
k.ascii = 43; |
k.status = KEY_PRESSED; |
keyb_hook(k, inc, FALSE); |
k.flag = 0; |
k.scan = 74; |
k.ascii = 45; |
k.status = KEY_PRESSED; |
keyb_hook(k, dec, FALSE); |
k.flag = 0; |
k.scan = KEY_V; |
k.ascii = 'v'; |
k.status = KEY_PRESSED; |
keyb_hook(k, change_dac, FALSE); |
hard_task_default_model(m); |
hard_task_def_wcet(m, TASK_VOLT_WCET); |
hard_task_def_mit(m, TASK_VOLT_PERIOD); |
hard_task_def_group(m, TASK_GROUP); |
pid_m = task_create("Voltage", Voltage_body, &m, NULL); |
if(pid_m == NIL){ |
sys = 30; |
exit(1); |
} |
hard_task_default_model(d); |
hard_task_def_wcet(d, TASK_DAC_WCET); |
hard_task_def_mit(d, TASK_DAC_PERIOD); |
hard_task_def_group(d, TASK_GROUP); |
pid_d = task_create("DAC Check", DAC_Check_body, &d, NULL); |
if(pid_d == NIL){ |
sys = 31; |
exit(1); |
} |
//Check if a NI board is on PCI bus |
if(!reMap()){ |
sys = 11; |
exit(1); |
} |
drawInterface(); |
//Analog output section set up |
DAC_Init(); |
/* |
*AI_TIMEBASE div by 2; OUT_TIMEBASE div by 2; single DAC mode |
*TMRDACWR = 3 OUT_TIMEBASE period; FIFO flags polarity active low |
*TMRDACWR disabled; DMA PIO control = FIFO DATA interface mode |
*UPDATE signal timebase = AO_UPDATE pulse width |
*UPDATE pulsewidth = 3-3.5 OUT_TIMEBASE period |
*UPDATE signal polarity = HIGH Z |
*/ |
DAC_boardInit(0x02, 0x4000); |
/* |
*LDAC0 source = UPDATE |
*DAC0 update immediately |
*LDAC1 source = UPDATE |
*DAC1 update immediately |
*/ |
DAC_LDACSourceUpdate(0x00); |
//End of Analog output section setup |
group_activate(TASK_GROUP); |
return 0; |
} |
/* |
* Every time operator select a new value to send to a DAc this TASK makes |
* actions needed to perform the operation |
*/ |
TASK Voltage_body(int dac_work) |
{ |
WORD old0_value, old1_value; |
char buf[6]; |
float volt; |
old0_value = dac0_value; |
old1_value = dac1_value; |
while(1){ |
if(dac){ |
if(dac1_value != old1_value){ |
DAC_output(DAC1, dac1_value); |
old1_value = dac1_value; |
sprintf(buf, "%04d", dac1_value); |
grx_text(buf, 70, 120, rgb16(180, 0, 0), rgb16(255,255,140)); |
sprintf(buf, "%04x", dac1_value); |
grx_text(buf, 300, 120, rgb16(180, 0, 0), rgb16(255,255,140)); |
if( (dac1_value & 0x0800) == 0 ) |
volt = (float)dac1_value * (float)CONV; |
else |
volt = (float)(dac1_value-0x0FFF) * (float)CONV; |
sprintf(buf, "%05.2f", volt); |
grx_text(buf, 70, 177, rgb16(180, 40, 180), black); |
} |
} else { |
if(dac0_value != old0_value){ |
DAC_output(DAC0, dac0_value); |
old0_value = dac0_value; |
sprintf(buf, "%04d", dac0_value); |
grx_text(buf, 521, 120, rgb16(180, 0, 0), rgb16(255,255,140)); |
sprintf(buf, "%04x", dac0_value); |
grx_text(buf, 754, 120, rgb16(180, 0, 0), rgb16(255,255,140)); |
if( (dac0_value & 0x0800) == 0 ) |
volt = (float)dac0_value * (float)CONV; |
else |
volt = (float)(dac0_value-0x0FFF) * (float)CONV; |
sprintf(buf, "%05.2f", volt); |
grx_text(buf, 521, 177, rgb16(180, 40, 180), black); |
} |
} |
task_endcycle(); |
} |
} |
/* |
* This TASK show which is the DAC active |
*/ |
TASK DAC_Check_body(int dummy) |
{ |
BYTE old = dac; |
char buf[8]; |
while(1){ |
if(dac != old){ |
old = dac; |
sprintf(buf, "DAC %d", dac); |
grx_text(buf, 385, 90, rgb16(255*dac, 255*(1-dac), 0), black); |
} |
task_endcycle(); |
} |
} |
void drawInterface(void) |
{ |
grx_rect(1, 1, 799, 69, rgb16(105, 0, 0)); |
grx_rect(2, 2, 798, 68, rgb16(155, 0, 0)); |
grx_rect(3, 3, 797, 67, rgb16(205, 0, 0)); |
grx_rect(4, 4, 796, 66, rgb16(255, 0, 0)); |
grx_text("Test program for Analog output section of PCI6025E", |
7, 10, rgb16(50, 255, 50), black); |
grx_text("Use '+' and '-' on numeric pad to change tension", |
7, 25, rgb16(0, 255, 255), black); |
grx_text("Connect a tester to DAC1 output (pin21) or to DAC0 output (pin20)", |
7, 33, rgb16(0, 255, 255), black); |
grx_text("Use 'v' to alternate change active DAC", |
7, 40, rgb16(0, 255, 255), black); |
grx_text("CTRL-X for Exit", 7, 55, rgb16(200, 200, 0), black); |
grx_rect(1, 80, 355, 150, rgb16(0, 105, 0)); |
grx_rect(2, 81, 354, 149, rgb16(0, 155, 0)); |
grx_rect(3, 82, 353, 148, rgb16(0, 205, 0)); |
grx_rect(4, 83, 352, 147, rgb16(0, 255, 0)); |
grx_rect(1, 160, 355, 199, rgb16(0, 105, 0)); |
grx_rect(2, 161, 354, 198, rgb16(0, 155, 0)); |
grx_rect(3, 162, 353, 197, rgb16(0, 205, 0)); |
grx_rect(4, 163, 352, 196, rgb16(0, 255, 0)); |
grx_rect(455, 80, 799, 150, rgb16(105, 105, 0)); |
grx_rect(456, 81, 798, 149, rgb16(155, 155, 0)); |
grx_rect(457, 82, 797, 148, rgb16(205, 205, 0)); |
grx_rect(458, 83, 796, 147, rgb16(255, 255, 0)); |
grx_rect(455, 160, 799, 199, rgb16(105, 105, 0)); |
grx_rect(456, 161, 798, 198, rgb16(155, 155, 0)); |
grx_rect(457, 162, 797, 197, rgb16(205, 205, 0)); |
grx_rect(458, 163, 796, 196, rgb16(255, 255, 0)); |
grx_rect(360, 80, 450, 105, rgb16(85, 85, 255)); |
grx_rect(361, 81, 449, 104, rgb16(125, 125, 255)); |
grx_rect(362, 82, 448, 103, rgb16(175, 175, 255)); |
grx_rect(363, 83, 447, 102, rgb16(225, 225, 255)); |
grx_rect(153, 93, 195, 103, rgb16(255, 0, 0)); |
grx_text("DAC 1", 155, 95, rgb16(255, 170, 170), black); |
grx_rect(607, 93, 649, 103, rgb16(255, 0, 0)); |
grx_text("DAC 0", 609, 95, rgb16(255, 255, 210), black); |
grx_text("Decimal", 7, 120, rgb16(120, 120, 255), black); |
grx_text("Hexadecimal", 200, 120, rgb16(120, 120, 255), black); |
grx_text("Tension", 7, 177, rgb16(120, 120, 255), black); |
grx_text("Decimal", 461, 120, rgb16(255, 120, 120), black); |
grx_text("Hexadecimal", 654, 120, rgb16(255, 120, 120), black); |
grx_text("Tension", 461, 177, rgb16(255, 120, 120), black); |
} |
void close_event(void *arg) |
{ |
switch(sys){ |
case 0 : sys_shutdown_message("Regular End\n"); break; |
case 1 : sys_shutdown_message("End fun invoked\n"); break; |
case 10: sys_shutdown_message("Pci bus not found\n"); break; |
case 11: sys_shutdown_message("No National board found\n"); break; |
case 20: sys_shutdown_message("Cannot initialize graphic envirorment\n"); break; |
case 21: sys_shutdown_message("Cannot start envirorment in 800x600x16\n"); break; |
case 30: sys_shutdown_message("Cannot create task <voltage>\n"); break; |
case 31: sys_shutdown_message("Canot create task <DAC Check>\n"); break; |
case 40: sys_shutdown_message("Break on clock end event\n"); break; |
default: sys_shutdown_message("Unkwon exit event\n"); break; |
} |
} |
void endfun(KEY_EVT *k) |
{ |
close_event(NULL); |
exit(1); |
} |
/* |
* Capture correct key event and increase output tension of active DAC |
*/ |
void inc(KEY_EVT *k) |
{ |
if(dac){ |
if( (dac1_value & 0x0800) == 0 && dac1_value > 0x07FF ) |
dac1_value = 0; |
else |
dac1_value++; |
} else { |
if( (dac0_value & 0x0800) == 0 && dac0_value > 0x07FF ) |
dac0_value = 0; |
else |
dac0_value++; |
} |
} |
/* |
* Same as above but decrease tension |
*/ |
void dec(KEY_EVT *k) |
{ |
if(dac){ |
if(dac1_value < 1) |
dac1_value = 0x0FFF; |
else |
dac1_value -= 1; |
} else { |
if(dac0_value < 1) |
dac0_value = 0x0FFF; |
else |
dac0_value -= 1; |
} |
} |
/* |
* Capture correct key event and change active DAC |
*/ |
void change_dac(KEY_EVT *k) |
{ |
if(dac) dac = 0; |
else dac = 1; |
} |
/demos/tags/rel_1_5_beta1/pci6025e/test_ec.c |
---|
0,0 → 1,392 |
/***************************************************************************** |
* Filename: test_ec.c * |
* Author: Marco Ziglioli (Doctor Stein) * |
* Date: 20/06/2001 * |
* Description: Test program for gated event counting using PCI6025E board * |
*----------------------------------------------------------------------------* |
* Notes: FOUT are enabled to provide a frequency of 6250 Hz. You could * |
* connect PFI3 (pin 41) and PFI6 (pin 45) to this source for counting * |
* edges. Gated counting are enabled and PFI4 (pin 42) is gate pin for * |
* counter 0 and PFI5 (pin 44) is gate pin for counter 0. DIO 7 and 6 * |
* are als configured to switch between 0 and 5 V. Connect DIO 7 to * |
* gate 0 and DIO 6 to gate 1. Use 'g' (counter 0) and 'h' (counter 1) * |
* to change DIO lines value. On left area of the screen you should * |
* see counter while counting and on the right area you should lock * |
* counter values by pressing 's' key. * |
* Notice that line parameters are enabled and accept inital value * |
* for the two counters. If they aren't specified or they are wrong * |
* counters start from 0x00FFFFFF (counter 0 which counts down) and * |
* 0x00000000 (counter 1 which counts up). * |
* Last time addiction: TC Interrupts and Gate interrupts are enabled * |
* Bottom squares indicates when an interrupt is * |
* raised * |
*****************************************************************************/ |
/* This file is part of the S.Ha.R.K. Project - http://shark.sssup.it |
* |
* Copyright (C) 2001 Marco Ziglioli |
* |
* 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 <drivers/shark_keyb26.h> |
#include <drivers/shark_fb26.h> |
#include <drivers/pci6025e/timer.h> |
#include <drivers/pci6025e/dio_ppi.h> |
#ifndef INT_NO |
#define INT_NO NIDevice_info[0].InterruptLevel |
#endif |
BYTE sys = 0; |
PID show_aper_pid; |
BYTE out = 0x00; |
int black = rgb16(0, 0, 0), |
white = rgb16(255, 255, 255); |
void endfun(KEY_EVT *); |
void close_event(void *); |
void show_evt(KEY_EVT *k); |
void gate_change(KEY_EVT *k); |
void drawInterface(void); |
void int_evt(int intno); |
TASK show_per(int); |
TASK show_aper(int); |
int main(int argc, char **argv) |
{ |
KEY_EVT k; |
SOFT_TASK_MODEL show_per_mod, show_aper_mod; |
PID show_per_pid; |
int result; |
DWORD init_val_c0, init_val_c1; |
if(argc >= 3){ |
if( (result = sscanf(argv[1], "%ld", &init_val_c0)) != 1) |
init_val_c0 = 0x00FFFFFF; |
if( (result = sscanf(argv[2], "%ld", &init_val_c1)) != 1) |
init_val_c1 = 0x00000000; |
} |
if(argc == 2){ |
if( (result = sscanf(argv[1], "%ld", &init_val_c0)) != 1) |
init_val_c0 = 0x00FFFFFF; |
init_val_c1 = 0x00000000; |
} |
if(argc == 1){ |
init_val_c0 = 0x00FFFFFF; |
init_val_c1 = 0x00000000; |
} |
k.flag = CNTL_BIT; |
k.scan = KEY_X; |
k.ascii = 'x'; |
k.status = KEY_PRESSED; |
keyb_hook(k, endfun, FALSE); |
k.flag = CNTR_BIT; |
k.status = KEY_PRESSED; |
keyb_hook(k, endfun, FALSE); |
soft_task_default_model(show_aper_mod); |
soft_task_def_aperiodic(show_aper_mod); |
soft_task_def_level(show_aper_mod, 2); |
soft_task_def_period(show_aper_mod, 250000); |
soft_task_def_met(show_aper_mod, 30000); |
soft_task_def_wcet(show_aper_mod, 60000); |
if( (show_aper_pid = task_create("Show aperiodic task", show_aper, &show_aper_mod, NULL)) == NIL ){ |
sys = 10; |
exit(1); |
} |
k.flag = 0; |
k.scan = KEY_S; |
k.ascii = 's'; |
k.status = KEY_PRESSED; |
keyb_hook(k, show_evt, FALSE); |
k.flag = 0; |
k.scan = KEY_G; |
k.ascii = 'g'; |
k.status = KEY_PRESSED; |
keyb_hook(k, gate_change, FALSE); |
k.scan = KEY_H; |
k.ascii = 'h'; |
k.status = KEY_PRESSED; |
keyb_hook(k, gate_change, FALSE); |
soft_task_default_model(show_per_mod); |
soft_task_def_level(show_per_mod, 2); |
soft_task_def_met(show_per_mod, 1000); |
soft_task_def_period(show_per_mod, 10000); |
if( (show_per_pid = task_create("Show periodic task", show_per, &show_per_mod, NULL)) == NIL){ |
sys = 11; |
exit(1); |
} |
if(!reMap()){ |
sys = 21; |
exit(1); |
} |
drawInterface(); |
//Init DIO lines used to manage counters gates |
DIO_init(); |
DIO_setup(0xFF); |
DIO_write(out); |
//All PFI are configured as input |
PFIprogramming(0x0000); |
//FOUT enable; Slow TIMEBASE, divided by two; divided by 16 on FOUT pin |
setIntClock(1, 1, 0); |
TIM_reset(2); //Reset both two counters |
//Source PFI3(41); Gate PFI 4(42); Down counting; counts rising edge; |
TIM_eventCounting(C0, 0x04, 0x45, 0x03, init_val_c0); |
//Source PFI6(45); Gate PFI 5(44); Up counting; counts rising edge; |
TIM_eventCounting(C1, 0x87, 0x46, 0x03, init_val_c1); |
//Set up interrupt group A and B enabling and programming to assert a request |
//both on line 2 and 3 respectively |
INT_setup(0x0A, 0x0B); |
INT_personalize(0x03); //Interrupt request polarity low; IRQ driven on line 0 and 1 |
handler_set(INT_NO, int_evt, show_aper_pid, FALSE); |
TIM_arm(2); //Arm both two counters |
task_activate(show_per_pid); |
return 0; |
} |
void drawInterface(void) |
{ |
grx_rect(1, 1, 799, 99, rgb16(105, 0, 0)); |
grx_rect(2, 2, 798, 98, rgb16(155, 0, 0)); |
grx_rect(3, 3, 797, 97, rgb16(205, 0, 0)); |
grx_rect(4, 4, 796, 96, rgb16(255, 0, 0)); |
grx_text("Test program for Gated Event Counting capacity of PCI6025E timers", |
7, 10, rgb16(50, 255, 50), black); |
grx_text("This program counting rise edges on counters source (PFI3 & PFI6) when releted gates", |
7, 25, rgb16(0, 255, 255), black); |
grx_text("(PFI 42 & 44) are enabled. Frequency Out (FOUT) is enabled and provides a frequency of 6250 Hz", |
7, 33, rgb16(0, 255, 255), black); |
grx_text("Instruction:",7, 43, rgb16(255, 0, 0), black); |
grx_text("Use 's' to lock counters value in right squares", |
7, 51, rgb16(0, 255, 255), black); |
grx_text("Use 'g' to block or to release alternativly counter 0 (see top-left square)", |
7, 58, rgb16(0, 255, 255), black); |
grx_text("Use 'h' to block or to release alternativly counter 1 (see bottom-left square)", |
7, 65, rgb16(0, 255, 255), black); |
grx_text("Please connect DIO7 (pin 32) to PFI4 (pin 42) and DIO6 (pin 30) to PFI5 (pin 44)", |
7, 78, rgb16(0, 255, 0), black); |
grx_text("CTRL-X for Exit", 7, 88, rgb16(200, 200, 0), black); |
grx_rect(1, 110, 355, 170, rgb16(0, 105, 0)); |
grx_rect(2, 111, 354, 169, rgb16(0, 155, 0)); |
grx_rect(3, 112, 353, 168, rgb16(0, 205, 0)); |
grx_rect(4, 113, 352, 167, rgb16(0, 255, 0)); |
grx_text("Counter 0 evolution", 7, 120, rgb16(255, 255, 0), black); |
grx_rect(455, 110, 799, 170, rgb16(0, 105, 0)); |
grx_rect(456, 111, 798, 169, rgb16(0, 155, 0)); |
grx_rect(457, 112, 797, 168, rgb16(0, 205, 0)); |
grx_rect(458, 113, 796, 167, rgb16(0, 255, 0)); |
grx_text("Counter 0 locked value", 461, 120, rgb16(255, 0, 255), black); |
grx_rect(360, 110, 450, 170, rgb16(0, 105, 0)); |
grx_rect(361, 111, 449, 169, rgb16(0, 155, 0)); |
grx_rect(362, 112, 448, 168, rgb16(0, 205, 0)); |
grx_rect(363, 113, 447, 167, rgb16(0, 255, 0)); |
grx_text("Gate0", 367, 120, rgb16(200, 255, 200), black); |
grx_text("0 V", 367, 145, rgb16(255, 0, 0), black); |
grx_rect(1, 190, 355, 260, rgb16(85, 85, 255)); |
grx_rect(2, 191, 354, 259, rgb16(135, 135, 255)); |
grx_rect(3, 192, 353, 258, rgb16(190, 190, 255)); |
grx_rect(4, 193, 352, 257, rgb16(230, 239, 255)); |
grx_text("Counter 1 evolution", 7, 200, white, black); |
grx_rect(455, 190, 799, 260, rgb16(85, 85, 255)); |
grx_rect(456, 191, 798, 259, rgb16(135, 135, 255)); |
grx_rect(457, 192, 797, 258, rgb16(190, 190, 255)); |
grx_rect(458, 193, 796, 257, rgb16(230, 230, 255)); |
grx_text("Counter 1 locked value", 461, 200, white, black); |
grx_rect(360, 190, 450, 260, rgb16(85, 85, 255)); |
grx_rect(361, 191, 449, 259, rgb16(135, 135, 255)); |
grx_rect(362, 192, 448, 258, rgb16(190, 190, 255)); |
grx_rect(363, 193, 447, 257, rgb16(230, 230, 255)); |
grx_text("Gate1", 367, 200, rgb16(255, 200, 255), black); |
grx_text("0 V", 367, 225, rgb16(255, 0, 0), black); |
grx_text("Counter 0 Interrupt events", 7, 340, rgb16(255, 200, 100), black); |
grx_text("Counter 1 Interrupt events", 461, 340, rgb16(255, 200, 100), black); |
grx_rect(1, 350, 355, 400, rgb16(105, 0, 0)); |
grx_rect(2, 351, 354, 399, rgb16(155, 0, 0)); |
grx_rect(3, 352, 353, 398, rgb16(205, 0, 0)); |
grx_rect(4, 353, 352, 397, rgb16(255, 0, 0)); |
grx_rect(455, 350, 799, 400, rgb16(105, 0, 0)); |
grx_rect(456, 351, 798, 399, rgb16(155, 0, 0)); |
grx_rect(457, 352, 797, 398, rgb16(205, 0, 0)); |
grx_rect(458, 353, 796, 397, rgb16(255, 0, 0)); |
} |
TASK show_per(int none) |
{ |
DWORD val; |
char buf[30]; |
while(1){ |
val = TIM_readCounter(C0); //Read counter 0 value |
sprintf(buf, "HEX: %08lx DEC: %08ld", val ,val); |
grx_text(buf, 7, 145, rgb16(255, 0, 0), black); |
val = TIM_readCounter(C1); //Read counter 1 value |
sprintf(buf, "HEX: %08lx DEC: %08ld", val ,val); |
grx_text(buf, 7, 225, rgb16(255, 0, 0), black); |
task_endcycle(); |
} |
} |
TASK show_aper(int dummy) |
{ |
DWORD val; |
char buf[30]; |
while(1){ |
val = TIM_readCounter(C0); |
sprintf(buf, "HEX: %08lx DEC: %08ld", val, val); |
grx_text(buf, 461, 145, rgb16(80, 80, 255), black); |
val = TIM_readCounter(C1); |
sprintf(buf, "HEX: %08lx DEC: %08ld", val, val); |
grx_text(buf, 461, 225, rgb16(80, 80, 255), black); |
task_endcycle(); |
} |
} |
void endfun(KEY_EVT *k) |
{ |
close_event(NULL); |
exit(1); |
} |
void show_evt(KEY_EVT *k) |
{ |
task_activate(show_aper_pid); |
} |
void gate_change(KEY_EVT *k) |
{ |
if(k->ascii == 'g'){ |
if( (out & 0x80) != 0){ |
out &= 0x7F; |
grx_text("0 V", 367, 145, rgb16(255, 0, 0), black); |
} else { |
out |= 0x80; |
grx_text("5 V", 367, 145, rgb16(0, 255, 0), black); |
} |
} else { |
if( (out & 0x40) != 0){ |
out &= 0xBF; |
grx_text("0 V", 367, 225, rgb16(255, 0, 0), black); |
} else { |
out |= 0x40; |
grx_text("5 V", 367, 225, rgb16(0, 255, 0), black); |
} |
} |
DIO_write(out); |
} |
void close_event(void *arg) |
{ |
TIM_disarm(2); //Disable both two counters |
handler_remove(INT_NO); |
switch(sys){ |
case 0: sys_shutdown_message("OK\n"); break; |
case 10: sys_shutdown_message("Task <show aperiodic> down\n"); break; |
case 11: sys_shutdown_message("Task <show periodic> down\n"); break; |
case 20: sys_shutdown_message("No PCI bus\n"); break; |
case 21: sys_shutdown_message("No National board on PCI bus\n"); break; |
case 30: sys_shutdown_message("No graphic can be initialized\n"); break; |
case 31: sys_shutdown_message("This graphic mode cannot be supported\n"); break; |
default: sys_shutdown_message("???????????\n"); break; |
} |
} |
void int_evt(int intno) |
{ |
WORD status; |
status = DAQ_STC_Windowed_Mode_Read(AI_STATUS_1); |
if( (status & 0x8000) != 0){ |
if( (status & 0x0008) != 0){ |
grx_text("INT Group A raised! G0 Rolls over", 7, 360, rgb16(0, 255, 0), black); |
set(interrupt_a_ack, 14); |
DAQ_STC_Windowed_Mode_Write(INTERRUPT_A_ACK, interrupt_a_ack); |
clr(interrupt_a_ack, 14); |
} |
if( (status & 0x0004) != 0){ |
grx_text("INT Group A raised! G0 gate pressed", 7, 380, rgb16(0, 255, 0), black); |
set(interrupt_a_ack, 15); |
DAQ_STC_Windowed_Mode_Write(INTERRUPT_A_ACK, interrupt_a_ack); |
clr(interrupt_a_ack, 15); |
} |
return; |
} |
status = DAQ_STC_Windowed_Mode_Read(AO_STATUS_1); |
if( (status & 0x8000) != 0){ |
if( (status & 0x0008) != 0){ |
grx_text("INT Group B raised! G1 Rolls over", 461, 360, rgb16(0, 255, 0), black); |
set(interrupt_b_ack, 14); |
DAQ_STC_Windowed_Mode_Write(INTERRUPT_B_ACK, interrupt_b_ack); |
clr(interrupt_b_ack, 14); |
} |
if( (status & 0x0004) != 0){ |
grx_text("INT Group B raised! G1 gate pressed", 461, 380, rgb16(0, 255, 0), black); |
set(interrupt_b_ack, 15); |
DAQ_STC_Windowed_Mode_Write(INTERRUPT_B_ACK, interrupt_b_ack); |
clr(interrupt_b_ack, 15); |
} |
return; |
} |
} |
/* End of file: Test_ec.c */ |
/demos/tags/rel_1_5_beta1/pci6025e/test_ppi.c |
---|
0,0 → 1,177 |
/***************************************************************************** |
* Filename: Test_ppi.c * |
* Author: Marco Ziglioli (Doctor Stein) * |
* Date: 22/05/2001 * |
* Description: Test PPI82C55MSM on NI DAQ PCI6025E * |
*----------------------------------------------------------------------------* |
* Notes: Configures port A and port C in input and port B in output * |
* Test 1: * |
* Now connect port B to port A and watch on video value changes * |
* in counting order. After connect port B to port C and watch * |
* the same events on port C * |
* Test 2: * |
* Connect 8 LEDs on port B and port A and port C lines to Vcc or* |
* GND. Now run this test and watch 8 diode changing in counting * |
* mode and on screen port A and port C values displayed * |
*****************************************************************************/ |
/* This file is part of the S.Ha.R.K. Project - http://shark.sssup.it |
* |
* Copyright (C) 2001 Marco Ziglioli |
* |
* 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 <drivers/shark_keyb26.h> |
#include <drivers/shark_fb26.h> |
#include <drivers/pci6025e/dio_ppi.h> |
void exit_fun(KEY_EVT *); |
TASK test_ppi(int); |
void close_event(void *); |
void draw_screen(void); |
BYTE system = 0; |
int main(int argc, char **argv) |
{ |
HARD_TASK_MODEL m; |
KEY_EVT k; |
PID pid_m; |
k.flag = CNTL_BIT; |
k.scan = KEY_C; |
k.ascii = 'c'; |
k.status = KEY_PRESSED; |
keyb_hook(k, exit_fun, FALSE); |
k.flag = CNTR_BIT; |
k.scan = KEY_C; |
k.ascii = 'c'; |
k.status = KEY_PRESSED; |
keyb_hook(k, exit_fun, FALSE); |
hard_task_default_model(m); |
hard_task_def_wcet(m, 90000); |
hard_task_def_mit(m, 250000); |
pid_m = task_create("TEST PPI", test_ppi, &m, NULL); |
if(pid_m == NIL){ |
system = 10; |
exit(1); |
} |
//Look for a National board on PCI bus |
if(!reMap()){ |
system = 21; |
exit(1); |
} |
//Start configuring DIO module |
PPI_init(); |
draw_screen(); |
task_activate(pid_m); |
return 0; |
} |
void draw_screen(void) |
{ |
grx_rect(5, 5, 610, 130, rgb16(255, 0, 0)); |
grx_rect(4, 4, 611, 131, rgb16(0,255,255)); |
grx_rect(3, 3, 612, 132, rgb16(255, 0, 0)); |
grx_rect(15, 45, 195, 100, rgb16(255, 0, 0)); |
grx_rect(215, 45, 395, 100, rgb16(0, 255, 0)); |
grx_rect(415, 45, 595, 100, rgb16(200, 200, 255)); |
grx_text("Test of PPI82C55MSM function (Hosted on PCI6025E)", |
9, 7, rgb16(0, 255, 0), rgb16(0, 0, 0)); |
grx_text("PORT A and PORT C are configured in input mode", |
9, 20, rgb16(255, 70, 70), rgb16(0, 0, 0)); |
grx_text("PORT B is configured in output mode", |
9, 28, rgb16(255, 70, 70), rgb16(0, 0, 0)); |
grx_text("PORT B (Output)", 35, 50, rgb16(200, 0, 0), rgb16(0, 0, 0)); |
grx_text("PORT A (Input)", 235, 50, rgb16(30,255,30), rgb16(0, 0, 0)); |
grx_text("PORT C (Input)", 435, 50, rgb16(200,200,255), rgb16(0, 0, 0)); |
grx_text("CTRL + C to exit", 9, 115, rgb16(255,255,0), rgb16(0,0,0)); |
} |
/* |
* At each activation this task sends out value on port B and reads values from |
* port A and C |
*/ |
TASK test_ppi(int dummy) |
{ |
BYTE val, pA, pC; |
int i; |
char buf[10]; |
PPI_config(0x99); //Mode 0 for all; Port A, Port C input; Port B output |
val = 0; |
while(1){ |
PPI_write(PPI_PORT_B, val); //sends out value |
pA = PPI_read(PPI_PORT_A); //reads from port A |
pC = PPI_read(PPI_PORT_C); //reads from port C |
for(i=7; i>=0; i--){ |
if( (val>>i)%2 ) |
grx_text("1", 25+10*(7-i), 75, rgb16(255,0,0), rgb16(0,0,0)); |
else |
grx_text("0", 25+10*(7-i), 75, rgb16(255,0,0), rgb16(0,0,0)); |
if( (pA>>i)%2 ) |
grx_text("1", 225+10*(7-i), 75, rgb16(0,255,0), rgb16(0,0,0)); |
else |
grx_text("0", 225+10*(7-i), 75, rgb16(0,255,0), rgb16(0,0,0)); |
if( (pC>>i)%2 ) |
grx_text("1", 425+10*(7-i), 75, rgb16(200,200,255), rgb16(0,0,0)); |
else |
grx_text("0", 425+10*(7-i), 75, rgb16(200,200,255), rgb16(0,0,0)); |
} |
sprintf(buf, "%03d", val); |
grx_text(buf, 140, 75, rgb16(255,0,0), rgb16(0,0,0)); |
sprintf(buf, "%03d", pA); |
grx_text(buf, 340, 75, rgb16(0,255,0), rgb16(0,0,0)); |
sprintf(buf, "%03d", pC); |
grx_text(buf, 540, 75, rgb16(200,200,255), rgb16(0,0,0)); |
val++; |
task_endcycle(); |
} |
} |
void close_event(void *arg) |
{ |
switch(system){ |
case 0: sys_shutdown_message("Regular end\n"); break; |
case 10:sys_shutdown_message("Cannot create task 'TEST PPI'\n"); break; |
case 20:sys_shutdown_message("Pci bus don't find\n"); break; |
case 21:sys_shutdown_message("No National board on PC\n"); break; |
case 30:sys_shutdown_message("Cannot start graphic envirorment\n"); break; |
default: sys_shutdown_message("Unknown exit\n"); break; |
} |
} |
void exit_fun(KEY_EVT *k) |
{ |
system = 0; |
close_event(NULL); |
exit(1); |
} |
/*end of file: test_ppi.c*/ |
/demos/tags/rel_1_5_beta1/pci6025e/test_bec.c |
---|
0,0 → 1,324 |
/***************************************************************************** |
* Filename: test_bec.c * |
* Author: Marco Ziglioli (Doctor Stein) * |
* Date: 20/06/2001 * |
* Description: Test program for buffered gated event counting using PCI6025E * |
* board * |
*----------------------------------------------------------------------------* |
* Notes: FOUT are enabled to provide a frequency of 6250 Hz. You could * |
* connect PFI3 (pin 41) and PFI6 (pin 45) to this source for counting * |
* edges. Gated counting are enabled and PFI4 (pin 42) is gate pin for * |
* counter 0 and PFI5 (pin 44) is gate pin for counter 0. DIO 7 and 6 * |
* are als configured to switch between 0 and 5 V. Connect DIO 7 to * |
* gate 0 and DIO 6 to gate 1. Use 'g' (counter 0) and 'h' (counter 1) * |
* to change DIO lines value. On left area of the screen you should * |
* see counter while counting and on the right area you should lock * |
* counter values by pressing 's' key. * |
* Notice that line parameters are enabled and accept inital value * |
* for the two counters. If they aren't specified or they are wrong * |
* counters start from 0x00FFFFFF (counter 0 which counts down) and * |
* 0x00000000 (counter 1 which counts up). * |
*****************************************************************************/ |
/* This file is part of the S.Ha.R.K. Project - http://shark.sssup.it |
* |
* Copyright (C) 2001 Marco Ziglioli |
* |
* 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 <drivers/shark_keyb26.h> |
#include <drivers/shark_fb26.h> |
#include <drivers/pci6025e/timer.h> |
#include <drivers/pci6025e/dio_ppi.h> |
BYTE sys = 0; |
PID show_aper_pid; |
BYTE out = 0x00; |
int black = rgb16(0, 0, 0), |
white = rgb16(255, 255, 255); |
void endfun(KEY_EVT *); |
void close_event(void *); |
void show_evt(KEY_EVT *k); |
void gate_change(KEY_EVT *k); |
void drawInterface(void); |
TASK show_per(int); |
TASK show_aper(int); |
int main(int argc, char **argv) |
{ |
KEY_EVT k; |
SOFT_TASK_MODEL show_per_mod, show_aper_mod; |
PID show_per_pid; |
int result; |
DWORD init_val_c0, init_val_c1; |
if(argc >= 3){ |
if( (result = sscanf(argv[1], "%ld", &init_val_c0)) != 1) |
init_val_c0 = 0x00FFFFFF; |
if( (result = sscanf(argv[2], "%ld", &init_val_c1)) != 1) |
init_val_c1 = 0x00000000; |
} |
if(argc == 2){ |
if( (result = sscanf(argv[1], "%ld", &init_val_c0)) != 1) |
init_val_c0 = 0x00FFFFFF; |
init_val_c1 = 0x00000000; |
} |
if(argc == 1){ |
init_val_c0 = 0x00FFFFFF; |
init_val_c1 = 0x00000000; |
} |
k.flag = CNTL_BIT; |
k.scan = KEY_X; |
k.ascii = 'x'; |
k.status = KEY_PRESSED; |
keyb_hook(k, endfun, FALSE); |
k.flag = CNTR_BIT; |
k.status = KEY_PRESSED; |
keyb_hook(k, endfun, FALSE); |
soft_task_default_model(show_aper_mod); |
soft_task_def_aperiodic(show_aper_mod); |
soft_task_def_level(show_aper_mod, 2); |
soft_task_def_period(show_aper_mod, 250000); |
soft_task_def_met(show_aper_mod, 30000); |
soft_task_def_wcet(show_aper_mod, 60000); |
if( (show_aper_pid = task_create("Show aperiodic task", show_aper, &show_aper_mod, NULL)) == NIL ){ |
sys = 10; |
exit(1); |
} |
k.flag = 0; |
k.scan = KEY_S; |
k.ascii = 's'; |
k.status = KEY_PRESSED; |
keyb_hook(k, show_evt, FALSE); |
k.flag = 0; |
k.scan = KEY_G; |
k.ascii = 'g'; |
k.status = KEY_PRESSED; |
keyb_hook(k, gate_change, FALSE); |
k.scan = KEY_H; |
k.ascii = 'h'; |
k.status = KEY_PRESSED; |
keyb_hook(k, gate_change, FALSE); |
soft_task_default_model(show_per_mod); |
soft_task_def_level(show_per_mod, 2); |
soft_task_def_met(show_per_mod, 1000); |
soft_task_def_period(show_per_mod, 10000); |
if( (show_per_pid = task_create("Show periodic task", show_per, &show_per_mod, NULL)) == NIL){ |
sys = 11; |
exit(1); |
} |
if(!reMap()){ |
sys = 21; |
exit(1); |
} |
drawInterface(); |
DIO_init(); |
DIO_setup(0xFF); |
DIO_write(out); |
PFIprogramming(0x0000); |
setIntClock(1, 1, 0); |
TIM_reset(2); //Reset both two counters |
//Source PFI3(41); Gate PFI 4(42); Down counting; counts rising edge; |
TIM_bufferedEventCounting(C0, 0x04, 0x45, 0x01, init_val_c0); |
//Source PFI6(45); Gate PFI 5(44); Up counting; counts rising edge; |
TIM_bufferedEventCounting(C1, 0x87, 0x46, 0x00, init_val_c1); |
TIM_arm(2); //Arm both two counters |
task_activate(show_per_pid); |
return 0; |
} |
void drawInterface(void) |
{ |
grx_rect(1, 1, 799, 99, rgb16(105, 0, 0)); |
grx_rect(2, 2, 798, 98, rgb16(155, 0, 0)); |
grx_rect(3, 3, 797, 97, rgb16(205, 0, 0)); |
grx_rect(4, 4, 796, 96, rgb16(255, 0, 0)); |
grx_text("Test program for Buffered Event Counting capacity of PCI6025E timers", |
7, 10, rgb16(50, 255, 50), black); |
grx_text("This program counting rise edges on counters source (PFI3 & PFI6)", |
7, 18, rgb16(0, 255, 255), black); |
grx_text("Counter 1 will be resetted every gate falling edge", |
7, 26, rgb16(0, 255, 255), black); |
grx_text("(PFI 42 & 44) are enabled. Frequency Out (FOUT) is enabled and provides a frequency of 6250 Hz", |
7, 34, rgb16(0, 255, 255), black); |
grx_text("Instruction:",7, 43, rgb16(255, 0, 0), black); |
grx_text("Use 's' to watch contents of Hardware save registers updated every time gate goes down", |
7, 51, rgb16(0, 255, 255), black); |
grx_text("Use 'g' to generate an event on counter 0 gate (see top-left square)", |
7, 58, rgb16(0, 255, 255), black); |
grx_text("Use 'h' to generate an event on counter 1 gate (see bottom-left square)", |
7, 65, rgb16(0, 255, 255), black); |
grx_text("Please connect DIO7 (pin 32) to PFI4 (pin 42) and DIO6 (pin 30) to PFI5 (pin 44)", |
7, 78, rgb16(0, 255, 0), black); |
grx_text("CTRL-X for Exit", 7, 88, rgb16(200, 200, 0), black); |
grx_rect(1, 110, 355, 170, rgb16(0, 105, 0)); |
grx_rect(2, 111, 354, 169, rgb16(0, 155, 0)); |
grx_rect(3, 112, 353, 168, rgb16(0, 205, 0)); |
grx_rect(4, 113, 352, 167, rgb16(0, 255, 0)); |
grx_text("Counter 0 evolution", 7, 120, rgb16(255, 255, 0), black); |
grx_rect(455, 110, 799, 170, rgb16(0, 105, 0)); |
grx_rect(456, 111, 798, 169, rgb16(0, 155, 0)); |
grx_rect(457, 112, 797, 168, rgb16(0, 205, 0)); |
grx_rect(458, 113, 796, 167, rgb16(0, 255, 0)); |
grx_text("Counter 0 locked value", 461, 120, rgb16(255, 0, 255), black); |
grx_rect(360, 110, 450, 170, rgb16(0, 105, 0)); |
grx_rect(361, 111, 449, 169, rgb16(0, 155, 0)); |
grx_rect(362, 112, 448, 168, rgb16(0, 205, 0)); |
grx_rect(363, 113, 447, 167, rgb16(0, 255, 0)); |
grx_text("Gate0", 367, 120, rgb16(200, 255, 200), black); |
grx_text("0 V", 367, 145, rgb16(255, 0, 0), black); |
grx_rect(1, 190, 355, 260, rgb16(85, 85, 255)); |
grx_rect(2, 191, 354, 259, rgb16(135, 135, 255)); |
grx_rect(3, 192, 353, 258, rgb16(190, 190, 255)); |
grx_rect(4, 193, 352, 257, rgb16(230, 239, 255)); |
grx_text("Counter 1 evolution", 7, 200, white, black); |
grx_rect(455, 190, 799, 260, rgb16(85, 85, 255)); |
grx_rect(456, 191, 798, 259, rgb16(135, 135, 255)); |
grx_rect(457, 192, 797, 258, rgb16(190, 190, 255)); |
grx_rect(458, 193, 796, 257, rgb16(230, 230, 255)); |
grx_text("Counter 1 locked value", 461, 200, white, black); |
grx_rect(360, 190, 450, 260, rgb16(85, 85, 255)); |
grx_rect(361, 191, 449, 259, rgb16(135, 135, 255)); |
grx_rect(362, 192, 448, 258, rgb16(190, 190, 255)); |
grx_rect(363, 193, 447, 257, rgb16(230, 230, 255)); |
grx_text("Gate1", 367, 200, rgb16(255, 200, 255), black); |
grx_text("0 V", 367, 225, rgb16(255, 0, 0), black); |
} |
TASK show_per(int none) |
{ |
DWORD val; |
char buf[30]; |
while(1){ |
val = TIM_readCounter(C0); //Read from Hardware Save Register |
sprintf(buf, "HEX: %08lx DEC: %08ld", val ,val); |
grx_text(buf, 7, 145, rgb16(255, 0, 0), black); |
val = TIM_readCounter(C1); //Read from Hardware Save Register |
sprintf(buf, "HEX: %08lx DEC: %08ld", val ,val); |
grx_text(buf, 7, 225, rgb16(255, 0, 0), black); |
task_endcycle(); |
} |
} |
TASK show_aper(int dummy) |
{ |
DWORD val; |
char buf[30]; |
while(1){ |
val = TIM_readHWSaveReg(C0); //Read from Hardware Save Register |
sprintf(buf, "HEX: %08lx DEC: %08ld", val, val); |
grx_text(buf, 461, 145, rgb16(80, 80, 255), black); |
val = TIM_readHWSaveReg(C1); //Read from Hardware Save Register |
sprintf(buf, "HEX: %08lx DEC: %08ld", val, val); |
grx_text(buf, 461, 225, rgb16(80, 80, 255), black); |
task_endcycle(); |
} |
} |
void endfun(KEY_EVT *k) |
{ |
close_event(NULL); |
exit(1); |
} |
void show_evt(KEY_EVT *k) |
{ |
task_activate(show_aper_pid); |
} |
void gate_change(KEY_EVT *k) |
{ |
if(k->ascii == 'g'){ |
if( (out & 0x80) != 0){ |
out &= 0x7F; |
grx_text("0 V", 367, 145, rgb16(255, 0, 0), black); |
} else { |
out |= 0x80; |
grx_text("5 V", 367, 145, rgb16(0, 255, 0), black); |
} |
} else { |
if( (out & 0x40) != 0){ |
out &= 0xBF; |
grx_text("0 V", 367, 225, rgb16(255, 0, 0), black); |
} else { |
out |= 0x40; |
grx_text("5 V", 367, 225, rgb16(0, 255, 0), black); |
} |
} |
DIO_write(out); |
} |
void close_event(void *arg) |
{ |
TIM_disarm(2); //Disable both two counters |
switch(sys){ |
case 0: sys_shutdown_message("OK\n"); break; |
case 10: sys_shutdown_message("Task <show aperiodic> down\n"); break; |
case 11: sys_shutdown_message("Task <show periodic> down\n"); break; |
case 20: sys_shutdown_message("No PCI bus\n"); break; |
case 21: sys_shutdown_message("No National board on PCI bus\n"); break; |
case 30: sys_shutdown_message("No graphic can be initialized\n"); break; |
case 31: sys_shutdown_message("This graphic mode cannot be supported\n"); break; |
default: sys_shutdown_message("???????????\n"); break; |
} |
} |
/* End of file: Test_bec.c */ |
/demos/tags/rel_1_5_beta1/pci6025e/test_dio.c |
---|
0,0 → 1,171 |
/***************************************************************************** |
* Filename: Test_dio.c * |
* Author: Marco Ziglioli (Doctor Stein) * |
* Date: 22/03/2001 * |
* Last update: 22/03/2001 * |
* Description: Test STC digital lines (8 lines) * |
*----------------------------------------------------------------------------* |
* Notes: Configure DIO 4 5 6 7 in input and DIO 0 1 2 3 in output * |
* Two way to test this 8 lines: * |
* 1) Connect 4 LEDs to output lines and check LEDs lights * |
* themselves in counting order. Connect input lines to Vcc * |
* or GND and check on video that STC has readed the right * |
* nibble * |
* 2) Connect 4 output lines with 4 input lines and check on * |
* video that the nibble readed by STC change in counting * |
* order * |
*****************************************************************************/ |
/* This file is part of the S.Ha.R.K. Project - http://shark.sssup.it |
* |
* Copyright (C) 2001 Marco Ziglioli |
* |
* 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 <drivers/shark_fb26.h> |
#include <drivers/shark_keyb26.h> |
#include <drivers/pci6025e/dio_ppi.h> |
BYTE system = 0; |
void close_event(void *); |
TASK test_DIO(int dummy); |
void exit_fun(KEY_EVT *); |
void draw_screen(void); |
int main(int argc, char **argv) |
{ |
HARD_TASK_MODEL m; |
KEY_EVT k; |
PID pid_m; |
k.flag = CNTL_BIT; |
k.scan = KEY_C; |
k.ascii = 'c'; |
k.status = KEY_PRESSED; |
keyb_hook(k, exit_fun, FALSE); |
k.flag = CNTR_BIT; |
k.scan = KEY_C; |
k.ascii = 'c'; |
k.status = KEY_PRESSED; |
keyb_hook(k, exit_fun, FALSE); |
hard_task_default_model(m); |
hard_task_def_wcet(m, 90000); |
hard_task_def_mit(m, 250000); |
pid_m = task_create("TEST DIO", test_DIO, &m, NULL); |
if(pid_m == NIL){ |
system = 10; |
exit(1); |
} |
//Look for a National board on PCI bus |
if(!reMap()){ |
system = 21; |
exit(1); |
} |
//Start configuring DIO module |
DIO_init(); |
draw_screen(); |
task_activate(pid_m); |
return 0; |
} |
void draw_screen(void) |
{ |
grx_rect(5, 5, 405, 130, rgb16(255, 0, 0)); |
grx_rect(4, 4, 406, 131, rgb16(0,255,255)); |
grx_rect(3, 3, 407, 132, rgb16(255, 0, 0)); |
grx_rect(15, 45, 195, 100, rgb16(255, 0, 0)); |
grx_rect(215, 45, 395, 100, rgb16(0, 255, 0)); |
grx_text("Test of PCI6025E DIO function", |
9, 7, rgb16(0, 255, 0), rgb16(0, 0, 0)); |
grx_text("DIO 4-5-6-7 are configured in input mode", |
9, 20, rgb16(255, 70, 70), rgb16(0, 0, 0)); |
grx_text("DIO 0-1-2-3 are configured in output mode", |
9, 28, rgb16(255, 70, 70), rgb16(0, 0, 0)); |
grx_text("Output bits", 35, 50, rgb16(200, 0, 0), rgb16(0, 0, 0)); |
grx_text("input bits", 235, 50, rgb16(30,255,30), rgb16(0, 0, 0)); |
grx_text("CTRL + C to exit", 9, 115, rgb16(255,255,0), rgb16(0,0,0)); |
} |
/* |
* At each activation this task change output value of lowest digitals line |
* and read value on highest digital lines, showing them at video |
*/ |
TASK test_DIO(int dummy) |
{ |
BYTE out_val = 0x00, |
in_val = 0; |
int i; |
char buf[10]; |
//DIO 0..3 configured as output |
//DIO 4..7 configured as input |
DIO_setup(0x0F); |
while(1){ |
DIO_write(out_val); //sends out value |
in_val = DIO_read() >> 4; //reads value |
for(i=3; i>=0; i--){ |
if( (out_val>>i)%2 ) |
grx_text("1", 25+10*(3-i), 75, rgb16(255,0,0), rgb16(0,0,0)); |
else |
grx_text("0", 25+10*(3-i), 75, rgb16(255,0,0), rgb16(0,0,0)); |
if( (in_val>>i)%2 ) |
grx_text("1", 225+10*(3-i), 75, rgb16(0,255,0), rgb16(0,0,0)); |
else |
grx_text("0", 225+10*(3-i), 75, rgb16(0,255,0), rgb16(0,0,0)); |
} |
sprintf(buf, "%03d", out_val); |
grx_text(buf, 80, 75, rgb16(255,0,0), rgb16(0,0,0)); |
sprintf(buf, "%03d", in_val); |
grx_text(buf, 280, 75, rgb16(0,255,0), rgb16(0,0,0)); |
out_val = (out_val+1)%16; |
task_endcycle(); |
} |
} |
void close_event(void *arg) |
{ |
switch(system){ |
case 0: sys_shutdown_message("Regular end\n"); break; |
case 10:sys_shutdown_message("Cannot create task TEST DIO\n"); break; |
case 21:sys_shutdown_message("No National board on PC\n"); break; |
case 30:sys_shutdown_message("Cannot start graphic envirorment\n"); break; |
default: sys_shutdown_message("Unknown exit\n"); break; |
} |
} |
void exit_fun(KEY_EVT *k) |
{ |
system = 0; |
close_event(NULL); |
exit(1); |
} |
/demos/tags/rel_1_5_beta1/pci6025e/makefile |
---|
0,0 → 1,32 |
# |
# |
# PCI6025E Examples and Test programs |
# |
# |
ifndef BASE |
BASE=../.. |
endif |
include $(BASE)/config/config.mk |
PROGS= test_dac wave test_dio test_ppi test_ec test_bec test_mes test_bms |
include $(BASE)/config/example.mk |
test_dac: |
make -f $(SUBMAKE) APP=test_dac OTHEROBJS=initfile.o SHARKOPT="__LINUXC26__ __PCI__ __6025E__ __INPUT__ __FB__" |
wave: |
make -f $(SUBMAKE) APP=wave OTHEROBJS=initfile.o SHARKOPT="__LINUXC26__ __PCI__ __6025E__ __INPUT__ __FB__" |
test_dio: |
make -f $(SUBMAKE) APP=test_dio OTHEROBJS=initfile.o SHARKOPT="__LINUXC26__ __PCI__ __6025E__ __INPUT__ __FB__" |
test_ppi: |
make -f $(SUBMAKE) APP=test_ppi OTHEROBJS=initfile.o SHARKOPT="__LINUXC26__ __PCI__ __6025E__ __INPUT__ __FB__" |
test_ec: |
make -f $(SUBMAKE) APP=test_ec OTHEROBJS=initfile.o SHARKOPT="__LINUXC26__ __PCI__ __6025E__ __INPUT__ __FB__" |
test_bec: |
make -f $(SUBMAKE) APP=test_bec OTHEROBJS=initfile.o SHARKOPT="__LINUXC26__ __PCI__ __6025E__ __INPUT__ __FB__" |
test_mes: |
make -f $(SUBMAKE) APP=test_mes OTHEROBJS=initfile.o SHARKOPT="__LINUXC26__ __PCI__ __6025E__ __INPUT__ __FB__" |
test_bms: |
make -f $(SUBMAKE) APP=test_bms OTHEROBJS=initfile.o SHARKOPT="__LINUXC26__ __PCI__ __6025E__ __INPUT__ __FB__" |
/demos/tags/rel_1_5_beta1/base/cabs.dat |
---|
0,0 → 1,11 |
---------------------------------------------------- |
system tick (ms): 1 |
---------------------------------------------------- |
task periods (ticks) |
---------------------------------------------------- |
producer 1: 200 consumer 1: 400 |
producer 2: 100 consumer 2: 400 |
producer 3: 300 consumer 3: 150 |
producer 4: 800 consumer 4: 200 |
---------------------------------------------------- |
/demos/tags/rel_1_5_beta1/base/aster2.c |
---|
0,0 → 1,241 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Paolo Gai <pj@gandalf.sssup.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/* |
* 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 |
* |
* |
* CVS : $Id: aster2.c,v 1.6 2005-02-25 11:10:46 pj Exp $ |
this is a part of the classic Hartik demo Aster. |
It checks: |
- jet functions |
- The EDF level with many task, with almost full bandwidth used |
*/ |
#include "kernel/kern.h" |
#include "edf/edf/edf.h" |
int num_aster = 0; |
#define ASTER_LIM 60 |
#define DISPLAY_MAX 15 |
#define ASTER_MAX 70 |
#define STAT_Y 9 |
// first numbers for wcet and periods are for a 486/25, the others for a |
// celeron 366 |
#define PER_WCET 13000 /*6200*/ |
#define CLOCK_WCET 1200 /* 100*/ |
#define ASTER_WCET 1200 /* 100*/ |
#define ASTER_MEAN_PERIOD 64 /*64*/ |
#define END_TEST_TIME 60 |
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 = 1000; //10000; // 5000 + rand()%5000; |
for (j=0; j<load1; j++) { |
s[0] = '*' + rand() % 100; |
puts_xy(i,y,rand()%15+1,s); |
} |
task_endcycle(); |
puts_xy(i,y,WHITE," "); |
i++; |
} |
} |
num_aster--; |
return 0; |
} |
TASK aster() |
{ |
PID p; |
HARD_TASK_MODEL m; |
int r; |
int x; // adaptive bandwidth... |
hard_task_default_model(m); |
hard_task_def_wcet(m,PER_WCET); |
hard_task_def_ctrl_jet(m); |
x = ASTER_MEAN_PERIOD; |
srand(7); |
while (1) { |
if (num_aster < ASTER_MAX) { |
r = (rand() % 200); |
hard_task_def_arg(m,(void *)((rand() % 7)+1)); |
hard_task_def_mit(m, (x+r)*1000); |
p = task_create("aaa",asteroide,&m,NULL); |
if (p == -1) |
{ |
if (x < 500 && errno != ENO_AVAIL_TASK) x += 1; |
printf_xy(62,3,WHITE,"adapt=%3u err=%d", |
iq_query_first(&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,"U=%12u",EDF_usedbandwidth(1)); |
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,"U=%12u",EDF_usedbandwidth(1)); |
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) continue; |
for (j=0; j<5; j++) last[j] = 0; |
jet_gettable(p, &last[0], 5); |
kern_cli(); |
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++; |
} |
} |
} |
int main(int argc, char **argv) |
{ |
PID p1,p2,p3; //,p4,p5,p6; |
HARD_TASK_MODEL m; |
NRT_TASK_MODEL m_nrt; |
struct timespec t; |
clear(); |
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); |
p1 = task_create("Aster",aster,&m,NULL); |
if (p1 == -1) { |
sys_shutdown_message("test7.c(main): Could not create task <aster> ..."); |
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) { |
sys_shutdown_message("test7.c(main): Could not create task <Clock> ..."); |
exit(1); |
} |
p3 = task_create("JetControl",jetcontrol,&m_nrt,NULL); |
if (p2 == -1) { |
sys_shutdown_message("test7.c(main): Could not create task <JetControl> ..."); |
exit(1); |
} |
group_activate(1); |
do { |
sys_gettime(&t); |
} while (t.tv_sec < END_TEST_TIME); |
exit(0); |
return 0; |
} |
/demos/tags/rel_1_5_beta1/base/mdemo.c |
---|
0,0 → 1,189 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Paolo Gai <pj@gandalf.sssup.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/* |
* 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 |
* |
* |
* CVS : $Id: mdemo.c,v 1.4 2005-02-25 11:10:46 pj Exp $ |
This test verify the correctness of the NOP module. It works with the |
PI, PC, SRP module, too. |
The test uses one mutex |
the main task (NRT) creates three tasks. |
J1 with PC priority 0 |
starts at t=0.5 sec and lock m0 |
J2 with PC priority 1 |
starts at t=1 sec and doesn't lock any mutex |
J3 with PC priority 2 |
it starts and locks m0 |
at t=2 sec it unlocks m1 |
The example is similar to the scheduling diagram shown at p. 188 of the |
book "Sistemi in tempo Reale", by Giorgio Buttazzo, Pitagora Editrice |
*/ |
#include "kernel/kern.h" |
#include "srp/srp/srp.h" |
mutex_t m0; |
void startJ(void *a) |
{ |
task_activate((PID)a); |
} |
TASK j1() |
{ |
cprintf("J1: before locking m0\n"); |
mutex_lock(&m0); |
cprintf("J1: locked m0\n"); |
mutex_unlock(&m0); |
cprintf("J1: unlocked m0, end task\n"); |
return 0; |
} |
TASK j2() |
{ |
cprintf("J2: waiting t=1.5 sec\n"); |
while (sys_gettime(NULL) < 1500000); |
cprintf("J2: end task\n"); |
return 0; |
} |
TASK j3() |
{ |
cprintf("J3: before locking m0\n"); |
mutex_lock(&m0); |
cprintf("J3: locked m0, waiting to t=2 sec\n"); |
while (sys_gettime(NULL) < 2000000); |
cprintf("J3: t = 1 sec reached, unlocking m0\n"); |
mutex_unlock(&m0); |
cprintf("J3: unlocked m0, end task\n"); |
return 0; |
} |
int main(int argc, char **argv) |
{ |
struct timespec t; |
HARD_TASK_MODEL m; |
PID p0,p1,p2; |
PC_mutexattr_t a; |
PI_mutexattr_t a2; |
NOP_mutexattr_t a3; |
SRP_mutexattr_t a4; |
NPP_mutexattr_t a5; |
PC_RES_MODEL r; |
SRP_RES_MODEL srp; |
/* --------------------------------------------------------------------- |
Mutex creation |
--------------------------------------------------------------------- */ |
PC_mutexattr_default(a,0); |
PI_mutexattr_default(a2); |
NOP_mutexattr_default(a3); |
SRP_mutexattr_default(a4); |
NPP_mutexattr_default(a5); |
mutex_init(&m0,&a4); |
/* --------------------------------------------------------------------- |
Task creation |
--------------------------------------------------------------------- */ |
hard_task_default_model(m); |
hard_task_def_wcet(m,20000); |
hard_task_def_mit(m,10000000); |
PC_res_default_model(r,0); |
SRP_res_default_model(srp,3); |
p0 = task_createn("J1", j1, (TASK_MODEL *)&m, &r, &srp, SRP_usemutex(&m0), NULL); |
if (p0 == NIL) |
{ cprintf("Can't create J1 task...\n"); return 1; } |
hard_task_def_wcet(m,1600000); |
hard_task_def_mit(m,21000000); |
PC_res_default_model(r,1); |
SRP_res_default_model(srp,2); |
p1 = task_createn("J2", j2, (TASK_MODEL *)&m, &r, &srp, NULL); |
if (p1 == NIL) |
{ cprintf("Can't create J2 task...\n"); return 1; } |
hard_task_def_wcet(m,3000000); |
hard_task_def_mit(m,100000000); |
PC_res_default_model(r,2); |
SRP_res_default_model(srp,1); |
p2 = task_createn("J3", j3, (TASK_MODEL *)&m, &r, &srp, SRP_usemutex(&m0), NULL); |
if (p2 == NIL) |
{ cprintf("Can't create J3 task...\n"); return 1; } |
/* --------------------------------------------------------------------- |
Event post |
--------------------------------------------------------------------- */ |
t.tv_sec = 0; |
t.tv_nsec = 500000000; |
kern_cli(); |
kern_event_post(&t,startJ,(void *)p0); |
t.tv_sec = 1; |
kern_event_post(&t,startJ,(void *)p1); |
kern_sti(); |
task_activate(p2); |
do { |
sys_gettime(&t); |
} while (t.tv_sec < 60); |
exit(0); |
return 0; |
} |
/demos/tags/rel_1_5_beta1/base/aster3.c |
---|
0,0 → 1,300 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Paolo Gai <pj@gandalf.sssup.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/* |
* 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 |
* |
* |
* CVS : $Id: aster3.c,v 1.7 2005-02-25 11:10:46 pj Exp $ |
Test Number 10 (A): |
this is a part of the classic Hartik demo Aster. |
it is based on aster2.c, with the use of TBS to serve a set of aperiodic |
tasks. |
There are APER_MAX tasks sleeping, and when an asteroide task finish |
the current activation, it activate also an aperiodic task chosen |
randomly (if the task chosen is already active, the task_activate do |
nothing!) |
*/ |
#include "kernel/kern.h" |
#include "edf/edf/edf.h" |
int num_aster = 0; |
#define ASTER_LIM 60 |
#define DISPLAY_MAX 15 |
#define ASTER_MAX 70 |
#define STAT_Y 9 |
#define APER_MAX 8 |
/* first numbers runs on a pentium 133, second numbers on a celeron 366 */ |
#define PER_WCET 30000 /* 6200 */ |
#define APER_WCET 50000 /* 18400 */ |
#define CLOCK_WCET 1000 /* 200 */ |
#define ASTER_WCET 1000 /* 200 */ |
#define MIN_PERIOD 200 /* 64, in ms */ |
#define APER_REP 22000 |
PID aper_table[APER_MAX]; |
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--; |
return 0; |
} |
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); |
task_endcycle(); |
puts_xy(i,y,WHITE," "); |
i++; |
} |
} |
} |
TASK aster() |
{ |
PID p; |
HARD_TASK_MODEL m; |
int r; |
int x; // adaptive bandwidth... |
hard_task_default_model(m); |
hard_task_def_wcet(m,PER_WCET); |
hard_task_def_ctrl_jet(m); |
x = MIN_PERIOD; |
srand(7); |
while (1) { |
if (num_aster < ASTER_MAX) { |
r = (rand() % 200); |
hard_task_def_arg(m,(void *)((rand() % 7)+1)); |
hard_task_def_mit(m, (x+r)*1000); |
p = task_create("aaa",asteroide,&m,NULL); |
if (p == -1) |
{ |
if (x < 500 && errno != ENO_AVAIL_TASK) x += 1; |
printf_xy(62,3,WHITE,"adapt=%3u err=%d", |
iq_query_first(&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,"U=%12u",EDF_usedbandwidth(1)); |
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,"U=%12u",EDF_usedbandwidth(1)); |
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) continue; |
for (j=0; j<5; j++) last[j] = 0; |
jet_gettable(p, &last[0], 5); |
kern_cli(); |
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, (int)nact, (int)curr, (int)last[0], (int)last[1], (int)last[2], (int)last[3], (int)last[4]); |
kern_sti(); |
i++; |
} |
task_endcycle(); |
} |
} |
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; |
int i; |
clear(); |
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); |
p1 = task_create("Aster",aster,&m,NULL); |
if (p1 == -1) { |
sys_shutdown_message("test7.c(main): Could not create task <aster> ..."); |
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) { |
sys_shutdown_message("test7.c(main): Could not create task <Clock> ..."); |
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_aperiodic(m_aper); |
soft_task_def_level(m_aper, 3); |
aper_table[0] = task_create("JetControl",jetcontrol,&m_aper,NULL); |
if (aper_table[0] == -1) { |
sys_shutdown_message("test7.c(main): Could not create task <JetControl> ..."); |
exit(1); |
} |
for (i=1; i<APER_MAX; i++) { |
soft_task_def_level(m_aper, i/4 + 3); |
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) { |
sys_shutdown_message("test7.c(main): Could not create task <aper> ..."); |
exit(1); |
} |
} |
group_activate(1); |
{ |
struct timespec t; |
do { |
sys_gettime(&t); |
} while (t.tv_sec < 60); |
} |
exit(0); |
return 0; |
} |
/demos/tags/rel_1_5_beta1/base/isemdemo.c |
---|
0,0 → 1,98 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Paolo Gai <pj@gandalf.sssup.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/** |
------------ |
CVS : $Id: isemdemo.c,v 1.2 2005-02-25 11:10:46 pj Exp $ |
File: $File$ |
Revision: $Revision: 1.2 $ |
Last update: $Date: 2005-02-25 11:10:46 $ |
------------ |
The simplest initialization file |
The tick is set to TICK ms. |
This file contains the 2 functions needed to initialize the system. |
These functions register the following levels: |
a RR (Round Robin) level |
a Dummy level |
It can accept these task models: |
NRT_TASK_MODEL at level 0 |
**/ |
/* |
* 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 "rr/rr/rr.h" |
#include "dummy/dummy/dummy.h" |
#include "sem/sem/sem.h" |
/*+ sysyem tick in us +*/ |
#define TICK 300 |
/*+ RR tick in us +*/ |
#define RRTICK 10000 |
TIME __kernel_register_levels__(void *arg) |
{ |
struct multiboot_info *mb = (struct multiboot_info *)arg; |
RR_register_level(RRTICK, RR_MAIN_YES, mb); |
dummy_register_level(); |
SEM_register_module(); |
return TICK; |
} |
TASK __init__(void *arg) |
{ |
struct multiboot_info *mb = (struct multiboot_info *)arg; |
__call_main__(mb); |
return (void *)0; |
} |
/demos/tags/rel_1_5_beta1/base/aster4.c |
---|
0,0 → 1,400 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Paolo Gai <pj@gandalf.sssup.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/* |
* 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 |
* |
* |
* CVS : $Id: aster4.c,v 1.5 2005-02-25 11:10:46 pj Exp $ |
Test Number 13 (D): |
this is a part of the classic Hartik demo Aster, and it is based on aster 3. |
The demo creates: |
- a set of TBS tasks assigned to 2 TBS servers initialized with different bandwidth. |
- a set of periodic tasks, just to make noise (function asteroide) |
- a set of CBS tasks that are created to fill the available free |
bandwidth (function soft_aster) |
- a few service task (the one that creates the CBS tasks (aster), a clock, |
JET info visualization |
- a set of never ending "system tasks" that simulate a device driver |
task that will end only at shutdown (function aper_asteroid) |
- a keyboard task that will execute an hook to terminate the system |
*/ |
/* |
* 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 "edf/edf/edf.h" |
#include "cbs/cbs/cbs.h" |
#include <drivers/shark_linuxc26.h> |
#include <drivers/shark_input26.h> |
#include <drivers/shark_keyb26.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 |
// These numbers works on a Pentium 133 */ |
#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) { |
cprintf("Ending System Task %d\n",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; |
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); |
/* create a set of periodic tasks, just to make noise */ |
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", |
iq_query_first(&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(1)); |
printf_xy(62,4,WHITE,"Ucbs=%12u",CBS_usedbandwidth(5)); |
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(1)); |
printf_xy(62,4,WHITE,"Ucbs=%12u",CBS_usedbandwidth(5)); |
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 == 5) |
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 endfun(KEY_EVT *k) |
{ |
exit(0); |
} |
void exiting(void *arg) |
{ |
cprintf("System shut down...\n"); |
shutting_down = 1; |
} |
int main(int argc, char **argv) |
{ |
KEY_EVT k; |
PID p1,p2,p3; |
HARD_TASK_MODEL m; |
SOFT_TASK_MODEL m_aper; |
SOFT_TASK_MODEL m_soft; |
int i; |
k.flag = 0; |
k.scan = KEY_ENT; |
k.ascii = 13; |
k.status = KEY_PRESSED; |
keyb_hook(k, endfun, FALSE); |
clear(); |
cprintf("Press ENTER to end the demo..."); |
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); |
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) { |
sys_shutdown_message("aster4.c(main): Could not create task <aster> ..."); |
exit(0); |
} |
hard_task_def_mit(m,500000); |
hard_task_def_wcet(m,CLOCK_WCET); |
p2 = task_create("Clock",clock,&m,NULL); |
if (p2 == -1) { |
sys_shutdown_message("aster4.c(main): Could not create task <Clock> ..."); |
exit(0); |
} |
p3 = task_create("JetControl",jetcontrol,&m_soft,NULL); |
if (p3 == -1) { |
sys_shutdown_message("aster4.c(main): Could not create task <JetControl> ..."); |
exit(0); |
} |
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 + 3); |
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) { |
sys_shutdown_message("aster4.c(main): Could not create task <aper> ..."); |
exit(0); |
} |
} |
group_activate(1); |
return 0; |
} |
/demos/tags/rel_1_5_beta1/base/aster5.c |
---|
0,0 → 1,472 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Paolo Gai <pj@gandalf.sssup.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/* |
* Copyright (C) 2000 Paolo Gai, Gerardo Lamastra and Giuseppe Lipari |
* |
* 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 |
* |
* |
* CVS : $Id: aster5.c,v 1.6 2005-02-25 11:10:46 pj Exp $ |
this is a part of the classic Hartik demo Aster. |
it is based on test 13 (d), and use the CBS to serve the periodic tasks. |
There are not periodic tasks, only CBS tasks. |
The tasks use a PI, NPP or NOP mutex to access the video memory. |
A flag (LONGSC) is provided to try long and short critical sections. |
This demo is really interesting because you can note the behavior of |
the system, and the differences between the various protocols... |
*/ |
#include "kernel/kern.h" |
#include "edf/edf/edf.h" |
#include "cbs/cbs/cbs.h" |
#include <drivers/shark_keyb26.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 6200 |
#define APER_WCET 18400 |
#define JET_WCET 10000 |
#define JET_PERIOD 100000 |
#define APER_REP 22000 |
//PID aper_table[APER_MAX]; |
mutex_t m1; |
#define PIMUTEX |
//#define NPPMUTEX |
//#define NOPMUTEX |
#define LONGSC |
#ifdef LONGSC |
#define SOFT_MET 3000 /* 3000 12000 */ |
#define CLOCK_WCET 400 /* 200 300*/ |
#define ASTER_WCET 400 /* 200 300*/ |
#else |
#define SOFT_MET 80000 /* 4500 */ |
#define CLOCK_WCET 2000 /* 200*/ |
#define ASTER_WCET 2000 /* 200*/ |
#endif |
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; |
#ifdef LONGSC |
mutex_lock(&m1); |
#endif |
for (j=0; j<load1; j++) { |
s[0] = '*' + rand() % 100; |
#ifndef LONGSC |
mutex_lock(&m1); |
#endif |
puts_xy(i,y,rand()%15+1,s); |
#ifndef LONGSC |
mutex_unlock(&m1); |
#endif |
} |
#ifdef LONGSC |
mutex_unlock(&m1); |
#endif |
// task_activate(aper_table[rand()%APER_MAX]); |
task_endcycle(); |
mutex_lock(&m1); |
puts_xy(i,y,WHITE," "); |
mutex_unlock(&m1); |
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; |
#ifdef LONGSC |
mutex_lock(&m1); |
#endif |
for (j=0; j<load1; j++) { |
s[0] = '*' + rand() % 100; |
#ifndef LONGSC |
mutex_lock(&m1); |
#endif |
puts_xy(i,y,rand()%15+1,s); |
#ifndef LONGSC |
mutex_unlock(&m1); |
#endif |
} |
s[0] = c; |
#ifndef LONGSC |
mutex_lock(&m1); |
#endif |
puts_xy(i,y,rand()%15+1,s); |
mutex_unlock(&m1); |
task_endcycle(); |
mutex_lock(&m1); |
puts_xy(i,y,WHITE," "); |
mutex_unlock(&m1); |
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; |
#ifdef LONGSC |
mutex_lock(&m1); |
#endif |
for (j=0; j<load1; j++) { |
s[0] = '*' + rand() % 100; |
#ifndef LONGSC |
mutex_lock(&m1); |
#endif |
puts_xy(i,y,rand()%15+1,s); |
#ifndef LONGSC |
mutex_unlock(&m1); |
#endif |
} |
s[0] = 1; |
#ifndef LONGSC |
mutex_lock(&m1); |
#endif |
puts_xy(i,y,rand()%15+1,s); |
mutex_unlock(&m1); |
// task_activate(aper_table[rand()%APER_MAX]); |
task_endcycle(); |
mutex_lock(&m1); |
puts_xy(i,y,WHITE," "); |
mutex_unlock(&m1); |
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); |
/* periodic_task_default_model(m,0,PER_WCET); |
periodic_task_def_ctrl_jet(m); |
for (x=0; x<PER_MAX; x++) { |
r = (rand() % 200); |
periodic_task_def_period(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 = 128; //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; |
mutex_lock(&m1); |
printf_xy(62,3,WHITE,"adapt=%3u err=%d", |
iq_query_first(&freedesc),errno); |
mutex_unlock(&m1); |
} |
else { |
num_aster++; |
mutex_lock(&m1); |
printf_xy(62,3,WHITE,"adapt=%3u ",x);//,errno); |
mutex_unlock(&m1); |
task_activate(p); |
x /= 2; |
if (x<50) x = 50; |
} |
} |
task_endcycle(); |
} |
} |
TASK clock() |
{ |
int s = 0, m = 0; |
while(1) { |
mutex_lock(&m1); |
printf_xy(62,1,WHITE,"%2d:%2d ast=%d",m,s, num_aster); |
printf_xy(62,2,WHITE,"Uedf=%12u",EDF_usedbandwidth(1)); |
printf_xy(62,4,WHITE,"Ucbs=%12u",CBS_usedbandwidth(2)); |
mutex_unlock(&m1); |
task_endcycle(); |
if (++s > 59) { |
s = 0; |
m++; |
} |
mutex_lock(&m1); |
printf_xy(62,1,WHITE,"%2d:%2d ast=%d",m,s, num_aster); |
printf_xy(62,2,WHITE,"Uedf=%12u",EDF_usedbandwidth(1)); |
printf_xy(62,4,WHITE,"Ucbs=%12u",CBS_usedbandwidth(2)); |
mutex_unlock(&m1); |
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; |
mutex_lock(&m1); |
printf_xy(0,STAT_Y,WHITE,"PID ³ Mean T.³ Max T. ³ N.A. ³ Curr. ³ Last1 ³ Last2 ³ Last3 ³ Last4 ³ Last5"); |
mutex_unlock(&m1); |
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) == APERIODIC_PCLASS || |
(proc_table[p].pclass & 0xFF00) == PERIODIC_PCLASS*/ ) continue; |
for (j=0; j<5; j++) last[j] = 0; |
jet_gettable(p, &last[0], 5); |
mutex_lock(&m1); |
if (proc_table[p].task_level == 2) |
printf_xy(0,STAT_Y+i+1,WHITE,"%-3d ³ %-6d ³ %-6d ³ %-4d ³p%-7d ³ %-5d ³ %-5d ³ %-5d ³ %-5d ³ %-5d", |
p, (int)sum/(nact==0 ? 1 : nact), (int)max, nact, (int)CBS_get_nact(2,p), (int)last[0], (int)last[1], (int)last[2], (int)last[3], (int)last[4]); |
// p, sum/(nact==0 ? 1 : nact), max, proc_table[p].avail_time, proc_table[p].status, proc_table[p].shadow, proc_table[p].timespec_priority.tv_sec,proc_table[p].timespec_priority.tv_nsec/1000 , CBS_get_nact(2,p), 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]); |
// p, (int)sum/(nact==0 ? 1 : nact), (int)max, nact, (int)proc_table[p].status, (int)proc_table[p].shadow, (int)proc_table[p].timespec_priority.tv_sec,(int)proc_table[p].timespec_priority.tv_nsec/1000 , (int)last[3], (int)last[4]); |
mutex_unlock(&m1); |
i++; |
} |
} |
} |
void fine(KEY_EVT *e) |
{ |
exit(0);} |
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; |
#ifdef PIMUTEX |
PI_mutexattr_t a; |
#endif |
#ifdef NPPMUTEX |
NPP_mutexattr_t a; |
#endif |
#ifdef NOPMUTEX |
NOP_mutexattr_t a; |
#endif |
KEY_EVT emerg; |
emerg.ascii = 'x'; |
emerg.scan = KEY_X; |
emerg.flag = ALTL_BIT; |
emerg.status = KEY_PRESSED; |
keyb_hook(emerg,fine,FALSE); |
clear(); |
hard_task_default_model(m); |
hard_task_def_wcet(m,ASTER_WCET); |
hard_task_def_mit(m,100000); |
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_aper); |
soft_task_def_group(m_aper,1); |
soft_task_def_ctrl_jet(m_aper); |
soft_task_def_aperiodic(m_aper); |
soft_task_default_model(m_soft); |
soft_task_def_period(m_soft,JET_PERIOD); |
soft_task_def_met(m_soft,JET_WCET); |
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) { |
sys_shutdown_message("test7.c(main): Could not create task <aster> ..."); |
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) { |
sys_shutdown_message("test7.c(main): Could not create task <Clock> ..."); |
exit(1); |
} |
// p3 = task_create("JetControl",jetcontrol,&m_nrt,NULL); |
p3 = task_create("JetControl",jetcontrol,&m_soft,NULL); |
if (p2 == -1) { |
sys_shutdown_message("test7.c(main): Could not create task <JetControl> ..."); |
exit(1); |
} |
/* |
aperiodic_task_default_model(m_aper,APER_WCET); |
aperiodic_task_def_ctrl_jet(m_aper); |
aperiodic_task_def_system(m_aper); |
for (i=0; i<APER_MAX; i++) { |
aperiodic_task_def_level(m_aper, i/4 + 2); |
aperiodic_task_def_arg(m_aper, (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> ..."); |
exit(1); |
} |
} |
*/ |
task_nopreempt(); |
#ifdef PIMUTEX |
PI_mutexattr_default(a); |
#endif |
#ifdef NPPMUTEX |
NPP_mutexattr_default(a); |
#endif |
#ifdef NOPMUTEX |
NOP_mutexattr_default(a); |
#endif |
mutex_init(&m1, &a); |
fineprg.tv_sec = 1800; |
fineprg.tv_nsec = 0; |
group_activate(1); |
return 0; |
} |
/demos/tags/rel_1_5_beta1/base/aster6.c |
---|
0,0 → 1,444 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Paolo Gai <pj@gandalf.sssup.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/* |
* Copyright (C) 2000 Paolo Gai, Gerardo Lamastra and Giuseppe Lipari |
* |
* 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 |
* |
* |
* CVS : $Id: aster6.c,v 1.7 2005-02-25 11:10:46 pj Exp $ |
this is a part of the classic Hartik demo Aster. |
it is based on test 17 (h), and the JobControl Task uses an |
SOFT_TASK_MODEL served by a polling server |
*/ |
#include "kernel/kern.h" |
#include "edf/edf/edf.h" |
#include "cbs/cbs/cbs.h" |
#include <drivers/shark_keyb26.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 6200 |
#define APER_WCET 18400 |
#define JET_WCET 10000 |
#define APER_REP 22000 |
PID aper_table[APER_MAX]; |
mutex_t m1; |
#define PIMUTEX |
//#define NPPMUTEX |
//#define NOPMUTEX |
//#define LONGSC |
#ifdef LONGSC |
#define SOFT_MET 3000 /* 12000 */ |
#define CLOCK_WCET 200 /* 300*/ |
#define ASTER_WCET 200 /* 300*/ |
#else |
#define SOFT_MET 80000 /* 4500 */ |
#define CLOCK_WCET 2000 /* 200*/ |
#define ASTER_WCET 2000 /* 200*/ |
#endif |
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; |
#ifdef LONGSC |
mutex_lock(&m1); |
#endif |
for (j=0; j<load1; j++) { |
s[0] = '*' + rand() % 100; |
#ifndef LONGSC |
mutex_lock(&m1); |
#endif |
puts_xy(i,y,rand()%15+1,s); |
#ifndef LONGSC |
mutex_unlock(&m1); |
#endif |
} |
#ifdef LONGSC |
mutex_unlock(&m1); |
#endif |
task_activate(aper_table[rand()%APER_MAX]); |
task_endcycle(); |
mutex_lock(&m1); |
puts_xy(i,y,WHITE," "); |
mutex_unlock(&m1); |
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; |
#ifdef LONGSC |
mutex_lock(&m1); |
#endif |
for (j=0; j<load1; j++) { |
s[0] = '*' + rand() % 100; |
#ifndef LONGSC |
mutex_lock(&m1); |
#endif |
puts_xy(i,y,rand()%15+1,s); |
#ifndef LONGSC |
mutex_unlock(&m1); |
#endif |
} |
s[0] = c; |
#ifndef LONGSC |
mutex_lock(&m1); |
#endif |
puts_xy(i,y,rand()%15+1,s); |
mutex_unlock(&m1); |
task_endcycle(); |
mutex_lock(&m1); |
puts_xy(i,y,WHITE," "); |
mutex_unlock(&m1); |
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; |
#ifdef LONGSC |
mutex_lock(&m1); |
#endif |
for (j=0; j<load1; j++) { |
s[0] = '*' + rand() % 100; |
#ifndef LONGSC |
mutex_lock(&m1); |
#endif |
puts_xy(i,y,rand()%15+1,s); |
#ifndef LONGSC |
mutex_unlock(&m1); |
#endif |
} |
s[0] = 1; |
#ifndef LONGSC |
mutex_lock(&m1); |
#endif |
puts_xy(i,y,rand()%15+1,s); |
mutex_unlock(&m1); |
task_activate(aper_table[rand()%APER_MAX]); |
task_endcycle(); |
mutex_lock(&m1); |
puts_xy(i,y,WHITE," "); |
mutex_unlock(&m1); |
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); |
soft_task_default_model(m_soft); |
soft_task_def_met(m_soft,SOFT_MET); |
soft_task_def_ctrl_jet(m_soft); |
x = 128; //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; |
mutex_lock(&m1); |
printf_xy(62,3,WHITE,"adapt=%3u err=%d", |
iq_query_first(&freedesc),errno); |
mutex_unlock(&m1); |
} |
else { |
num_aster++; |
mutex_lock(&m1); |
printf_xy(62,3,WHITE,"adapt=%3u ",x);//,errno); |
mutex_unlock(&m1); |
task_activate(p); |
x /= 2; |
if (x<50) x = 50; |
} |
} |
task_endcycle(); |
} |
} |
TASK clock() |
{ |
int s = 0, m = 0; |
while(1) { |
mutex_lock(&m1); |
printf_xy(62,1,WHITE,"%2d:%2d ast=%d",m,s, num_aster); |
printf_xy(62,2,WHITE,"Uedf=%12u",EDF_usedbandwidth(1)); |
printf_xy(62,4,WHITE,"Ucbs=%12u",CBS_usedbandwidth(3)); |
mutex_unlock(&m1); |
task_endcycle(); |
if (++s > 59) { |
s = 0; |
m++; |
} |
mutex_lock(&m1); |
printf_xy(62,1,WHITE,"%2d:%2d ast=%d",m,s, num_aster); |
printf_xy(62,2,WHITE,"Uedf=%12u",EDF_usedbandwidth(1)); |
printf_xy(62,4,WHITE,"Ucbs=%12u",CBS_usedbandwidth(3)); |
mutex_unlock(&m1); |
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; |
mutex_lock(&m1); |
printf_xy(0,STAT_Y,WHITE,"PID ³ Mean T.³ Max T. ³ N.A. ³ Curr. ³ Last1 ³ Last2 ³ Last3 ³ Last4 ³ Last5"); |
mutex_unlock(&m1); |
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) == APERIODIC_PCLASS || |
(proc_table[p].pclass & 0xFF00) == PERIODIC_PCLASS*/ ) continue; |
for (j=0; j<5; j++) last[j] = 0; |
jet_gettable(p, &last[0], 5); |
mutex_lock(&m1); |
if (proc_table[p].task_level == 3) |
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(2,p), (int)last[0], (int)last[1], (int)last[2], (int)last[3], (int)last[4]); |
// p, sum/(nact==0 ? 1 : nact), max, proc_table[p].avail_time, proc_table[p].status, proc_table[p].shadow, proc_table[p].timespec_priority.tv_sec,proc_table[p].timespec_priority.tv_nsec/1000 , CBS_get_nact(2,p), 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, (int)nact, (int)curr, (int)last[0], (int)last[1], (int)last[2], (int)last[3], (int)last[4]); |
// p, sum/(nact==0 ? 1 : nact), max, nact, proc_table[p].status, proc_table[p].shadow, proc_table[p].timespec_priority.tv_sec,proc_table[p].timespec_priority.tv_nsec/1000 , last[3], last[4]); |
mutex_unlock(&m1); |
i++; |
} |
} |
} |
void fine(KEY_EVT *e) |
{ |
exit(0); |
} |
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; |
#ifdef PIMUTEX |
PI_mutexattr_t a; |
#endif |
#ifdef NPPMUTEX |
NPP_mutexattr_t a; |
#endif |
#ifdef NOPMUTEX |
NOP_mutexattr_t a; |
#endif |
KEY_EVT emerg; |
emerg.ascii = 'x'; |
emerg.scan = KEY_X; |
emerg.flag = ALTL_BIT; |
emerg.status = KEY_PRESSED; |
keyb_hook(emerg,fine,FALSE); |
clear(); |
hard_task_default_model(m); |
hard_task_def_mit(m,100000); |
hard_task_def_wcet(m,ASTER_WCET); |
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_aper); |
soft_task_def_group(m_aper,1); |
soft_task_def_ctrl_jet(m_aper); |
soft_task_def_aperiodic(m_aper); |
soft_task_default_model(m_soft); |
soft_task_def_period(m_soft,100000); |
soft_task_def_met(m_soft,JET_WCET); |
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) { |
sys_shutdown_message("test7.c(main): Could not create task <aster> ..."); |
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) { |
sys_shutdown_message("test7.c(main): Could not create task <Clock> ..."); |
exit(1); |
} |
// p3 = task_create("JetControl",jetcontrol,&m_nrt,NULL); |
p3 = task_create("JetControl",jetcontrol,&m_aper,NULL); |
if (p3 == -1) { |
sys_shutdown_message("test7.c(main): Could not create task <JetControl> ..."); |
exit(1); |
} |
task_nopreempt(); |
#ifdef PIMUTEX |
PI_mutexattr_default(a); |
#endif |
#ifdef NPPMUTEX |
NPP_mutexattr_default(a); |
#endif |
#ifdef NOPMUTEX |
NOP_mutexattr_default(a); |
#endif |
mutex_init(&m1, &a); |
fineprg.tv_sec = 20; |
fineprg.tv_nsec = 0; |
kern_event_post(&fineprg,(void (*)(void *))fine,NULL); |
group_activate(1); |
return 0; |
} |
/demos/tags/rel_1_5_beta1/base/aster7.c |
---|
0,0 → 1,311 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Paolo Gai <pj@gandalf.sssup.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/* |
* Copyright (C) 2000 Giorgio Buttazzo, Paolo Gai, Massimiliano Giorgi |
* |
* 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 |
* |
* |
* CVS : $Id: aster7.c,v 1.6 2005-02-25 11:10:46 pj Exp $ |
this is a part of the classic Hartik demo Aster. |
it is based on test 10(A), and test the PS with RM. |
The JetControl is served by a dedicated Polling Server, too. |
There are APER_MAX tasks sleeping, and when an asteroide task finish |
the current activation, it activate also an aperiodic task chosen |
randomly (if the task chosen is already active, the task_activate do |
nothing!) |
*/ |
#include "kernel/kern.h" |
#include "edf/edf/edf.h" |
#include <drivers/shark_linuxc26.h> |
#include <drivers/shark_input26.h> |
#include <drivers/shark_keyb26.h> |
int num_aster = 0; |
#define ASTER_LIM 60 |
#define DISPLAY_MAX 15 |
#define ASTER_MAX 70 |
#define STAT_Y 9 |
#define APER_MAX 8 |
/* Pentium 133 / Celeron 366 */ |
#define PER_WCET 25000 /* 7800 */ |
#define APER_WCET 5500 /* 1400 */ |
#define CLOCK_WCET 500 /* 200 */ |
#define ASTER_WCET 500 /* 200 */ |
#define APER_REP 2200 |
PID aper_table[APER_MAX]; |
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--; |
return 0; |
} |
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); |
task_endcycle(); |
puts_xy(i,y,WHITE," "); |
i++; |
} |
} |
} |
TASK aster() |
{ |
PID p; |
HARD_TASK_MODEL m; |
int r; |
int x; // adaptive bandwidth... |
hard_task_default_model(m); |
hard_task_def_wcet(m,PER_WCET); |
hard_task_def_ctrl_jet(m); |
x = 200; |
srand(7); |
while (1) { |
if (num_aster < ASTER_MAX) { |
r = (rand() % 200); |
hard_task_def_arg(m,(void *)((rand() % 7)+1)); |
hard_task_def_mit(m, (x+r)*1000); |
p = task_create("aaa",asteroide,&m,NULL); |
if (p == -1) |
{ |
if (x < 500 && errno != ENO_AVAIL_TASK) x += 1; |
printf_xy(62,3,WHITE,"adapt=%3u err=%d", |
iq_query_first(&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,"U=%12u",EDF_usedbandwidth(1)); |
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,"U=%12u",EDF_usedbandwidth(1)); |
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) continue; |
for (j=0; j<5; j++) last[j] = 0; |
jet_gettable(p, &last[0], 5); |
kern_cli(); |
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(KEY_EVT *e) |
{ |
exit(0); |
} |
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; |
int i; |
KEY_EVT emerg; |
clear(); |
cprintf("Press Alt-x to end the demo..."); |
//keyb_set_map(itaMap); |
emerg.ascii = 'x'; |
emerg.scan = KEY_X; |
emerg.flag = ALTL_BIT; |
emerg.status = KEY_PRESSED; |
keyb_hook(emerg,fine,FALSE); |
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); |
p1 = task_create("Aster",aster,&m,NULL); |
if (p1 == -1) { |
sys_shutdown_message("test7.c(main): Could not create task <aster> ..."); |
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) { |
sys_shutdown_message("test7.c(main): Could not create task <Clock> ..."); |
exit(1); |
} |
soft_task_default_model(m_aper); |
soft_task_def_ctrl_jet(m_aper); |
soft_task_def_level(m_aper, 2); |
soft_task_def_group(m_aper,1); |
soft_task_def_aperiodic(m_aper); |
p3 = task_create("JetControl",jetcontrol,&m_aper,NULL); |
if (p3 == -1) { |
sys_shutdown_message("test7.c(main): Could not create task <JetControl> ..."); |
exit(1); |
} |
soft_task_def_wcet(m_aper,APER_WCET); |
soft_task_def_ctrl_jet(m_aper); |
soft_task_def_aperiodic(m_aper); |
for (i=0; i<APER_MAX; i++) { |
soft_task_def_level(m_aper, i/4 + 4); |
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) { |
sys_shutdown_message("test7.c(main): Could not create task <aper> ..."); |
exit(1); |
} |
} |
group_activate(1); |
return 0; |
} |
/demos/tags/rel_1_5_beta1/base/aster8.c |
---|
0,0 → 1,501 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Paolo Gai <pj@gandalf.sssup.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/* |
* Copyright (C) 2000 Giorgio Buttazzo, Paolo Gai, Massimiliano Giorgi |
* |
* 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 |
* |
* |
* CVS : $Id: aster8.c,v 1.6 2005-02-25 11:10:46 pj Exp $ |
Test for Sporadic Server (ss): |
this is a part of the classic Hartik demo Aster. |
it is based on test 17 (h), and the JobControl Task uses an |
SOFT_TASK_MODEL served by a sporadic server |
There are two "dummy" tasks that increment a counter and print |
the value. One uses a SOFT_TASK_MODEL served by sporadic server, |
the other uses a NRT_TASK_MODEL handled by RR module. |
*/ |
#include "kernel/kern.h" |
#include "edf/edf/edf.h" |
#include "cbs/cbs/cbs.h" |
#include "ss/ss/ss.h" |
#include <drivers/shark_keyb26.h> |
int num_aster = 0; |
#define EDF_LEV 1 |
#define CBS_LEV 2 |
#define SS_LEV 3 |
#define ASTER_LIM 60 |
#define DISPLAY_MAX 8 |
#define ASTER_MAX 70 |
#define STAT_Y 9 |
#define PER_MAX 5 |
#define APER_MAX 8 |
#define PER_WCET 16000 |
#define APER_WCET 22000 |
#define JET_WCET 20000 |
#define APER_REP 22000 |
PID aper_table[APER_MAX]; |
mutex_t m1; |
#define PIMUTEX |
//#define PCMUTEX |
//#define NPPMUTEX |
//#define NOPMUTEX |
#define LONGSC |
#ifdef LONGSC |
#define SOFT_MET 12000 /* 12000 */ |
#define CLOCK_WCET 300 /* 300*/ |
#define ASTER_WCET 300 /* 300*/ |
#else |
#define SOFT_MET 5000 /* 4500 */ |
#define CLOCK_WCET 2000 /* 200*/ |
#define ASTER_WCET 2000 /* 200*/ |
#endif |
PID p1,p2,p3,p4,p5; |
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; |
#ifdef LONGSC |
mutex_lock(&m1); |
#endif |
for (j=0; j<load1; j++) { |
s[0] = '*' + rand() % 100; |
#ifndef LONGSC |
mutex_lock(&m1); |
#endif |
puts_xy(i,y,rand()%15+1,s); |
#ifndef LONGSC |
mutex_unlock(&m1); |
#endif |
} |
#ifdef LONGSC |
mutex_unlock(&m1); |
#endif |
task_activate(aper_table[rand()%APER_MAX]); |
task_endcycle(); |
mutex_lock(&m1); |
puts_xy(i,y,WHITE," "); |
mutex_unlock(&m1); |
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; |
#ifdef LONGSC |
mutex_lock(&m1); |
#endif |
for (j=0; j<load1; j++) { |
s[0] = '*' + rand() % 100; |
#ifndef LONGSC |
mutex_lock(&m1); |
#endif |
puts_xy(i,y,rand()%15+1,s); |
#ifndef LONGSC |
mutex_unlock(&m1); |
#endif |
} |
s[0] = c; |
#ifndef LONGSC |
mutex_unlock(&m1); |
#endif |
mutex_lock(&m1); |
puts_xy(i,y,rand()%15+1,s); |
mutex_unlock(&m1); |
task_endcycle(); |
mutex_lock(&m1); |
puts_xy(i,y,WHITE," "); |
mutex_unlock(&m1); |
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; |
#ifdef LONGSC |
mutex_lock(&m1); |
#endif |
for (j=0; j<load1; j++) { |
s[0] = '*' + rand() % 100; |
#ifndef LONGSC |
mutex_lock(&m1); |
#endif |
puts_xy(i,y,rand()%15+1,s); |
#ifndef LONGSC |
mutex_unlock(&m1); |
#endif |
} |
s[0] = 1; |
#ifndef LONGSC |
mutex_lock(&m1); |
#endif |
//mutex_lock(&m1); |
puts_xy(i,y,rand()%15+1,s); |
mutex_unlock(&m1); |
task_activate(aper_table[rand()%APER_MAX]); |
task_endcycle(); |
mutex_lock(&m1); |
puts_xy(i,y,WHITE," "); |
mutex_unlock(&m1); |
i++; |
} |
} |
num_aster--; |
return 0; |
} |
TASK aster() |
{ |
PID p; |
SOFT_TASK_MODEL m_soft; |
int r; |
int x; // adaptive bandwidth... |
srand(7); |
soft_task_default_model(m_soft); |
soft_task_def_met(m_soft,SOFT_MET); |
soft_task_def_ctrl_jet(m_soft); |
x = 128; //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; |
mutex_lock(&m1); |
printf_xy(62,3,WHITE,"adapt=%3u err=%d", |
iq_query_first(&freedesc), errno); |
mutex_unlock(&m1); |
} |
else { |
num_aster++; |
mutex_lock(&m1); |
printf_xy(62,3,WHITE,"adapt=%3u ",x); |
mutex_unlock(&m1); |
task_activate(p); |
x /= 2; |
if (x<50) x = 50; |
} |
} |
task_endcycle(); |
} |
} |
TASK clock() |
{ |
int s = 0, m = 0; |
while(1) { |
mutex_lock(&m1); |
printf_xy(62,1,WHITE,"%2d:%2d ast=%d",m,s, num_aster); |
printf_xy(62,2,WHITE,"Uedf=%12u",EDF_usedbandwidth(EDF_LEV)); |
printf_xy(62,4,WHITE,"Ucbs=%12u",CBS_usedbandwidth(CBS_LEV)); |
printf_xy(62,5,WHITE,"CSss=%6d",SS_availCs(SS_LEV)); |
mutex_unlock(&m1); |
task_endcycle(); |
if (++s > 59) { |
s = 0; |
m++; |
} |
mutex_lock(&m1); |
printf_xy(62,1,WHITE,"%2d:%2d ast=%d",m,s, num_aster); |
printf_xy(62,2,WHITE,"Uedf=%12u",EDF_usedbandwidth(EDF_LEV)); |
printf_xy(62,4,WHITE,"Ucbs=%12u",CBS_usedbandwidth(CBS_LEV)); |
printf_xy(62,5,WHITE,"CSss=%6d",SS_availCs(SS_LEV)); |
mutex_unlock(&m1); |
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; |
mutex_lock(&m1); |
printf_xy(0,STAT_Y,WHITE,"PID ³ Mean T.³ Max T. ³ N.A. ³ Curr. ³ Last1 ³ Last2 ³ Last3 ³ Last4 ³ Last5"); |
mutex_unlock(&m1); |
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) == APERIODIC_PCLASS || |
(proc_table[p].pclass & 0xFF00) == PERIODIC_PCLASS*/ ) continue; |
for (j=0; j<5; j++) last[j] = 0; |
jet_gettable(p, &last[0], 5); |
mutex_lock(&m1); |
if (proc_table[p].task_level == 2) |
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(2,p), (int)last[0], (int)last[1], (int)last[2], (int)last[3], (int)last[4]); |
// p, sum/(nact==0 ? 1 : nact), max, proc_table[p].avail_time, proc_table[p].status, proc_table[p].shadow, proc_table[p].timespec_priority.tv_sec,proc_table[p].timespec_priority.tv_nsec/1000 , CBS_get_nact(2,p), 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, (int)nact, (int)curr, (int)last[0], (int)last[1], (int)last[2], (int)last[3], (int)last[4]); |
// p, sum/(nact==0 ? 1 : nact), max, nact, proc_table[p].status, proc_table[p].shadow, proc_table[p].timespec_priority.tv_sec,proc_table[p].timespec_priority.tv_nsec/1000 , last[3], last[4]); |
mutex_unlock(&m1); |
i++; |
task_activate(p3); |
task_endcycle(); |
} |
} |
} |
void fine(KEY_EVT *e) |
{ |
exit(0); |
} |
void mydummyaper(void) { |
int i=0; |
while(1) { |
mutex_lock(&m1); |
printf_xy(1,24,RED,"dummyAPER pid=%d: %d",p4,i++); |
mutex_unlock(&m1); |
task_activate(p4); |
task_endcycle(); |
} |
} |
void mydummynrt(void) { |
int i=0; |
while(1) { |
mutex_lock(&m1); |
printf_xy(40,24,RED,"dummyNRT pid=%d: %d",p5,i++); |
mutex_unlock(&m1); |
} |
} |
int main(int argc, char **argv) |
{ |
// PID p1,p2,p5; |
HARD_TASK_MODEL m; |
NRT_TASK_MODEL m_nrt; |
SOFT_TASK_MODEL m_aper; |
SOFT_TASK_MODEL m_soft; |
#ifdef PIMUTEX |
PI_mutexattr_t a; |
#endif |
#ifdef PCMUTEX |
PC_mutexattr_t a; |
#endif |
#ifdef NPPMUTEX |
NPP_mutexattr_t a; |
#endif |
#ifdef NOPMUTEX |
NOP_mutexattr_t a; |
#endif |
KEY_EVT emerg; |
emerg.ascii = 'x'; |
emerg.scan = KEY_X; |
emerg.flag = ALTL_BIT; |
emerg.status = KEY_PRESSED; |
keyb_hook(emerg,fine,FALSE); |
clear(); |
cprintf("Press Alt-x to end the demo..."); |
hard_task_default_model(m); |
hard_task_def_mit(m,100000); |
hard_task_def_wcet(m,ASTER_WCET); |
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_aper); |
soft_task_def_group(m_aper,1); |
soft_task_def_ctrl_jet(m_aper); |
soft_task_def_aperiodic(m_aper); |
soft_task_default_model(m_soft); |
soft_task_def_period(m_soft,10000); |
soft_task_def_met(m_soft,JET_WCET); |
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) { |
sys_shutdown_message("test7.c(main): Could not create task <aster> ..."); |
exit(1); |
return 0; |
} |
hard_task_def_mit(m,50000); |
hard_task_def_wcet(m,CLOCK_WCET); |
p2 = task_create("Clock",clock,&m,NULL); |
if (p2 == -1) { |
sys_shutdown_message("test7.c(main): Could not create task <Clock> ..."); |
exit(1); |
return 0; |
} |
p3 = task_create("JetControl",jetcontrol,&m_aper,NULL); |
if (p3 == -1) { |
sys_shutdown_message("test7.c(main): Could not create task <JetControl> ..."); |
exit(1); |
return 0; |
} |
p4 = task_create("MyDummyAper",(void *(*)(void*))mydummyaper,&m_aper,NULL); |
if (p4 == -1) { |
sys_shutdown_message("Could not create task <MyDummyAper> ..."); |
exit(1); |
return 0; |
} |
p5 = task_create("MyDummyNRT",(void *(*)(void*))mydummynrt,&m_nrt,NULL); |
if (p5 == -1) { |
sys_shutdown_message("Could not create task <MyDummyNRT> ..."); |
exit(1); |
return 0; |
} |
#ifdef PIMUTEX |
PI_mutexattr_default(a); |
#endif |
#ifdef PCMUTEX |
PC_mutexattr_default(a); |
#endif |
#ifdef NPPMUTEX |
NPP_mutexattr_default(a); |
#endif |
#ifdef NOPMUTEX |
NOP_mutexattr_default(a); |
#endif |
mutex_init(&m1, &a); |
group_activate(1); |
return 0; |
} |
/demos/tags/rel_1_5_beta1/base/cabs.c |
---|
0,0 → 1,290 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Paolo Gai <pj@gandalf.sssup.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/* |
* Copyright (C) 2000 Giorgio Buttazzo, 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 |
* |
* |
* CVS : $Id: cabs.c,v 1.9 2005-02-25 11:10:46 pj Exp $ |
*/ |
/*--------------------------------------------------------------*/ |
/* TEST ON CABS */ |
/*--------------------------------------------------------------*/ |
#include <kernel/kern.h> |
#include <cabs/cabs/cabs.h> |
#include <string.h> |
#include <drivers/shark_fb26.h> |
#include <drivers/shark_keyb26.h> |
#define NCAB 4 /* max number of CABs */ |
#define NCAR 26 /* generated characters */ |
#define YP 32 /* level of arrows */ |
#define R 20 /* task radius */ |
#define YY (YP+R+32) /* level of writing */ |
#define DELTA (2*R+72) /* total channel hight */ |
#define X1 120 /* start column for P1 */ |
#define X2 360 /* start column for P2 */ |
#define XP1 (X1+64) /* X position of task 1 */ |
#define XP2 (X2+64) /* X position of task 2 */ |
#define XC (XP1+96) /* X position of CAB */ |
#define L 52 /* CAB rectangle length */ |
void my_exit(KEY_EVT *k); |
void draw_channel(int i); |
void create_channel(int i); |
void get_data(); |
TASK producer(void *arg); |
TASK consumer(void *arg); |
char *cname[NCAB] = {"cab1", "cab2", "cab3", "cab4"}; |
char *pname1[NCAB] = {"wr1", "wr2", "wr3", "wr4"}; |
char *pname2[NCAB] = {"rd1", "rd2", "rd3", "rd4"}; |
CAB cid[NCAB]; /* CAB identifiers */ |
PID p1[NCAB], p2[NCAB]; /* task identifiers */ |
/* Task Periods */ |
TIME t1[NCAB] = {200000, 100000, 300000, 800000}; |
TIME t2[NCAB] = {400000, 400000, 150000, 200000}; |
/* Task WCETS */ |
TIME w1[NCAB] = {10000, 10000, 10000, 10000}; |
TIME w2[NCAB] = {10000, 10000, 10000, 10000}; |
/****************************************************************/ |
/* This function is called when Alt-X is pressed. |
*/ |
void my_end(KEY_EVT* e) |
{ |
exit(0); |
} |
/******************************************************************/ |
/* This function is called when the system exit correctly after Alt-X. |
It exits from the graphic mode and then it prints a small greeting. |
Note that: |
- The function calls grx_exit, so it must be registered using |
RUNLEVEL_BEFORE_EXIT (RUNLEVEL_AFTER_EXIT does not work because |
at that point the kernel is already returned in real mode!!!) |
- When an exception is raised, the exception handler is called. |
Since the exception handler already exits from the graphic mode, |
this funcion has not to be called. For this reason: |
. we registered byebye using the flag NO_AT_ABORT |
. the exception handler exits using exit; in that way byebye is |
NOT called |
*/ |
/*--------------------------------------------------------------*/ |
/* Main task */ |
/*--------------------------------------------------------------*/ |
/****************************** MAIN ******************************/ |
int main(int argc, char **argv) |
{ |
char c = 0; /* character from keyboard */ |
grx_clear(BLACK); |
grx_text("Press a key [1-4]", 10, 16, rgb16(255,255,255), 0); |
grx_text("to create a pair", 10, 24, rgb16(255,255,255), 0); |
grx_text("ESC to exit demo", 10, 48, rgb16(255,255,255), 0); |
while (c != 27) { |
c = keyb_getch(BLOCK); |
if ((c >= '1') && (c <= '1'+NCAB-1)) |
create_channel(c-'1'); |
} |
exit(0); |
return 0; |
} |
/*--------------------------------------------------------------*/ |
/* write data in a cab */ |
/*--------------------------------------------------------------*/ |
TASK producer(void *arg) |
{ |
int i = (int)arg; |
char c; /* message character */ |
char *p; /* pointer to a cab buffer */ |
char s[2]; /* string to display */ |
int k = 0; |
int x, y; |
int col = rgb16(0,0,255); |
int ybase = YY + i*DELTA; |
x = X1; |
y = ybase; |
s[1] = 0; |
k = 0; |
while (1) { |
c = 'A' + k; |
p = cab_reserve(cid[i]); |
*p = c; |
cab_putmes(cid[i], p); |
s[0] = c; |
k = (k + 1) % NCAR; |
grx_text(s,x,y,col,0); |
x += 8; |
if (x >= (X1 + NCAR*8)) { |
x = X1; |
y = y + 8; |
if (y >= ybase+16) { |
y = ybase; |
} |
} |
task_endcycle(); |
} |
} |
/*--------------------------------------------------------------*/ |
/* read data from a cab */ |
/*--------------------------------------------------------------*/ |
TASK consumer(void *arg) |
{ |
int i = (int)arg; |
char *p; |
char s[2]; |
int x, y; |
int col = 13; |
int ybase = YY + i*DELTA; |
x = X2; |
y = ybase; |
s[1] = 0; |
while (1) { |
p = cab_getmes(cid[i]); |
s[0] = *p - 'A' + 'a'; |
cab_unget(cid[i], p); |
grx_text(s,x,y,col,0); |
x += 8; |
if (x >= (X2 + NCAR*8)) { |
x = X2; |
y = y + 8; |
if (y >= ybase+16) { |
y = ybase; |
col = col % 15 + 1; |
} |
} |
task_endcycle(); |
} |
} |
/*--------------------------------------------------------------*/ |
/* create the two tasks and a channel */ |
/*--------------------------------------------------------------*/ |
void create_channel(int i) |
{ |
HARD_TASK_MODEL m; |
draw_channel(i); |
cid[i] = cab_create(cname[i], 1, 2); |
hard_task_default_model(m); |
hard_task_def_ctrl_jet (m); |
hard_task_def_arg (m, (void *)i); |
hard_task_def_wcet (m, w1[i]); |
hard_task_def_mit (m, t1[i]); |
hard_task_def_usemath (m); |
p1[i] = task_create(pname1[i], producer, &m, NULL); |
if (p1[i] == NIL) { |
sys_shutdown_message("Could not create task <producer>"); |
exit(1); |
return; |
} |
task_activate(p1[i]); |
hard_task_default_model(m); |
hard_task_def_ctrl_jet (m); |
hard_task_def_arg (m, (void *)i); |
hard_task_def_wcet (m, w2[i]); |
hard_task_def_mit (m, t2[i]); |
hard_task_def_usemath (m); |
p2[i] = task_create(pname2[i], consumer, &m, NULL); |
if (p2[i] == NIL) { |
sys_shutdown_message("Could not create task <consumer>"); |
exit(1); |
return; |
} |
task_activate(p2[i]); |
} |
/*--------------------------------------------------------------*/ |
/* Disegna i processi e il canale di comunicazione */ |
/*--------------------------------------------------------------*/ |
void draw_channel(int i) |
{ |
char buffer[32]; /* buffer per sprintf */ |
int yc = YP + i*DELTA; /* altezza del canale */ |
grx_circle(XP1,yc,R,rgb16(255,0,0)); |
grx_text("P1",XP1-8,yc-4,rgb16(255,255,255),0); |
grx_circle(XP2,yc,R,rgb16(255,0,0)); |
grx_text("P2",XP2-8,yc-4,rgb16(255,255,255),0); |
grx_rect(XC,yc-R,XC+L,yc+R,rgb16(255,255,255)); |
grx_text("CAB",XC+16,yc-4,rgb16(255,255,255),0); |
grx_line(XP1+R,yc,XC,yc,rgb16(255,255,255)); |
grx_line(XC+L,yc,XP2-R,yc,rgb16(255,255,255)); |
grx_text("T1 = ms",X1+40,yc+R+16,rgb16(255,255,255),0); |
sprintf(buffer,"%ld", t1[i]); |
grx_text(buffer,X1+88,yc+R+16,rgb16(255,255,255),0); |
grx_text("T2 = ms",X2+40,yc+R+16,rgb16(255,255,255),0); |
sprintf(buffer,"%ld", t2[i]); |
grx_text(buffer,X2+88,yc+R+16,rgb16(255,255,255),0); |
} |
/demos/tags/rel_1_5_beta1/base/imdemo.c |
---|
0,0 → 1,102 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Paolo Gai <pj@gandalf.sssup.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/* |
* 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 |
* |
* |
* CVS : $Id: imdemo.c,v 1.4 2005-02-25 11:10:46 pj Exp $ |
**/ |
#include "kernel/kern.h" |
#include "intdrive/intdrive/intdrive.h" |
#include "edf/edf/edf.h" |
#include "cbs/cbs/cbs.h" |
#include "rr/rr/rr.h" |
#include "dummy/dummy/dummy.h" |
#include "sem/sem/sem.h" |
#include "hartport/hartport/hartport.h" |
#include "cabs/cabs/cabs.h" |
#include "pi/pi/pi.h" |
#include "pc/pc/pc.h" |
#include "srp/srp/srp.h" |
#include "npp/npp/npp.h" |
#include "nop/nop/nop.h" |
/*+ sysyem tick in us +*/ |
#define TICK 0 |
/*+ RR tick in us +*/ |
#define RRTICK 10000 |
/*+ Interrupt Server +*/ |
#define INTDRIVE_Q 1000 |
#define INTDRIVE_T 10000 |
#define INTDRIVE_FLAG 0 |
TIME __kernel_register_levels__(void *arg) |
{ |
struct multiboot_info *mb = (struct multiboot_info *)arg; |
INTDRIVE_register_level(INTDRIVE_Q,INTDRIVE_T,INTDRIVE_FLAG); |
EDF_register_level(EDF_ENABLE_ALL); |
RR_register_level(RRTICK, RR_MAIN_YES, mb); |
CBS_register_level(CBS_ENABLE_ALL, 1); |
dummy_register_level(); |
SEM_register_module(); |
CABS_register_module(); |
PI_register_module(); |
PC_register_module(); |
NPP_register_module(); |
SRP_register_module(); |
NOP_register_module(); |
return TICK; |
} |
TASK __init__(void *arg) |
{ |
struct multiboot_info *mb = (struct multiboot_info *)arg; |
HARTPORT_init(); |
__call_main__(mb); |
return (void *)0; |
} |
/demos/tags/rel_1_5_beta1/base/ihello.c |
---|
0,0 → 1,95 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Paolo Gai <pj@gandalf.sssup.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/** |
------------ |
CVS : $Id: ihello.c,v 1.2 2005-02-25 11:10:46 pj Exp $ |
File: $File$ |
Revision: $Revision: 1.2 $ |
Last update: $Date: 2005-02-25 11:10:46 $ |
------------ |
The simplest initialization file |
The tick is set to TICK ms. |
This file contains the 2 functions needed to initialize the system. |
These functions register the following levels: |
a RR (Round Robin) level |
a Dummy level |
It can accept these task models: |
NRT_TASK_MODEL at level 0 |
**/ |
/* |
* 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 "rr/rr/rr.h" |
#include "dummy/dummy/dummy.h" |
/*+ sysyem tick in us +*/ |
#define TICK 300 |
/*+ RR tick in us +*/ |
#define RRTICK 10000 |
TIME __kernel_register_levels__(void *arg) |
{ |
struct multiboot_info *mb = (struct multiboot_info *)arg; |
RR_register_level(RRTICK, RR_MAIN_YES, mb); |
dummy_register_level(); |
return TICK; |
} |
TASK __init__(void *arg) |
{ |
struct multiboot_info *mb = (struct multiboot_info *)arg; |
__call_main__(mb); |
return (void *)0; |
} |
/demos/tags/rel_1_5_beta1/base/initgraph.c |
---|
0,0 → 1,196 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Giacomo Guidi <giacomo@gandalf.sssup.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/* |
* 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 "intdrive/intdrive/intdrive.h" |
#include "edf/edf/edf.h" |
#include "hardcbs/hardcbs/hardcbs.h" |
#include "rr/rr/rr.h" |
#include "dummy/dummy/dummy.h" |
#include "sem/sem/sem.h" |
#include "hartport/hartport/hartport.h" |
#include "cabs/cabs/cabs.h" |
#include <drivers/shark_linuxc26.h> |
#include <drivers/shark_pci26.h> |
#include <drivers/shark_input26.h> |
#include <drivers/shark_keyb26.h> |
#include <drivers/shark_fb26.h> |
#define FRAME_BUFFER_DEVICE 0 |
/*+ sysyem tick in us +*/ |
#define TICK 0 |
/*+ RR tick in us +*/ |
#define RRTICK 2000 |
/*+ Interrupt Server +*/ |
#define INTDRIVE_Q 1000 |
#define INTDRIVE_T 10000 |
#define INTDRIVE_FLAG 0 |
void call_shutdown_task(void *arg); |
int device_drivers_init(); |
int device_drivers_close(); |
void set_shutdown_task(); |
TASK shutdown_task_body(void *arg); |
PID shutdown_task_PID = -1; |
TIME __kernel_register_levels__(void *arg) |
{ |
struct multiboot_info *mb = (struct multiboot_info *)arg; |
INTDRIVE_register_level(INTDRIVE_Q,INTDRIVE_T,INTDRIVE_FLAG); |
EDF_register_level(EDF_ENABLE_ALL); |
HCBS_register_level(HCBS_ENABLE_ALL, 1); |
RR_register_level(RRTICK, RR_MAIN_YES, mb); |
dummy_register_level(); |
SEM_register_module(); |
CABS_register_module(); |
return TICK; |
} |
TASK __init__(void *arg) |
{ |
struct multiboot_info *mb = (struct multiboot_info *)arg; |
HARTPORT_init(); |
/* Create the shutdown task. It will be activated at RUNLEVEL |
SHUTDOWN */ |
set_shutdown_task(); |
/* Init the drivers */ |
device_drivers_init(); |
/* Set the shutdown task activation */ |
sys_atrunlevel(call_shutdown_task, NULL, RUNLEVEL_SHUTDOWN); |
__call_main__(mb); |
return (void *)0; |
} |
void set_shutdown_task() { |
/* WARNING: the shutdown task is a background thread. It cannot execute |
if the system is overloaded */ |
NRT_TASK_MODEL nrt; |
nrt_task_default_model(nrt); |
nrt_task_def_system(nrt); |
shutdown_task_PID = task_create("Shutdown Task",shutdown_task_body,&nrt,NULL); |
if (shutdown_task_PID == NIL) { |
sys_shutdown_message("Error: Cannot create shutdown task\n"); |
exit(0); |
} |
} |
int device_drivers_init() { |
int res; |
KEYB_PARMS kparms = BASE_KEYB; |
LINUXC26_register_module(); |
PCI26_init(); |
INPUT26_init(); |
keyb_def_ctrlC(kparms, NULL); |
KEYB26_init(&kparms); |
FB26_init(); |
res = FB26_open(FRAME_BUFFER_DEVICE); |
if (res) { |
cprintf("Error: Cannot open graphical mode\n"); |
KEYB26_close(); |
INPUT26_close(); |
exit(0); |
} |
FB26_use_grx(FRAME_BUFFER_DEVICE); |
FB26_setmode(FRAME_BUFFER_DEVICE,"640x480-16"); |
return 0; |
} |
int device_drivers_close() { |
FB26_close(FRAME_BUFFER_DEVICE); |
KEYB26_close(); |
INPUT26_close(); |
return 0; |
} |
#define SHUTDOWN_TIMEOUT_SEC 3 |
void call_shutdown_task(void *arg) |
{ |
struct timespec t; |
sys_gettime(&t); |
t.tv_sec += SHUTDOWN_TIMEOUT_SEC; |
/* Emergency timeout to exit from RUNLEVEL_SHUTDOWN */ |
kern_event_post(&t,(void *)((void *)sys_abort_shutdown),(void *)0); |
task_activate(shutdown_task_PID); |
} |
TASK shutdown_task_body(void *arg) { |
device_drivers_close(); |
sys_shutdown_message("-- S.Ha.R.K. Closed --\n"); |
return NULL; |
} |
/demos/tags/rel_1_5_beta1/base/fly.c |
---|
0,0 → 1,202 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Paolo Gai <pj@gandalf.sssup.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/** |
------------ |
CVS : $Id: fly.c,v 1.11 2005-02-25 11:10:46 pj Exp $ |
File: $File$ |
Revision: $Revision: 1.11 $ |
Last update: $Date: 2005-02-25 11:10:46 $ |
------------ |
**/ |
/* |
* Copyright (C) 2000 Paolo Gai and Giorgio Buttazzo |
* |
* 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 |
* |
*/ |
/*--------------------------------------------------------------*/ |
/* SIMULATION OF RANDOM FLIES */ |
/*--------------------------------------------------------------*/ |
#include <kernel/kern.h> |
#include <sem/sem/sem.h> |
#include <stdlib.h> |
#include <math.h> |
#include <drivers/shark_keyb26.h> |
#include <drivers/shark_fb26.h> |
#define YMENU 10 /* menu level */ |
#define XMIN 50 |
#define XMAX 600 |
#define YMIN 100 |
#define YMAX 450 |
#define VEL 5 /* linear velocity (def. = 5) */ |
#define ANG 30 /* angolo massimo sterzata (30) */ |
#define D 3 /* raggio mosca */ |
#undef ESC |
#define ESC 27 /* ASCII code of ESCAPE key */ |
#define MAX_P 35 /* max number of flies */ |
#define FLYGROUP 1 |
double tick = 1.0; /* system tick = 1 ms */ |
int fly_period = 40000; /* task period */ |
int fly_wcet = 1000; /* task wcet */ |
PID pid; |
sem_t grx_mutex; |
/*--------------------------------------------------------------*/ |
void draw_fly(int x, int y, int c) |
{ |
grx_disc(x, y, D, c); |
} |
/******************************************************************/ |
TASK fly(void *arg) |
{ |
int x, y; |
int ox, oy; |
int dx, dy, da; |
int teta, col,red; |
int outx, outy; |
double r; |
int i = (int)arg; |
x = ox = (XMIN+XMAX)/2; |
y = oy = (YMIN+YMAX)/2; |
teta = 0; |
red = 100+10*i; |
if (red > 255) red = 255; |
col = rgb16(red,0,50); /* colore fly */ |
while (1) { |
da = rand()%(2*ANG) - ANG; /* da = [-ANG,ANG] */ |
teta += da; |
if (teta > 360) teta -= 360; |
if (teta < 0) teta += 360; |
r = (double)teta * PI / 180.; |
dx = (float)(VEL * cos(r)); |
dy = (float)(VEL * sin(r)); |
x += dx; |
y += dy; |
outx = (x >= XMAX) || (x <= XMIN); |
outy = (y >= YMAX) || (y <= YMIN); |
if (outx || outy) { |
x = x - dx; |
y = y - dy; |
if (outx) teta = 180 - teta; |
if (outy) teta = -teta; |
if (teta > 360) teta -= 360; |
if (teta < 0) teta += 360; |
r = (double)teta * PI / 180.; |
dx = (float)(VEL * cos(r)); |
dy = (float)(VEL * sin(r)); |
x += dx; |
y += dy; |
} |
sem_wait(&grx_mutex); |
draw_fly(ox, oy, 0); |
draw_fly(x, y, col); |
ox = x; oy = y; |
sem_post(&grx_mutex); |
task_endcycle(); |
} |
} |
/****************************** MAIN ******************************/ |
int main(int argc, char **argv) |
{ |
HARD_TASK_MODEL m; |
char c; /* character from keyboard */ |
int i = 0; /* number of tasks created */ |
TIME seme; /* used to init the random seed */ |
/* Init the mutex */ |
sem_init(&grx_mutex,0,1); |
/* The scenario */ |
grx_rect(XMIN-D-1, YMIN-D-1, XMAX+D+1, YMAX+D+1, rgb16(255,255,255)); |
grx_text("Simulation of Random Flies", XMIN, YMENU+10, rgb16(255,255,255), 0); |
grx_text("SPACE create a fly" , XMIN, YMENU+20, rgb16(255,255,255), 0); |
grx_text("ESC exit to DOS" , XMIN, YMENU+30, rgb16(255,255,255), 0); |
/* The program waits a space to create a fly */ |
c = keyb_getch(BLOCK); |
/* randomize!!!! */ |
seme = sys_gettime(NULL); |
srand(seme); |
do { |
if ((c == ' ') && (i < MAX_P)) { |
hard_task_default_model(m); |
hard_task_def_ctrl_jet (m); |
hard_task_def_arg (m, (void *)i); |
hard_task_def_wcet (m, fly_wcet); |
hard_task_def_mit (m, fly_period); |
hard_task_def_group (m, FLYGROUP); |
hard_task_def_usemath (m); |
pid = task_create("fly", fly, &m, NULL); |
if (pid == NIL) { |
sys_shutdown_message("Could not create task <fly>"); |
exit(1); |
} |
task_activate(pid); |
i++; |
} |
c = keyb_getch(BLOCK); |
} while (c != ESC); |
exit(0); |
return 0; |
} |
/*--------------------------------------------------------------*/ |
/demos/tags/rel_1_5_beta1/base/initfile.c |
---|
0,0 → 1,162 |
/* |
* Project: S.Ha.R.K |
* |
* Coordinators: Giorgio Buttazzo <giorgio@sssup.it> |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://hartik.sssup.it |
*/ |
#include "kernel/kern.h" |
#include "edf/edf/edf.h" |
#include "cbs/cbs/cbs.h" |
#include "rr/rr/rr.h" |
#include "dummy/dummy/dummy.h" |
#include "intdrive/intdrive/intdrive.h" |
#include "sem/sem/sem.h" |
#include "hartport/hartport/hartport.h" |
#include "pi/pi/pi.h" |
#include "pc/pc/pc.h" |
#include "srp/srp/srp.h" |
#include "npp/npp/npp.h" |
#include "nop/nop/nop.h" |
#include <drivers/shark_linuxc26.h> |
#include <drivers/shark_input26.h> |
#include <drivers/shark_keyb26.h> |
#define FRAME_BUFFER_DEVICE 0 |
/*+ sysyem tick in us +*/ |
#define TICK 0 |
/*+ RR tick in us +*/ |
#define RRTICK 10000 |
/*+ Interrupt Server +*/ |
#define INTDRIVE_Q 1000 |
#define INTDRIVE_T 10000 |
#define INTDRIVE_FLAG 0 |
void call_shutdown_task(void *arg); |
int device_drivers_init(); |
int device_drivers_close(); |
void set_shutdown_task(); |
TASK shutdown_task_body(void *arg); |
PID shutdown_task_PID = -1; |
TIME __kernel_register_levels__(void *arg) |
{ |
struct multiboot_info *mb = (struct multiboot_info *)arg; |
INTDRIVE_register_level(INTDRIVE_Q,INTDRIVE_T,INTDRIVE_FLAG); |
EDF_register_level(EDF_ENABLE_ALL); |
CBS_register_level(CBS_ENABLE_ALL, 1); |
RR_register_level(RRTICK, RR_MAIN_YES, mb); |
dummy_register_level(); |
SEM_register_module(); |
PI_register_module(); |
PC_register_module(); |
NPP_register_module(); |
SRP_register_module(); |
NOP_register_module(); |
return TICK; |
} |
TASK __init__(void *arg) |
{ |
struct multiboot_info *mb = (struct multiboot_info *)arg; |
HARTPORT_init(); |
/* Create the shutdown task. It will be activated at RUNLEVEL |
SHUTDOWN */ |
set_shutdown_task(); |
/* Init the drivers */ |
device_drivers_init(); |
/* Set the shutdown task activation */ |
sys_atrunlevel(call_shutdown_task, NULL, RUNLEVEL_SHUTDOWN); |
__call_main__(mb); |
return (void *)0; |
} |
void set_shutdown_task() { |
/* WARNING: the shutdown task is a background thread. It cannot execute |
if the system is overloaded */ |
NRT_TASK_MODEL nrt; |
nrt_task_default_model(nrt); |
nrt_task_def_system(nrt); |
shutdown_task_PID = task_create("Shutdown Task",shutdown_task_body,&nrt,NULL); |
if (shutdown_task_PID == NIL) { |
sys_shutdown_message("Error: Cannot create shutdown task\n"); |
exit(1); |
} |
} |
int device_drivers_init() { |
KEYB_PARMS kparms = BASE_KEYB; |
LINUXC26_register_module(); |
INPUT26_init(); |
keyb_def_ctrlC(kparms, NULL); |
KEYB26_init(&kparms); |
return 0; |
} |
int device_drivers_close() { |
KEYB26_close(); |
INPUT26_close(); |
return 0; |
} |
#define SHUTDOWN_TIMEOUT_SEC 3 |
void call_shutdown_task(void *arg) |
{ |
struct timespec t; |
sys_gettime(&t); |
t.tv_sec += SHUTDOWN_TIMEOUT_SEC; |
/* Emergency timeout to exit from RUNLEVEL_SHUTDOWN */ |
kern_event_post(&t,(void *)((void *)sys_abort_shutdown),(void *)0); |
task_activate(shutdown_task_PID); |
} |
TASK shutdown_task_body(void *arg) { |
device_drivers_close(); |
sys_shutdown_message("-- S.Ha.R.K. Closed --\n"); |
return NULL; |
} |
/demos/tags/rel_1_5_beta1/base/iaster1.c |
---|
0,0 → 1,99 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Paolo Gai <pj@gandalf.sssup.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/** |
------------ |
CVS : $Id: iaster1.c,v 1.3 2005-02-25 11:10:46 pj Exp $ |
File: $File$ |
Revision: $Revision: 1.3 $ |
Last update: $Date: 2005-02-25 11:10:46 $ |
------------ |
System initialization file |
The tick is set to TICK ms. |
This file contains the 2 functions needed to initialize the system. |
These functions register the following levels: |
an EDF (Earliest Deadline First) level |
a RR (Round Robin) level |
a Dummy level |
It can accept these task models (into () the mandatory fields): |
HARD_TASK_MODEL (wcet+mit) at level 0 |
NRT_TASK_MODEL at level 1 |
**/ |
/* |
* 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 "edf/edf/edf.h" |
#include "rr/rr/rr.h" |
#include "dummy/dummy/dummy.h" |
/*+ sysyem tick in us +*/ |
#define TICK 1000 |
/*+ RR tick in us +*/ |
#define RRTICK 10000 |
TIME __kernel_register_levels__(void *arg) |
{ |
struct multiboot_info *mb = (struct multiboot_info *)arg; |
EDF_register_level(EDF_ENABLE_ALL); |
RR_register_level(RRTICK, RR_MAIN_YES, mb); |
dummy_register_level(); |
return TICK; |
} |
TASK __init__(void *arg) |
{ |
struct multiboot_info *mb = (struct multiboot_info *)arg; |
__call_main__(mb); |
return (void *)0; |
} |
/demos/tags/rel_1_5_beta1/base/srpdemo.c |
---|
0,0 → 1,234 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Paolo Gai <pj@gandalf.sssup.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/* |
* 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 |
* |
* |
* CVS : $Id: srpdemo.c,v 1.5 2005-02-25 11:10:46 pj Exp $ |
This test verify the correctness of the SRP module. |
There are 3 taks, Jh, Jm, Jl that uses 3 mutexes m1, m2, m3 |
the main task (NRT) creates the three tasks. |
Jh with preemption level 3 |
starts at t=1.5 sec and lock m3, lock m1, unlock m1, unlock m3 |
Jm with preemption level 2 |
starts at t=0.5 sec and lock m3, lock m2, unlock m2, unlock m3 |
then lock and unlock m1 |
Jl with preemption level 1 |
it starts and locks m2 |
at t=1 sec it locks m1 |
at t=1.5 sec it unlocks m1 |
then it unlocks m2, and finally it locks and unlocks m3 |
The example is similar to the scheduling diagram shown at p. 210 of the |
book "Sistemi in tempo Reale", by Giorgio Buttazzo, Pitagora Editrice |
*/ |
#include "kernel/kern.h" |
#include "srp/srp/srp.h" |
mutex_t m1,m2,m3; |
void startJ(void *a) |
{ |
task_activate((PID)a); |
} |
TASK Jlobby() |
{ |
cprintf("(*) JLobby!!!\n"); |
return 0; |
} |
TASK Jh() |
{ |
PID l; |
HARD_TASK_MODEL m; |
SRP_RES_MODEL r; |
cprintf("JH: creating Jy before locking m3\n"); |
hard_task_default_model(m); |
hard_task_def_mit(m,30000); |
hard_task_def_wcet(m,1000); |
SRP_res_default_model(r,4); |
l = task_create("Jlobby",Jlobby,&m,&r); |
task_activate(l); |
mutex_lock(&m3); |
cprintf("JH: locked m3, locking m1\n"); |
mutex_lock(&m1); |
cprintf("JH: locked m1, unlocking m1\n"); |
mutex_unlock(&m1); |
cprintf("JH: unlocked m1, unlocking m3\n"); |
mutex_unlock(&m3); |
cprintf("JH: unlocked m3, end task\n"); |
return 0; |
} |
TASK Jm() |
{ |
cprintf("JM: before locking m3\n"); |
mutex_lock(&m3); |
cprintf("JM: locked m3, locking m2\n"); |
mutex_lock(&m2); |
cprintf("JM: locked m2, unlocking m2\n"); |
mutex_unlock(&m2); |
cprintf("JM: unlocked m2, unlocking m3\n"); |
mutex_unlock(&m3); |
cprintf("JM: unlocked m3, locking m1\n"); |
mutex_lock(&m1); |
cprintf("JM: locked m1, unlocking m1\n"); |
mutex_unlock(&m1); |
cprintf("JM: unlocked m1, end task\n"); |
return 0; |
} |
TASK Jl() |
{ |
cprintf("JL: before locking m2\n"); |
mutex_lock(&m2); |
cprintf("JL: locked m2, waiting to t=1 sec\n"); |
while (sys_gettime(NULL) < 1000000); |
cprintf("JL: t = 1 sec reached, locking m1\n"); |
mutex_lock(&m1); |
cprintf("JL: locked m1, waiting to t=2 sec\n"); |
while (sys_gettime(NULL) < 2000000); |
cprintf("JL: t = 2 sec reached, unlocking m1\n"); |
mutex_unlock(&m1); |
cprintf("JL: unlocked m1, unlocking m2\n"); |
mutex_unlock(&m2); |
cprintf("JL: unlocked m2, locking m3\n"); |
mutex_lock(&m3); |
cprintf("JL: locked m3, unlocking m3\n"); |
mutex_unlock(&m3); |
cprintf("JL: unlocked m3, end task\n"); |
return 0; |
} |
int main(int argc, char **argv) |
{ |
struct timespec t; |
HARD_TASK_MODEL m; |
PID p0,p1,p2; |
SRP_mutexattr_t a; |
SRP_RES_MODEL r; |
PI_mutexattr_t a2; |
clear(); |
cprintf("Stack resource Policy demo. It ends after 60 sec\n"); |
/* --------------------------------------------------------------------- |
Mutex creation |
--------------------------------------------------------------------- */ |
PI_mutexattr_default(a2); |
SRP_mutexattr_default(a); |
mutex_init(&m1,&a); |
mutex_init(&m2,&a); |
mutex_init(&m3,&a); |
/* --------------------------------------------------------------------- |
Task creation |
--------------------------------------------------------------------- */ |
hard_task_default_model(m); |
hard_task_def_mit(m, 1000000); |
hard_task_def_wcet(m, 80000); |
SRP_res_default_model(r, 3); |
p0 = task_createn("JH", Jh, (TASK_MODEL *)&m, &r, SRP_usemutex(&m3), SRP_usemutex(&m1), NULL); |
if (p0 == NIL) |
{ cprintf("Can't create JH task...\n"); return 1; } |
hard_task_default_model(m); |
hard_task_def_mit(m, 2100000); |
hard_task_def_wcet(m, 80000); |
SRP_res_default_model(r, 2); |
p1 = task_createn("JM", Jm, (TASK_MODEL *)&m, &r, SRP_usemutex(&m3), SRP_usemutex(&m1), |
SRP_usemutex(&m2), NULL); |
if (p1 == NIL) |
{ cprintf("Can't create JM task...\n"); return 1; } |
hard_task_default_model(m); |
hard_task_def_mit(m, 10000000); |
hard_task_def_wcet(m, 3000000); |
SRP_res_default_model(r, 1); |
p2 = task_createn("JL", Jl, (TASK_MODEL *)&m, &r, SRP_usemutex(&m3), SRP_usemutex(&m1), |
SRP_usemutex(&m2), NULL); |
if (p2 == NIL) |
{ cprintf("Can't create JL task...\n"); return 1; } |
/* --------------------------------------------------------------------- |
Event post |
--------------------------------------------------------------------- */ |
t.tv_sec = 0; |
t.tv_nsec = 500000000; |
kern_cli(); |
kern_event_post(&t,startJ,(void *)p1); |
t.tv_sec = 1; |
kern_event_post(&t,startJ,(void *)p0); |
kern_sti(); |
task_activate(p2); |
do { |
sys_gettime(&t); |
} while (t.tv_sec < 60); |
exit(0); |
return 0; |
} |
/demos/tags/rel_1_5_beta1/base/iaster3.c |
---|
0,0 → 1,110 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Paolo Gai <pj@gandalf.sssup.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/** |
------------ |
CVS : $Id: iaster3.c,v 1.3 2005-02-25 11:10:46 pj Exp $ |
File: $File$ |
Revision: $Revision: 1.3 $ |
Last update: $Date: 2005-02-25 11:10:46 $ |
------------ |
System initialization file |
The tick is set to TICK ms. |
This file contains the 2 functions needed to initialize the system. |
These functions register the following levels: |
an EDF (Earliest Deadline First) level |
a RR (Round Robin) level |
a TBS (Total Bandwidth Server) level 0.1 Us |
a TBS (Total Bandwidth Server) level 0.3 Us |
a Dummy level |
The TBS bandwidth is TBS_NUM/TBS_DEN |
It can accept these task models (into () the mandatory fields): |
HARD_TASK_MODEL (wcet+mit) at level 0 |
NRT_TASK_MODEL at level 1 |
SOFT_TASK_MODEL (wcet, periodicity=APERIODIC) at level 2,3 |
**/ |
/* |
* 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 "edf/edf/edf.h" |
#include "rr/rr/rr.h" |
#include "tbs/tbs/tbs.h" |
#include "dummy/dummy/dummy.h" |
/*+ sysyem tick in us +*/ |
#define TICK 1200 |
#define RRTICK 5000 |
#define TBS_NUM 1 |
#define TBS_DEN 10 |
TIME __kernel_register_levels__(void *arg) |
{ |
struct multiboot_info *mb = (struct multiboot_info *)arg; |
EDF_register_level(EDF_ENABLE_ALL); |
RR_register_level(RRTICK, RR_MAIN_YES, mb); |
TBS_register_level(TBS_ENABLE_ALL, 0, TBS_NUM, TBS_DEN); |
TBS_register_level(TBS_ENABLE_ALL, 0, TBS_NUM*3, TBS_DEN); |
dummy_register_level(); |
return TICK; |
} |
TASK __init__(void *arg) |
{ |
struct multiboot_info *mb = (struct multiboot_info *)arg; |
__call_main__(mb); |
return (void *)0; |
} |
/demos/tags/rel_1_5_beta1/base/iaster4.c |
---|
0,0 → 1,180 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Paolo Gai <pj@gandalf.sssup.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/* |
* 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 "intdrive/intdrive/intdrive.h" |
#include "edf/edf/edf.h" |
#include "rr/rr/rr.h" |
#include "tbs/tbs/tbs.h" |
#include "cbs/cbs/cbs.h" |
#include "rrsoft/rrsoft/rrsoft.h" |
#include "dummy/dummy/dummy.h" |
#include "sem/sem/sem.h" |
#include "hartport/hartport/hartport.h" |
/*+ sysyem tick in us +*/ |
#define TICK 0 |
#define RRTICK 5000 |
#define TBS_NUM 1 |
#define TBS_DEN 10 |
/*+ Interrupt Server +*/ |
#define INTDRIVE_Q 1000 |
#define INTDRIVE_T 10000 |
#define INTDRIVE_FLAG 0 |
#include <drivers/shark_linuxc26.h> |
#include <drivers/shark_input26.h> |
#include <drivers/shark_keyb26.h> |
#define FRAME_BUFFER_DEVICE 0 |
void call_shutdown_task(void *arg); |
int device_drivers_init(); |
int device_drivers_close(); |
void set_shutdown_task(); |
TASK shutdown_task_body(void *arg); |
PID shutdown_task_PID = -1; |
TIME __kernel_register_levels__(void *arg) |
{ |
struct multiboot_info *mb = (struct multiboot_info *)arg; |
INTDRIVE_register_level(INTDRIVE_Q,INTDRIVE_T,INTDRIVE_FLAG); |
EDF_register_level(EDF_ENABLE_ALL); |
RR_register_level(RRTICK, RR_MAIN_YES, mb); |
TBS_register_level(TBS_ENABLE_ALL, 1, TBS_NUM, TBS_DEN); |
TBS_register_level(TBS_ENABLE_ALL, 1, TBS_NUM*3, TBS_DEN); |
CBS_register_level(CBS_ENABLE_ALL, 1); |
dummy_register_level(); |
SEM_register_module(); |
return TICK; |
} |
TASK __init__(void *arg) |
{ |
struct multiboot_info *mb = (struct multiboot_info *)arg; |
HARTPORT_init(); |
/* Create the shutdown task. It will be activated at RUNLEVEL |
SHUTDOWN */ |
set_shutdown_task(); |
/* Init the drivers */ |
device_drivers_init(); |
/* Set the shutdown task activation */ |
sys_atrunlevel(call_shutdown_task, NULL, RUNLEVEL_SHUTDOWN); |
__call_main__(mb); |
return (void *)0; |
} |
void set_shutdown_task() { |
/* WARNING: the shutdown task is a background thread. It cannot execute |
if the system is overloaded */ |
NRT_TASK_MODEL nrt; |
nrt_task_default_model(nrt); |
nrt_task_def_system(nrt); |
shutdown_task_PID = task_create("Shutdown Task",shutdown_task_body,&nrt,NULL); |
if (shutdown_task_PID == NIL) { |
sys_shutdown_message("Error: Cannot create shutdown task\n"); |
exit(1); |
} |
} |
int device_drivers_init() { |
KEYB_PARMS kparms = BASE_KEYB; |
LINUXC26_register_module(); |
INPUT26_init(); |
keyb_def_ctrlC(kparms, NULL); |
KEYB26_init(&kparms); |
return 0; |
} |
int device_drivers_close() { |
KEYB26_close(); |
INPUT26_close(); |
return 0; |
} |
#define SHUTDOWN_TIMEOUT_SEC 3 |
void call_shutdown_task(void *arg) |
{ |
struct timespec t; |
sys_gettime(&t); |
t.tv_sec += SHUTDOWN_TIMEOUT_SEC; |
/* Emergency timeout to exit from RUNLEVEL_SHUTDOWN */ |
kern_event_post(&t,(void *)((void *)sys_abort_shutdown),(void *)0); |
task_activate(shutdown_task_PID); |
} |
TASK shutdown_task_body(void *arg) { |
device_drivers_close(); |
sys_shutdown_message("-- S.Ha.R.K. Closed --\n"); |
return NULL; |
} |
/demos/tags/rel_1_5_beta1/base/iaster6.c |
---|
0,0 → 1,224 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Paolo Gai <pj@gandalf.sssup.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/** |
------------ |
CVS : $Id: iaster6.c,v 1.6 2005-02-25 11:10:46 pj Exp $ |
File: $File$ |
Revision: $Revision: 1.6 $ |
Last update: $Date: 2005-02-25 11:10:46 $ |
------------ |
System initialization file |
h3pips.c |
These functions register the following levels: |
an EDF (Earliest Deadline First) level |
a RR (Round Robin) level |
a CBS (Costant Bandwidth Server) level |
a PS (Polling Server) level |
a Dummy level |
It can accept these task models: |
HARD_TASK_MODEL (wcet+mit) at level 0 |
NRT_TASK_MODEL at level 1 |
SOFT_TASK_MODEL (met, period) at level 2 |
SOFT_TASK_MODEL (periodicity=APERIODIC) at level 3 |
**/ |
/* |
* 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 "intdrive/intdrive/intdrive.h" |
#include "edf/edf/edf.h" |
#include "cbs/cbs/cbs.h" |
#include "rr/rr/rr.h" |
#include "dummy/dummy/dummy.h" |
#include "ps/ps/ps.h" |
#include "sem/sem/sem.h" |
#include "hartport/hartport/hartport.h" |
#include "cabs/cabs/cabs.h" |
#include "pi/pi/pi.h" |
#include "pc/pc/pc.h" |
#include "srp/srp/srp.h" |
#include "npp/npp/npp.h" |
#include "nop/nop/nop.h" |
#include <drivers/shark_linuxc26.h> |
#include <drivers/shark_input26.h> |
#include <drivers/shark_keyb26.h> |
/*+ sysyem tick in us +*/ |
#define TICK 1000 |
/*+ RR tick in us +*/ |
#define RRTICK 10000 |
/*+ Interrupt Server +*/ |
#define INTDRIVE_Q 1000 |
#define INTDRIVE_T 10000 |
#define INTDRIVE_FLAG 0 |
void call_shutdown_task(void *arg); |
int device_drivers_init(); |
int device_drivers_close(); |
void set_shutdown_task(); |
TASK shutdown_task_body(void *arg); |
PID shutdown_task_PID = -1; |
TIME __kernel_register_levels__(void *arg) |
{ |
struct multiboot_info *mb = (struct multiboot_info *)arg; |
INTDRIVE_register_level(INTDRIVE_Q,INTDRIVE_T,INTDRIVE_FLAG); |
EDF_register_level(EDF_ENABLE_ALL); |
RR_register_level(RRTICK, RR_MAIN_YES, mb); |
CBS_register_level(CBS_ENABLE_ALL, 1); |
PS_register_level(2 /*PS_ENABLE_ALL_EDF*/,1,500,100000); |
dummy_register_level(); |
SEM_register_module(); |
CABS_register_module(); |
PI_register_module(); |
PC_register_module(); |
NPP_register_module(); |
SRP_register_module(); |
NOP_register_module(); |
return TICK; |
} |
TASK __init__(void *arg) |
{ |
struct multiboot_info *mb = (struct multiboot_info *)arg; |
HARTPORT_init(); |
/* Create the shutdown task. It will be activated at RUNLEVEL |
SHUTDOWN */ |
set_shutdown_task(); |
/* Init the drivers */ |
device_drivers_init(); |
/* Set the shutdown task activation */ |
sys_atrunlevel(call_shutdown_task, NULL, RUNLEVEL_SHUTDOWN); |
__call_main__(mb); |
return (void *)0; |
} |
void set_shutdown_task() { |
/* WARNING: the shutdown task is a background thread. It cannot execute |
if the system is overloaded */ |
NRT_TASK_MODEL nrt; |
nrt_task_default_model(nrt); |
nrt_task_def_system(nrt); |
shutdown_task_PID = task_create("Shutdown Task",shutdown_task_body,&nrt,NULL); |
if (shutdown_task_PID == NIL) { |
sys_shutdown_message("Error: Cannot create shutdown task\n"); |
exit(1); |
} |
} |
int device_drivers_init() { |
KEYB_PARMS kparms = BASE_KEYB; |
LINUXC26_register_module(); |
INPUT26_init(); |
keyb_def_ctrlC(kparms, NULL); |
KEYB26_init(&kparms); |
return 0; |
} |
int device_drivers_close() { |
KEYB26_close(); |
INPUT26_close(); |
return 0; |
} |
#define SHUTDOWN_TIMEOUT_SEC 3 |
void call_shutdown_task(void *arg) |
{ |
struct timespec t; |
sys_gettime(&t); |
t.tv_sec += SHUTDOWN_TIMEOUT_SEC; |
/* Emergency timeout to exit from RUNLEVEL_SHUTDOWN */ |
kern_event_post(&t,(void *)((void *)sys_abort_shutdown),(void *)0); |
task_activate(shutdown_task_PID); |
} |
TASK shutdown_task_body(void *arg) { |
device_drivers_close(); |
sys_shutdown_message("-- S.Ha.R.K. Closed --\n"); |
return NULL; |
} |
/demos/tags/rel_1_5_beta1/base/iaster7.c |
---|
0,0 → 1,212 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Paolo Gai <pj@gandalf.sssup.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/** |
------------ |
CVS : $Id: iaster7.c,v 1.6 2005-02-25 11:10:46 pj Exp $ |
File: $File$ |
Revision: $Revision: 1.6 $ |
Last update: $Date: 2005-02-25 11:10:46 $ |
------------ |
System initialization file |
The tick is set to TICK ms. |
This file contains the 2 functions needed to initialize the system. |
These functions register a set of scheduling modules, in a fixed or |
dynamic priority way... |
It can accept these task models: |
HARD_TASK_MODEL (wcet+mit) at level 0 |
SOFT_TASK_MODEL (periodicity=APERIODIC) at level 1 |
NRT_TASK_MODEL at level 2 |
SOFT_TASK_MODEL (periodicity=APERIODIC, wcet (only if TBS) ) at level 3,4 |
**/ |
/* |
* 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 "intdrive/intdrive/intdrive.h" |
#include "edf/edf/edf.h" |
#include "tbs/tbs/tbs.h" |
#include "rm/rm/rm.h" |
#include "rr/rr/rr.h" |
#include "ps/ps/ps.h" |
#include "dummy/dummy/dummy.h" |
#include "sem/sem/sem.h" |
#include "hartport/hartport/hartport.h" |
#include <drivers/shark_linuxc26.h> |
#include <drivers/shark_input26.h> |
#include <drivers/shark_keyb26.h> |
/*+ sysyem tick in us +*/ |
#define TICK 0 |
#define RRTICK 10000 |
/*+ Interrupt Server +*/ |
#define INTDRIVE_Q 1000 |
#define INTDRIVE_T 10000 |
#define INTDRIVE_FLAG 0 |
void call_shutdown_task(void *arg); |
int device_drivers_init(); |
int device_drivers_close(); |
void set_shutdown_task(); |
TASK shutdown_task_body(void *arg); |
PID shutdown_task_PID = -1; |
TIME __kernel_register_levels__(void *arg) |
{ |
struct multiboot_info *mb = (struct multiboot_info *)arg; |
INTDRIVE_register_level(INTDRIVE_Q,INTDRIVE_T,INTDRIVE_FLAG); |
RM_register_level(RM_ENABLE_ALL); |
PS_register_level(PS_ENABLE_ALL_RM,1,1000,100000); |
RR_register_level(RRTICK, RR_MAIN_YES, mb); |
PS_register_level(4,1,10000,100000); |
PS_register_level(4,1,30000,100000); |
dummy_register_level(); |
SEM_register_module(); |
return TICK; |
} |
TASK __init__(void *arg) |
{ |
struct multiboot_info *mb = (struct multiboot_info *)arg; |
HARTPORT_init(); |
/* Create the shutdown task. It will be activated at RUNLEVEL |
SHUTDOWN */ |
set_shutdown_task(); |
/* Init the drivers */ |
device_drivers_init(); |
/* Set the shutdown task activation */ |
sys_atrunlevel(call_shutdown_task, NULL, RUNLEVEL_SHUTDOWN); |
__call_main__(mb); |
return (void *)0; |
} |
void set_shutdown_task() { |
/* WARNING: the shutdown task is a background thread. It cannot execute |
if the system is overloaded */ |
NRT_TASK_MODEL nrt; |
nrt_task_default_model(nrt); |
nrt_task_def_system(nrt); |
shutdown_task_PID = task_create("Shutdown Task",shutdown_task_body,&nrt,NULL); |
if (shutdown_task_PID == NIL) { |
sys_shutdown_message("Error: Cannot create shutdown task\n"); |
exit(1); |
} |
} |
int device_drivers_init() { |
KEYB_PARMS kparms = BASE_KEYB; |
LINUXC26_register_module(); |
INPUT26_init(); |
keyb_def_ctrlC(kparms, NULL); |
KEYB26_init(&kparms); |
return 0; |
} |
int device_drivers_close() { |
KEYB26_close(); |
INPUT26_close(); |
return 0; |
} |
#define SHUTDOWN_TIMEOUT_SEC 3 |
void call_shutdown_task(void *arg) |
{ |
struct timespec t; |
sys_gettime(&t); |
t.tv_sec += SHUTDOWN_TIMEOUT_SEC; |
/* Emergency timeout to exit from RUNLEVEL_SHUTDOWN */ |
kern_event_post(&t,(void *)((void *)sys_abort_shutdown),(void *)0); |
task_activate(shutdown_task_PID); |
} |
TASK shutdown_task_body(void *arg) { |
device_drivers_close(); |
sys_shutdown_message("-- S.Ha.R.K. Closed --\n"); |
return NULL; |
} |
/demos/tags/rel_1_5_beta1/base/aster.c |
---|
0,0 → 1,378 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Paolo Gai <pj@gandalf.sssup.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/* |
* Copyright (C) 2000 Paolo Gai, Gerardo Lamastra and Giuseppe Lipari |
* |
* 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 |
* |
* |
* CVS : $Id: aster.c,v 1.6 2005-02-25 11:10:46 pj Exp $ |
Author: Gerardo Lamastra |
Giuseppe Lipari |
Date: 1/10/96 |
File: Aster.C |
Revision: 1.6 |
*/ |
/* |
Well, this is only a stupid demo which intend to show many |
HARTIK+ capabilities; the application is structured in the followig |
way: there is an ASTER task wich randomly creates some ASTEROID tasks |
which are displayed into the first window; each task is HARD/PERIODIC |
and auto-kills itself when it reaches the window end! |
An other couple of tasks, TITLE & PUT give an example of port |
communication facility; the server task creates the port, the client |
task connect to it and uses the server to accomplish some stuff. |
Port can be declared READ/WRITE and can model ONE-TO-ONE communication |
or MANY-TO-ONE communication. |
Finally a second couple of tasks realizes a communiation through CABs; |
each time a key is pressed, the ascii code is posted into the CAB by the |
CCC task while the second task, WRITE, displays it on the screen and |
perform other silly actions. |
Finally a CLOCK task is implemented to test system clock. |
Please note that usually the HARTIK+ application is made up of a task |
group which interacts among them, while the main() function, which |
became a task itself when the kernel is activated, is suspended until |
the system is ready to terminate; the MAIN task can also be used to make |
other background activities, but it should not be killed; when the |
application terminates, the control is passed to MAIN which kills |
everybody, shut down the system and can handle other operations using |
the services available with the previou operating system (I.E. the DOS). |
If you need to manage sudden abort/exception you should install your own |
exception handler and raise it through the exc_raise() primitive to |
make the system abort safely! |
Remember that the exit functions posted through sys_atexit() will be |
executed in both cases, to allow clean system shutdown. |
*/ |
#include <kernel/kern.h> |
#include <sem/sem/sem.h> |
#include <hartport/hartport/hartport.h> |
#include <cabs/cabs/cabs.h> |
#include <string.h> |
#include <drivers/shark_keyb26.h> |
//#define __VPAGING__ |
#include <drivers/crtwin.h> |
int num_aster = 0; |
#define ASTER_LIM 67 |
CAB cc; |
BYTE esc = FALSE; |
TASK asteroide(void) |
{ |
int i = 1; |
int y = rand() % 7 + 1; |
while (i < ASTER_LIM) { |
puts_xy(i,y,WHITE,"*"); |
task_endcycle(); |
puts_xy(i,y,WHITE," "); |
i++; |
} |
num_aster--; |
return 0; |
} |
DWORD taskCreated = 0; |
TASK aster(void) |
{ |
PID p; |
SOFT_TASK_MODEL m_soft; |
int r; |
WIN w; |
win_init(&w,0,0,ASTER_LIM,8); |
win_frame(&w,BLACK,WHITE,"Asteroids",2); |
soft_task_default_model(m_soft); |
soft_task_def_met(m_soft,2000); |
soft_task_def_ctrl_jet(m_soft); |
srand(7); |
while (1) { |
if (num_aster < 5) { |
r = (rand() % 50) - 25; |
soft_task_def_arg(m_soft,(void *)((rand() % 7)+1)); |
soft_task_def_period(m_soft,(50 + r)*1000); |
p = task_create("aaa",asteroide,(TASK_MODEL *)&m_soft,NULL); |
taskCreated++; |
task_activate(p); |
num_aster++; |
} |
task_endcycle(); |
} |
} |
TASK clock() |
{ |
WIN w; |
int s = 0, m = 0; |
win_init(&w,68,0,11,2); |
win_frame(&w,BLACK,WHITE,"Clk",1); |
while(1) { |
printf_xy(70,1,WHITE,"%2d : %2d",m,s); |
task_endcycle(); |
if (++s > 59) { |
s = 0; |
m++; |
} |
printf_xy(70,1,WHITE,"%2d : %2d",m,s); |
task_endcycle(); |
} |
} |
TASK title() |
{ |
PORT t; |
WIN w; |
int i,pos = 77; |
char msg[85],tmp[85],ss[2]; |
BYTE c; |
win_init(&w,0,9,79,2); |
win_frame(&w,BLACK,WHITE,"Title",2); |
for (i=0; i < 77; i++) msg[i] = ' '; |
msg[77] = 0; |
t = port_connect("title",1,STREAM,READ); |
while (1) { |
port_receive(t,&c,BLOCK); |
ss[0] = c; |
ss[1] = 0; |
strcat(msg,ss); |
puts_xy(1,10,WHITE,msg); |
pos++; |
if (pos > 77) { |
strcpy(tmp,&(msg[1])); |
tmp[pos-1] = 0; |
pos -= 1; |
strcpy(msg,tmp); |
} |
task_endcycle(); |
} |
} |
#define STR "..................... S.Ha.R.K. ....................."\ |
" Guarantees hard tasks "\ |
" Includes soft periodic tasks "\ |
"TB server for decrementing the aperiodic response time "\ |
"SRP for both hard & soft aperiodic tasks "\ |
"Portability toward other compilers/system "\ |
" "\ |
"Programmers : Gerardo Lamastra (lamastra@sssup2.sssup.it) "\ |
" Giuseppe Lipari (lipari@sssup2.sssup.it) "\ |
"Research coordinator: Giorgio Buttazzo (giorgio@sssup1.sssup.it)"\ |
" "\ |
" "\ |
" " |
static char GreetMsg[1600]; |
TASK put(void) |
{ |
PORT p; |
strcpy(GreetMsg,STR); |
p = port_create("title",strlen(GreetMsg),1,STREAM,WRITE); |
while(1) { |
port_send(p,GreetMsg,BLOCK); |
task_endcycle(); |
} |
} |
TASK ccc(void) |
{ |
WIN w; |
char *m; |
win_init(&w,68,3,10,3); |
win_frame(&w,BLACK,WHITE,"CCC",2); |
puts_xy(70,4,WHITE,"Cab"); |
while(1) { |
m = cab_getmes(cc); |
puts_xy(72,5,WHITE,m); |
cab_unget(cc,m); |
task_endcycle(); |
} |
} |
TASK write_keyb() |
{ |
BYTE c; |
char *msg; |
while (1) { |
c = keyb_getchar(); |
if (c == ESC) { |
esc = TRUE; |
task_endcycle(); |
} |
else { |
#ifdef __VPAGING__ |
if (c == 's') { |
if (get_visual_page() == 0) set_visual_page(1); |
else if (get_visual_page() == 1) set_visual_page(0); |
} |
#endif |
msg = cab_reserve(cc); |
msg[0] = c; |
msg[1] = 0; |
cab_putmes(cc,msg); |
} |
} |
} |
#define DELTA 200000.0 |
double carico(double rif,BYTE init) |
{ |
double i; |
DWORD t1 = 0,t2 = 1000; |
double u; |
i = 0.0; |
do { |
i += 1; |
} while (i <= DELTA); |
u = i / ((double) (t2 - t1)); |
if (init) return u; |
else return (1.0 - u/rif); |
} |
int main(int argc, char **argv) |
{ |
PID p1,p2,p3,p4,p5,p6; |
HARD_TASK_MODEL m_per; |
SOFT_TASK_MODEL m_soft; |
NRT_TASK_MODEL m_nrt; |
struct timespec t; |
#ifdef __VPAGING__ |
set_active_page(1); |
set_visual_page(1); |
#endif |
CRSR_OFF(); |
clear(); |
puts_xy(0,20,WHITE,"Press ESC to exit demo."); |
cc = cab_create("Cab",2,2); |
soft_task_default_model(m_soft); |
soft_task_def_period(m_soft,500000); |
soft_task_def_met(m_soft,1000); |
soft_task_def_group(m_soft, 1); |
p1 = task_create("Aster",aster,&m_soft,NULL); |
if (p1 == -1) { |
perror("Aster.C(main): Could not create task <aster>"); |
exit(-1); |
} |
hard_task_default_model(m_per); |
hard_task_def_mit(m_per,500000); |
hard_task_def_wcet(m_per,1000); |
hard_task_def_group(m_per, 1); |
p2 = task_create("Clock",clock,&m_per,NULL); |
if (p2 == -1) { |
sys_shutdown_message("Aster.C(main): Could not create task <Clock>"); |
exit(1); |
} |
soft_task_def_period(m_soft, 50000); |
p3 = task_create("Title",title,&m_soft, NULL); |
if (p3 == -1) { |
sys_shutdown_message("Aster.C(main): Could not create task <Title>"); |
exit(1); |
} |
soft_task_def_period(m_soft, 1000000); |
p4 = task_create("Put",put,&m_soft, NULL); |
if (p4 == -1) { |
sys_shutdown_message("Aster.C(main): Could not create task <Put>"); |
exit(1); |
} |
nrt_task_default_model(m_nrt); |
nrt_task_def_group(m_nrt, 1); |
p5 = task_create("Write",write_keyb,&m_nrt,NULL); |
if (p5 == -1) { |
sys_shutdown_message("Aster.C(main): Could not create task <Write>"); |
exit(1); |
} |
hard_task_def_mit(m_per, 50000); |
p6 = task_create("CabTask",ccc,&m_per,NULL); |
if (p6 == -1) { |
sys_shutdown_message("Aster.C(main): Could not create task <CabTask>\n"); |
exit(1); |
} |
group_activate(1); |
while (!esc) { |
sys_gettime(&t); |
printf_xy(0,21,WHITE,"Clock : %-9ds %-9dns",(int)t.tv_sec, (int)t.tv_nsec); |
} |
group_kill(1); |
clear(); |
CRSR_STD(); |
#ifdef __VPAGING__ |
set_active_page(0); |
set_visual_page(0); |
#endif |
exit(0); |
return 0; |
} |
/demos/tags/rel_1_5_beta1/base/iaster8.c |
---|
0,0 → 1,226 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Paolo Gai <pj@gandalf.sssup.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/** |
------------ |
CVS : $Id: iaster8.c,v 1.6 2005-02-25 11:10:46 pj Exp $ |
File: $File$ |
Revision: $Revision: 1.6 $ |
Last update: $Date: 2005-02-25 11:10:46 $ |
------------ |
System initialization file |
h3piss.c |
These functions register the following levels: |
an EDF (Earliest Deadline First) level |
a CBS (Costant Bandwidth Server) level |
a SS (Sporadic Server) level |
a RR (Round Robin) level |
a Dummy level |
It can accept these task models: |
HARD_TASK_MODEL (wcet+mit) at level 0 |
SOFT_TASK_MODEL (met, period) at level 1 |
SOFT_TASK_MODEL (periodicity=APERIODIC) at level 2 |
NRT_TASK_MODEL at level 3 |
**/ |
/* |
* 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 "intdrive/intdrive/intdrive.h" |
#include "rm/rm/rm.h" |
#include "edf/edf/edf.h" |
#include "cbs/cbs/cbs.h" |
#include "rr/rr/rr.h" |
#include "dummy/dummy/dummy.h" |
#include "ss/ss/ss.h" |
#include "sem/sem/sem.h" |
#include "hartport/hartport/hartport.h" |
#include "cabs/cabs/cabs.h" |
#include "pi/pi/pi.h" |
#include "pc/pc/pc.h" |
#include "srp/srp/srp.h" |
#include "npp/npp/npp.h" |
#include "nop/nop/nop.h" |
#include <drivers/shark_linuxc26.h> |
#include <drivers/shark_input26.h> |
#include <drivers/shark_keyb26.h> |
/*+ system tick in us +*/ |
#define TICK 1000 |
/*+ RR tick in us +*/ |
#define RRTICK 10000 |
/*+ Interrupt Server +*/ |
#define INTDRIVE_Q 1000 |
#define INTDRIVE_T 10000 |
#define INTDRIVE_FLAG 0 |
void call_shutdown_task(void *arg); |
int device_drivers_init(); |
int device_drivers_close(); |
void set_shutdown_task(); |
TASK shutdown_task_body(void *arg); |
PID shutdown_task_PID = -1; |
TIME __kernel_register_levels__(void *arg) |
{ |
struct multiboot_info *mb = (struct multiboot_info *)arg; |
INTDRIVE_register_level(INTDRIVE_Q,INTDRIVE_T,INTDRIVE_FLAG); |
EDF_register_level(EDF_ENABLE_ALL); |
CBS_register_level(CBS_ENABLE_ALL, 1); |
SS_register_level(SS_ENABLE_GUARANTEE_EDF,1,5000,20000); |
RR_register_level(RRTICK, RR_MAIN_YES, mb); |
dummy_register_level(); |
SEM_register_module(); |
CABS_register_module(); |
PC_register_module(); |
PI_register_module(); |
NPP_register_module(); |
SRP_register_module(); |
NOP_register_module(); |
return TICK; |
} |
TASK __init__(void *arg) |
{ |
struct multiboot_info *mb = (struct multiboot_info *)arg; |
HARTPORT_init(); |
/* Create the shutdown task. It will be activated at RUNLEVEL |
SHUTDOWN */ |
set_shutdown_task(); |
/* Init the drivers */ |
device_drivers_init(); |
/* Set the shutdown task activation */ |
sys_atrunlevel(call_shutdown_task, NULL, RUNLEVEL_SHUTDOWN); |
__call_main__(mb); |
return (void *)0; |
} |
void set_shutdown_task() { |
/* WARNING: the shutdown task is a background thread. It cannot execute |
if the system is overloaded */ |
NRT_TASK_MODEL nrt; |
nrt_task_default_model(nrt); |
nrt_task_def_system(nrt); |
shutdown_task_PID = task_create("Shutdown Task",shutdown_task_body,&nrt,NULL); |
if (shutdown_task_PID == NIL) { |
sys_shutdown_message("Error: Cannot create shutdown task\n"); |
exit(1); |
} |
} |
int device_drivers_init() { |
KEYB_PARMS kparms = BASE_KEYB; |
LINUXC26_register_module(); |
INPUT26_init(); |
keyb_def_ctrlC(kparms, NULL); |
KEYB26_init(&kparms); |
return 0; |
} |
int device_drivers_close() { |
KEYB26_close(); |
INPUT26_close(); |
return 0; |
} |
#define SHUTDOWN_TIMEOUT_SEC 3 |
void call_shutdown_task(void *arg) |
{ |
struct timespec t; |
sys_gettime(&t); |
t.tv_sec += SHUTDOWN_TIMEOUT_SEC; |
/* Emergency timeout to exit from RUNLEVEL_SHUTDOWN */ |
kern_event_post(&t,(void *)((void *)sys_abort_shutdown),(void *)0); |
task_activate(shutdown_task_PID); |
} |
TASK shutdown_task_body(void *arg) { |
device_drivers_close(); |
sys_shutdown_message("-- S.Ha.R.K. Closed --\n"); |
return NULL; |
} |
/demos/tags/rel_1_5_beta1/base/ipcidemo.c |
---|
0,0 → 1,131 |
/* |
* Project: S.Ha.R.K |
* |
* Coordinators: Giorgio Buttazzo <giorgio@sssup.it> |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://hartik.sssup.it |
*/ |
#include "kernel/kern.h" |
#include "edf/edf/edf.h" |
#include "hardcbs/hardcbs/hardcbs.h" |
#include "rr/rr/rr.h" |
#include "dummy/dummy/dummy.h" |
#include "intdrive/intdrive/intdrive.h" |
#include "sem/sem/sem.h" |
#include "hartport/hartport/hartport.h" |
#include "drivers/shark_linuxc26.h" |
#include "drivers/shark_pci26.h" |
/*+ sysyem tick in us +*/ |
#define TICK 0 |
/*+ RR tick in us +*/ |
#define RRTICK 10000 |
/*+ Interrupt Server +*/ |
#define INTDRIVE_Q 1000 |
#define INTDRIVE_T 10000 |
#define INTDRIVE_FLAG 0 |
void call_shutdown_task(void *arg); |
int device_drivers_init(); |
int device_drivers_close(); |
void set_shutdown_task(); |
TASK shutdown_task_body(void *arg); |
PID shutdown_task_PID = -1; |
TIME __kernel_register_levels__(void *arg) |
{ |
struct multiboot_info *mb = (struct multiboot_info *)arg; |
INTDRIVE_register_level(INTDRIVE_Q,INTDRIVE_T,INTDRIVE_FLAG); |
EDF_register_level(EDF_ENABLE_ALL); |
HCBS_register_level(HCBS_ENABLE_ALL, 1); |
RR_register_level(RRTICK, RR_MAIN_YES, mb); |
dummy_register_level(); |
SEM_register_module(); |
return TICK; |
} |
TASK __init__(void *arg) |
{ |
struct multiboot_info *mb = (struct multiboot_info *)arg; |
HARTPORT_init(); |
set_shutdown_task(); |
device_drivers_init(); |
sys_atrunlevel(call_shutdown_task, NULL, RUNLEVEL_SHUTDOWN); |
__call_main__(mb); |
return (void *)0; |
} |
void set_shutdown_task() { |
NRT_TASK_MODEL nrt; |
nrt_task_default_model(nrt); |
nrt_task_def_system(nrt); |
shutdown_task_PID = task_create("Shutdown Task",shutdown_task_body,&nrt,NULL); |
if (shutdown_task_PID == NIL) { |
sys_shutdown_message("Error: Cannot create shutdown task\n"); |
exit(1); |
} |
} |
int device_drivers_init() { |
LINUXC26_register_module(); |
PCI26_init(); |
return 0; |
} |
int device_drivers_close() { |
return 0; |
} |
TASK shutdown_task_body(void *arg) { |
device_drivers_close(); |
sys_shutdown_message("-- S.Ha.R.K. Closed --\n"); |
return NULL; |
} |
#define SHUTDOWN_TIMEOUT_SEC 3 |
void call_shutdown_task(void *arg) { |
struct timespec t; |
sys_gettime(&t); |
t.tv_sec += SHUTDOWN_TIMEOUT_SEC; |
kern_event_post(&t,(void *)((void *)sys_abort_shutdown),(void *)0); |
task_activate(shutdown_task_PID); |
} |
/demos/tags/rel_1_5_beta1/base/makefile |
---|
0,0 → 1,92 |
# |
# |
# |
ifndef BASE |
BASE=../.. |
endif |
include $(BASE)/config/config.mk |
PROGS = sig time preempt |
PROGS += aster aster1 aster2 aster3 aster4 aster5 aster6 aster7 aster8 |
PROGS += pcidemo |
PROGS += jointest condtest intsem semdemo pidemo pcdemo srpdemo mdemo |
PROGS += ego fly cabs |
include $(BASE)/config/example.mk |
# Text applications |
time: |
make -f $(SUBMAKE) APP=time INIT= OTHEROBJS="ihello.o" OTHERINCL= SHARKOPT= |
sig: |
make -f $(SUBMAKE) APP=sig INIT= OTHEROBJS="ihello.o" OTHERINCL= SHARKOPT= |
preempt: |
make -f $(SUBMAKE) APP=preempt INIT= OTHEROBJS="initfile.o" OTHERINCL= SHARKOPT="__LINUXC26__ __INPUT__" |
semdemo: |
make -f $(SUBMAKE) APP=semdemo INIT= OTHEROBJS="isemdemo.o" OTHERINCL= SHARKOPT= |
pidemo: |
make -f $(SUBMAKE) APP=pidemo INIT= OTHEROBJS="imdemo.o" OTHERINCL= SHARKOPT= |
pcdemo: |
make -f $(SUBMAKE) APP=pcdemo INIT= OTHEROBJS="imdemo.o" OTHERINCL= SHARKOPT= |
srpdemo: |
make -f $(SUBMAKE) APP=srpdemo INIT= OTHEROBJS="imdemo.o" OTHERINCL= SHARKOPT= |
mdemo: |
make -f $(SUBMAKE) APP=mdemo INIT= OTHEROBJS="imdemo.o" OTHERINCL= SHARKOPT= |
aster: |
make -f $(SUBMAKE) APP=aster INIT= OTHEROBJS="initfile.o" OTHERINCL= SHARKOPT="__LINUXC26__ __INPUT__" |
aster1: |
make -f $(SUBMAKE) APP=aster1 INIT= OTHEROBJS="iaster1.o" OTHERINCL= SHARKOPT= |
aster2: |
make -f $(SUBMAKE) APP=aster2 INIT= OTHEROBJS="iaster1.o" OTHERINCL= SHARKOPT= |
aster3: |
make -f $(SUBMAKE) APP=aster3 INIT= OTHEROBJS="iaster3.o" OTHERINCL= SHARKOPT= |
aster4: |
make -f $(SUBMAKE) APP=aster4 INIT= OTHEROBJS="iaster4.o" OTHERINCL= SHARKOPT="__LINUXC26__ __INPUT__" |
aster5: |
make -f $(SUBMAKE) APP=aster5 INIT= OTHEROBJS="initfile.o" OTHERINCL= SHARKOPT="__LINUXC26__ __INPUT__" |
aster6: |
make -f $(SUBMAKE) APP=aster6 INIT= OTHEROBJS="iaster6.o" OTHERINCL= SHARKOPT="__LINUXC26__ __INPUT__" |
aster7: |
make -f $(SUBMAKE) APP=aster7 INIT= OTHEROBJS="iaster7.o" OTHERINCL= SHARKOPT="__LINUXC26__ __INPUT__" |
aster8: |
make -f $(SUBMAKE) APP=aster8 INIT= OTHEROBJS="iaster8.o" OTHERINCL= SHARKOPT="__LINUXC26__ __INPUT__" |
pcidemo: |
make -f $(SUBMAKE) APP=pcidemo INIT= OTHEROBJS="ipcidemo.o" OTHERINCL= SHARKOPT="__LINUXC26__ __PCI__" |
jointest: |
make -f $(SUBMAKE) APP=jointest INIT= OTHEROBJS="imdemo.o" OTHERINCL= SHARKOPT= |
condtest: |
make -f $(SUBMAKE) APP=condtest INIT= OTHEROBJS="imdemo.o" OTHERINCL= SHARKOPT= |
intsem: |
make -f $(SUBMAKE) APP=intsem INIT= OTHEROBJS="imdemo.o" OTHERINCL= SHARKOPT= |
# Graphical applications |
ego: |
make -f $(SUBMAKE) APP=ego INIT= OTHEROBJS="initgraph.o" OTHERINCL= SHARKOPT="__LINUXC26__ __PCI__ __INPUT__ __FB__" |
fly: |
make -f $(SUBMAKE) APP=fly INIT= OTHEROBJS="initgraph.o" OTHERINCL= SHARKOPT="__LINUXC26__ __PCI__ __INPUT__ __FB__" |
cabs: |
make -f $(SUBMAKE) APP=cabs INIT= OTHEROBJS="initgraph.o" OTHERINCL= SHARKOPT="__LINUXC26__ __PCI__ __INPUT__ __FB__" |
/demos/tags/rel_1_5_beta1/base/jointest.c |
---|
0,0 → 1,214 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Paolo Gai <pj@gandalf.sssup.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/* |
* Copyright (C) 2000 Giorgio Buttazzo, 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 |
* |
* |
* CVS : $Id: jointest.c,v 1.3 2005-01-08 14:31:38 pj Exp $ |
This test verify the correctness of the task_join primitive. (that |
function is the same as pthread_join... someday I will change the |
names...) |
There are 4 taks, J1, J2, J3, are created as joinable, J4 as detached |
The main task: |
Creates J1 and J2, locks m1 (a PI mitex), creates C3. |
at t=0.8 sec it calls a task_join on J3 (that returns EDEADLK), |
it unlocks m1, then it makes task_join on J3 another time. |
Next it creates J4 as detached and finally it does a task_join on J4 |
(that returns EINVAL). |
J1: |
at t=0.2 sec it calls task_join on J2, the it ends. |
J2: |
it simply waits t=0.4 sec and it ends. |
J3: |
First, it calls task_join on J1. |
Then, at t=0.6 sec it locks m1, then unlocks it |
J4: |
it simply waits t=1 sec and it ends. |
*/ |
#include "kernel/kern.h" |
PID j0, j1, j2, j3, j4; |
mutex_t m1; |
TASK J1() |
{ |
int err; |
void *ret; |
cprintf("J1: started, waiting 0.2 sec\n"); |
while (sys_gettime(NULL) < 200000); |
cprintf("J1: 0.2 sec reached, joining J2\n"); |
err = task_join(j2, &ret); |
cprintf("J1: join J2 returns %d error %d, exiting\n", |
(int)ret,err); |
return (void *)11; |
} |
TASK J2() |
{ |
cprintf("J2: started, waiting 0.4 sec\n"); |
while (sys_gettime(NULL) < 400000); |
cprintf("J2: 0.4 sec reached, exiting\n"); |
return (void *)22; |
} |
TASK J3() |
{ |
int err; |
void *ret; |
cprintf("J3: started, joining J1\n"); |
err = task_join(j1, &ret); |
cprintf("J3: join J1 returns %d error %d, waiting 0.6sec\n", (int)ret, err); |
while (sys_gettime(NULL) < 600000); |
cprintf("J1: 0.6 sec reached, locking m1\n"); |
mutex_lock(&m1); |
cprintf("J3: locked m1, unlocking m1\n"); |
mutex_unlock(&m1); |
cprintf("J3: unlocked m1, exiting\n"); |
return (void *)33; |
} |
TASK J4() |
{ |
cprintf("J4: started, waiting 1 sec\n"); |
while (sys_gettime(NULL) < 1000000); |
cprintf("J4: 1 sec reached, exiting\n"); |
return (void *)44; |
} |
int main(int argc, char **argv) |
{ |
NRT_TASK_MODEL m; |
PI_mutexattr_t a; |
int err; |
void *ret; |
struct timespec t; |
j0 = exec_shadow; |
nrt_task_default_model(m); |
nrt_task_def_joinable(m); |
/* --------------------------------------------------------------------- |
Mutex creation |
--------------------------------------------------------------------- */ |
PI_mutexattr_default(a); |
mutex_init(&m1,&a); |
/* --------------------------------------------------------------------- |
Let's go !!!! |
--------------------------------------------------------------------- */ |
cprintf("main: creating J1,J2,J3, locking m1\n"); |
j1 = task_create("J1", J1, &m, NULL); |
if (j1 == NIL) { cprintf("Can't create J1 task...\n"); return 1; } |
task_activate(j1); |
j2 = task_create("J2", J2, &m, NULL); |
if (j2 == NIL) { cprintf("Can't create J2 task...\n"); return 1; } |
task_activate(j2); |
mutex_lock(&m1); |
j3 = task_create("J3", J3, &m, NULL); |
if (j3 == NIL) { cprintf("Can't create J3 task...\n"); return 1; } |
task_activate(j3); |
cprintf("main: waiting t=0.8 sec\n"); |
while (sys_gettime(NULL) < 800000); |
err = task_join(j3, NULL); |
cprintf("main: join J3 error %d, unlocking m1\n",err); |
mutex_unlock(&m1); |
err = task_join(j3, &ret); |
cprintf("main: join J3 returns %d error %d, unlocked m1, creating J4\n", |
(int)ret,err); |
nrt_task_def_unjoinable(m); |
j4 = task_create("J4", J4, &m, NULL); |
if (j4 == NIL) { cprintf("Can't create J4 task...\n"); return 1; } |
task_activate(j4); |
err = task_join(j4,&ret); |
cprintf("main: join J4 returns %d error %d, exiting\n", (int)ret, err); |
do { |
sys_gettime(&t); |
} while (t.tv_sec < 10); |
exit(0); |
return 0; |
} |
/demos/tags/rel_1_5_beta1/base/aster1.c |
---|
0,0 → 1,174 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Paolo Gai <pj@gandalf.sssup.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/* |
* 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 |
* |
* |
* CVS : $Id: aster1.c,v 1.4 2005-01-08 14:31:38 pj Exp $ |
this is a reduced verion of the classic Hartik demo Aster. |
It uses: |
- EDF module |
. periodic tasks |
- an high number of task executing concurrently |
The demo ends after 6 seconds. |
*/ |
/* |
Well, this is only a stupid demo which intend to show many |
HARTIK+ capabilities; the application is structured in the followig |
way: there is an ASTER task wich randomly creates some ASTEROID tasks |
which are displayed into the first window; each task is HARD/PERIODIC |
and auto-kills itself when it reaches the window end! |
Finally a CLOCK task is implemented to test system clock. |
Please note that usually the HARTIK+ application is made up of a task |
group which interacts among them, while the main() function, which |
became a task itself when the kernel is activated, is suspended until |
the system is ready to terminate; the MAIN task can also be used to make |
other background activities, but it should not be killed; when the |
application terminates, the control is passed to MAIN which kills |
everybody, shut down the system and can handle other operations using |
the services available with the previou operating system (I.E. the DOS). |
If you need to manage sudden abort/exception you should install your own |
exception handler and raise it through the exc_raise() primitive to |
make the system abort safely! |
Remember that the exit functions posted through sys_atexit() will be |
executed in both cases, to allow clean system shutdown. |
*/ |
#include "kernel/kern.h" |
int num_aster = 0; |
#define ASTER_LIM 67 |
#define ASTER_MAX 90 |
TASK asteroide(void) |
{ |
int i = 1; |
int y = rand() % 20 + 1; |
while (i < ASTER_LIM) { |
puts_xy(i,y,WHITE,"*"); |
task_endcycle(); |
puts_xy(i,y,WHITE," "); |
i++; |
} |
num_aster--; |
return 0; |
} |
DWORD taskCreated = 0; |
TASK aster(void) |
{ |
PID p; |
HARD_TASK_MODEL m; |
int r; |
hard_task_default_model(m); |
hard_task_def_wcet(m,500); |
srand(7); |
while (1) { |
if (num_aster < ASTER_MAX) { |
r = (rand() % 50) - 25; |
hard_task_def_arg(m,(void *)((rand() % 7)+1)); |
hard_task_def_mit(m, (50+r)*1000); |
p = task_create("aaa",asteroide,&m,NULL); |
taskCreated++; |
task_activate(p); |
num_aster++; |
} |
task_endcycle(); |
} |
} |
TASK clock() |
{ |
int s = 0, m = 0; |
while(1) { |
printf_xy(70,1,WHITE,"%2d : %2d",m,s); |
task_endcycle(); |
if (++s > 59) { |
s = 0; |
m++; |
} |
printf_xy(70,1,WHITE,"%2d : %2d",m,s); |
task_endcycle(); |
} |
} |
int main(int argc, char **argv) |
{ |
PID p1,p2; |
HARD_TASK_MODEL m; |
struct timespec t; |
clear(); |
hard_task_default_model(m); |
hard_task_def_mit(m,10000); |
hard_task_def_wcet(m,2000); |
hard_task_def_group(m,1); |
p1 = task_create("Aster",aster,&m,NULL); |
if (p1 == -1) { |
sys_shutdown_message("Aster.C(main): Could not create task <aster> ..."); |
exit(1); |
} |
hard_task_def_mit(m,500000); |
p2 = task_create("Clock",clock,&m,NULL); |
if (p2 == -1) { |
sys_shutdown_message("Aster.C(main): Could not create task <Clock> ..."); |
exit(1); |
} |
group_activate(1); |
do { |
sys_gettime(&t); |
} while (t.tv_sec < 10); |
exit(0); |
return 0; |
} |
/demos/tags/rel_1_5_beta1/base/time.c |
---|
0,0 → 1,69 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Paolo Gai <pj@gandalf.sssup.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/* |
* 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 |
* |
* |
* CVS : $Id: time.c,v 1.2 2005-01-08 14:31:38 pj Exp $ |
* |
* Timer correctness test |
*/ |
#include "kernel/kern.h" |
#define NT 10 |
int main(int argc, char **argv) |
{ |
struct timespec t[NT]; |
int i; |
cprintf("Timer correctness test (1 second).\n"); |
for (i=0; i<NT; i++) NULL_TIMESPEC(&t[i]); |
do { |
for (i=0; i<NT-1; i++) t[i+1] = t[i]; |
sys_gettime(&t[0]); |
if (TIMESPEC_A_LT_B(&t[0],&t[1])) { |
for (i=0; i<NT; i++) |
cprintf("%d %ld\n",i, t[i].tv_nsec); |
exit(0); |
} |
} while (t[0].tv_sec < 1); |
return 0; |
} |
/demos/tags/rel_1_5_beta1/base/intsem.c |
---|
0,0 → 1,109 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Paolo Gai <pj@gandalf.sssup.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/* |
* Copyright (C) 2000 Giorgio Buttazzo, 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 |
* |
* |
* CVS : $Id: intsem.c,v 1.3 2005-01-08 14:31:38 pj Exp $ |
this test is a simple main() function with one other task. |
This test verify the correctness of the internal_sem functions. |
*/ |
#include "kernel/kern.h" |
#include <kernel/int_sem.h> |
internal_sem_t s; |
TASK pippo(void *a) |
{ |
int i=0; |
struct timespec t; |
do { |
sys_gettime(&t); |
if (i==0 && t.tv_sec == (int)a) { |
i = 1; |
cprintf("before internal_sem_wait %d\n",(int)a); |
internal_sem_wait(&s); |
cprintf("after internal_sem_wait %d\n",(int)a); |
} |
if (i==1 && t.tv_sec == 2+(int)a) { |
i = 2; |
cprintf("before internal_sem_post %d\n",(int)a); |
internal_sem_post(&s); |
cprintf("after internal_sem_post %d\n",(int)a); |
return 0; |
} |
} while (1); |
} |
int main(int argc, char **argv) |
{ |
NRT_TASK_MODEL m; |
PID p2,p3; |
struct timespec t; |
nrt_task_default_model(m); |
nrt_task_def_group(m,1); |
nrt_task_def_arg(m,(void *)1); |
p2 = task_create("pippo1", pippo, &m, NULL); |
if (p2 == NIL) |
{ cprintf("Can't create pippo1 task...\n"); return 1; } |
nrt_task_def_arg(m,(void *)2); |
p3 = task_create("pippo2", pippo, &m, NULL); |
if (p3 == NIL) |
{ cprintf("Can't create pippo2 task...\n"); return 1; } |
internal_sem_init(&s,1); |
group_activate(1); |
do { |
sys_gettime(&t); |
} while (t.tv_sec < 10); |
exit(0); |
return 0; |
} |
/demos/tags/rel_1_5_beta1/base/pcdemo.c |
---|
0,0 → 1,203 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Paolo Gai <pj@gandalf.sssup.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/* |
* 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 |
* |
* |
* CVS : $Id: pcdemo.c,v 1.4 2005-01-08 14:31:38 pj Exp $ |
This test verify the correctness of the PC module. |
The test uses 3 mutexes |
m0 with ceiling 0 |
m1 with ceiling 0 |
m2 with ceiling 1 |
the main task (NRT) creates three tasks. |
J0 with PC priority 0 |
starts at t=1.5 sec and lock m0, unlock m0, then lock and unlock m1 |
J1 with PC priority 1 |
starts at t=0.5 sec and try to lock m2 |
J2 with PC priority 2 |
it starts and locks m2 |
at t=1 sec it locks m1 |
at t=1.5 sec it unlocks m1 |
The example is similar to the scheduling diagram shown at p. 197 of the |
book "Sistemi in tempo Reale", by Giorgio Buttazzo, Pitagora Editrice |
*/ |
#include "kernel/kern.h" |
mutex_t m0,m1,m2; |
void startJ(void *a) |
{ |
task_activate((PID)a); |
} |
TASK j0() |
{ |
cprintf("J0: before locking m0\n"); |
mutex_lock(&m0); |
cprintf("J0: locked m0\n"); |
mutex_unlock(&m0); |
cprintf("J0: unlocked m0, locking m1\n"); |
mutex_lock(&m1); |
cprintf("J0: locked m1\n"); |
mutex_unlock(&m1); |
cprintf("J0: unlocked m1, end task\n"); |
return 0; |
} |
TASK j1() |
{ |
cprintf("J1: before locking m2\n"); |
mutex_lock(&m2); |
cprintf("J1: locked m2\n"); |
mutex_unlock(&m2); |
cprintf("J1: unlocked m2, end task\n"); |
return 0; |
} |
TASK j2() |
{ |
cprintf("J2: before locking m2\n"); |
mutex_lock(&m2); |
cprintf("J2: locked m2, waiting to t=1 sec\n"); |
while (sys_gettime(NULL) < 1000000); |
cprintf("J2: t = 1 sec reached\n"); |
mutex_lock(&m1); |
cprintf("J2: locked m1, waiting to t=2 sec\n"); |
while (sys_gettime(NULL) < 2000000); |
cprintf("J2: t = 2 sec reached\n"); |
mutex_unlock(&m1); |
cprintf("J2: unlocked m1\n"); |
mutex_unlock(&m2); |
cprintf("J2: unlocked m2, end task\n"); |
return 0; |
} |
int main(int argc, char **argv) |
{ |
struct timespec t; |
HARD_TASK_MODEL m; |
PID p0,p1,p2; |
PC_mutexattr_t a; |
PI_mutexattr_t a2; |
PC_RES_MODEL r; |
clear(); |
cprintf("Priority Ceiling demo. It ends after 60 sec\n"); |
/* --------------------------------------------------------------------- |
Task creation |
--------------------------------------------------------------------- */ |
hard_task_default_model(m); |
hard_task_def_mit(m, 1000000); |
hard_task_def_wcet(m, 20000); |
PC_res_default_model(r,0); |
p0 = task_create("J0", j0, &m, &r); |
if (p0 == NIL) |
{ cprintf("Can't create J0 task...\n"); return 1; } |
hard_task_default_model(m); |
hard_task_def_mit(m, 2100000); |
hard_task_def_wcet(m, 20000); |
PC_res_default_model(r,1); |
p1 = task_create("J1", j1, &m, &r); |
if (p1 == NIL) |
{ cprintf("Can't create J1 task...\n"); return 1; } |
hard_task_default_model(m); |
hard_task_def_mit(m, 10000000); |
hard_task_def_wcet(m, 3000000); |
PC_res_default_model(r,2); |
p2 = task_create("J2", j2, &m, &r); |
if (p2 == NIL) |
{ cprintf("Can't create J2 task...\n"); return 1; } |
/* --------------------------------------------------------------------- |
Mutex creation |
--------------------------------------------------------------------- */ |
PI_mutexattr_default(a2); |
PC_mutexattr_default(a,0); |
mutex_init(&m0,(mutexattr_t *)&a); |
mutex_init(&m1,(mutexattr_t *)&a); |
PC_mutexattr_default(a,1); |
mutex_init(&m2,(mutexattr_t *)&a); |
/* --------------------------------------------------------------------- |
Event post |
--------------------------------------------------------------------- */ |
t.tv_sec = 0; |
t.tv_nsec = 500000000; |
kern_cli(); |
kern_event_post(&t,startJ,(void *)p1); |
t.tv_sec = 1; |
kern_event_post(&t,startJ,(void *)p0); |
kern_sti(); |
task_activate(p2); |
do { |
sys_gettime(&t); |
} while (t.tv_sec < 10); |
exit(0); |
return 0; |
} |
/demos/tags/rel_1_5_beta1/base/ego.c |
---|
0,0 → 1,200 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Paolo Gai <pj@gandalf.sssup.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/** |
------------ |
CVS : $Id: ego.c,v 1.7 2005-01-08 14:31:38 pj Exp $ |
File: $File$ |
Revision: $Revision: 1.7 $ |
Last update: $Date: 2005-01-08 14:31:38 $ |
------------ |
**/ |
/* |
* Copyright (C) 2000 Paolo Gai and Giorgio Buttazzo |
* |
* 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 |
* |
*/ |
/****************************************************************/ |
/* PERIODIC PROCESS TEST */ |
/****************************************************************/ |
#include <kernel/kern.h> |
#include <drivers/shark_keyb26.h> |
#include <drivers/shark_fb26.h> |
#define X0 10 |
/* task periods */ |
#define PERIOD_T1 100000 |
#define PERIOD_T2 200000 |
#define PERIOD_T3 300000 |
/* X position of the text printed by each task */ |
int y[3] = {100, 180, 260}; |
/* text printed by each task */ |
char talk[3][50] = { "I am ego1 and I print a character every 100 ms", |
"I am ego2 and I print a character every 200 ms", |
"I am ego3 and I print a character every 300 ms"}; |
/***************************************************************/ |
TASK ego(void *arg) |
{ |
int i = (int)arg; |
int leng; |
char s[2]; |
int x; |
int j = 0; |
/* compute the length of the string to print */ |
leng = 0; |
while (talk[i][leng] != 0) leng++; |
x = X0; |
s[1] = 0; |
task_endcycle(); |
while (1) { |
s[0] = talk[i][j]; |
grx_text(s,x,y[i],rgb16(255,255,255),0); |
x += 8; |
if (++j == leng) { |
j = 0; |
x = X0; |
y[i] += 8; |
if (y[i]>340) y[i]=100; |
} |
task_endcycle(); |
} |
} |
/****************************************************************/ |
/* This function is called when Alt-X is pressed. |
*/ |
void my_end(KEY_EVT* e) |
{ |
exit(0); |
} |
/******************************************************************/ |
/* This function is called when the system exit correctly after Alt-X. |
It exits from the graphic mode and then it prints a small greeting. |
Note that: |
- The function calls grx_exit, so it must be registered using |
RUNLEVEL_BEFORE_EXIT (RUNLEVEL_AFTER_EXIT does not work because |
at that point the kernel is already returned in real mode!!!) |
- When an exception is raised, the exception handler is called. |
Since the exception handler already exits from the graphic mode, |
this funcion has not to be called. For this reason: |
. we registered byebye using the flag NO_AT_ABORT |
. the exception handler exits using exit; in that way byebye is |
NOT called |
*/ |
/****************************** MAIN ******************************/ |
int main(int argc, char **argv) |
{ |
PID pid1, pid2, pid3; |
KEY_EVT emerg; |
HARD_TASK_MODEL m1, m2, m3; |
/* set the keyboard handler to exit correctly */ |
emerg.ascii = 'x'; |
emerg.scan = KEY_X; |
emerg.flag = ALTL_BIT; |
emerg.status = KEY_PRESSED; |
keyb_hook(emerg,my_end,FALSE); |
/* a small banner */ |
grx_text("EGO Test",8,8,rgb16(255,255,255),0); |
grx_text("Press Alt-X to exit",8,16,rgb16(255,255,255),0); |
/* ego1 creation */ |
hard_task_default_model(m1); |
hard_task_def_ctrl_jet (m1); |
hard_task_def_arg (m1, (void *)0); |
hard_task_def_wcet (m1, 5000); |
hard_task_def_mit (m1, PERIOD_T1); |
hard_task_def_group (m1,1); |
pid1 = task_create("ego1", ego, &m1, NULL); |
if (pid1 == NIL) { |
sys_shutdown_message("Could not create task <ego1>"); |
exit(1); |
} |
/* ego2 creation */ |
hard_task_default_model(m2); |
hard_task_def_ctrl_jet (m2); |
hard_task_def_arg (m2, (void *)1); |
hard_task_def_wcet (m2, 5000); |
hard_task_def_mit (m2, PERIOD_T2); |
hard_task_def_group (m2,1); |
pid2 = task_create("ego2", ego, &m2, NULL); |
if (pid2 == NIL) { |
sys_shutdown_message("Could not create task <ego2>"); |
exit(1); |
} |
/* ego3 creation */ |
hard_task_default_model(m3); |
hard_task_def_ctrl_jet (m3); |
hard_task_def_arg (m3, (void *)2); |
hard_task_def_wcet (m3, 5000); |
hard_task_def_mit (m3, PERIOD_T3); |
hard_task_def_group (m3,1); |
pid3 = task_create("ego3", ego, &m3, NULL); |
if (pid3 == NIL) { |
sys_shutdown_message("Could not create task <ego3>"); |
exit(1); |
} |
/* and finally we activate the three threads... */ |
group_activate(1); |
/* |
now the task main ends, but the system does not shutdown because |
there are the three task ego1, ego2, and ego3 running. |
The demo will finish if a Alt-X key is pressed. |
*/ |
return 0; |
} |
/****************************************************************/ |
/demos/tags/rel_1_5_beta1/base/preempt.c |
---|
0,0 → 1,149 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Paolo Gai <pj@gandalf.sssup.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/* |
* 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 |
* |
* |
* CVS : $Id: preempt.c,v 1.4 2005-01-08 14:31:38 pj Exp $ |
CBS test with preemption disabling |
*/ |
#include "kernel/kern.h" |
void *periodic(void *arg) |
{ |
int i; |
int y = (int)arg; |
for (i = 19; i < 60; i++) { |
puts_xy(i,y,7,"*"); |
task_endcycle(); |
} |
cprintf("Periodic: Task %d end.\n", exec_shadow); |
return 0; |
} |
void *blocker(void *arg) |
{ |
struct timespec t; |
task_nopreempt(); |
cprintf("Blocker: Task nopreempt\n"); |
do { |
sys_gettime(&t); |
} while (t.tv_sec < 5); |
cprintf("Blocker: Task preempt\n"); |
task_preempt(); |
cprintf("Blocker: end\n"); |
return 0; |
} |
int main(int argc, char **argv) |
{ |
struct timespec t; |
NRT_TASK_MODEL m; |
SOFT_TASK_MODEL m_aper; |
PID p; |
clear(); |
cprintf("Preemption Test.\n"); |
cprintf("Start time: two periodic tasks and a blocker are created and activated.\n"); |
cprintf("2 seconds : blocker calls task_nopreempt.\n"); |
cprintf("5 seconds : task_preempt is called.\n"); |
cprintf(" The blocked task exec its pending activations.\n"); |
cprintf("10 seconds: the test stops.\n"); |
puts_xy(1,20,7,"save task:"); |
puts_xy(1,21,7,"skip task:"); |
nrt_task_default_model(m); |
soft_task_default_model(m_aper); |
soft_task_def_met(m_aper,10000); |
soft_task_def_period(m_aper,200000); |
soft_task_def_group(m_aper,1); |
soft_task_def_arg(m_aper, (void *)20); |
soft_task_def_periodic(m_aper); |
p = task_create("save", periodic, &m_aper, NULL); |
if (p == NIL) |
{ |
sys_shutdown_message("Can't create save task...\n"); |
exit(1); |
} |
soft_task_def_skip_arrivals(m_aper); |
soft_task_def_arg(m_aper, (void *)21); |
p = task_create("skip", periodic, &m_aper, NULL); |
if (p == NIL) |
{ |
sys_shutdown_message("Can't create skip task...\n"); |
exit(1); |
} |
p = task_create("blocker", blocker, &m, NULL); |
if (p == NIL) |
{ |
sys_shutdown_message("Can't create blocker task...\n"); |
exit(1); |
} |
cprintf("main : save & skip tasks activated.\n"); |
group_activate(1); |
do { |
sys_gettime(&t); |
} while (t.tv_sec < 2); |
cprintf("main : blocker activated.\n"); |
task_activate(p); |
do { |
sys_gettime(&t); |
} while (t.tv_sec < 10); |
cprintf("main : End!!!\n"); |
return 0; |
} |
/demos/tags/rel_1_5_beta1/base/pidemo.c |
---|
0,0 → 1,123 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Paolo Gai <pj@gandalf.sssup.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/* |
* 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 |
* |
* |
* CVS : $Id: pidemo.c,v 1.4 2005-01-08 14:31:38 pj Exp $ |
This test verify the correctness of the PI module. |
the main task (NRT) lock a PI mutex. |
then 2 tasks arrives, with priority higher than the main |
the first try to lock the mutex, but it can't, so the main inherit |
his priority. The second simply prints a string. |
If all works, the string of the second task is printed after the end of |
the first task. |
*/ |
#include "kernel/kern.h" |
mutex_t m1; |
TASK goofy1(void *a) |
{ |
cprintf("goofy1 before mutex_lock\n"); |
mutex_lock(&m1); |
cprintf("goofy1 after mutex_lock\n"); |
mutex_unlock(&m1); |
cprintf("goofy1 after mutex_unlock\n"); |
return 0; |
} |
TASK goofy2() |
{ |
cprintf("goofy2 inside goofy2\n"); |
return 0; |
} |
int main(int argc, char **argv) |
{ |
HARD_TASK_MODEL m; |
PID p2,p3; |
struct timespec t; |
PI_mutexattr_t a; |
hard_task_default_model(m); |
hard_task_def_mit(m,50000); |
hard_task_def_wcet(m,20000); |
hard_task_def_group(m,1); |
hard_task_def_arg(m,(void *)1); |
p2 = task_create("goofy1", goofy1, &m, NULL); |
if (p2 == NIL) |
{ cprintf("Can't create goofy1 task...\n"); return 1; } |
hard_task_def_mit(m,100000); |
p3 = task_create("goofy2", goofy2, &m, NULL); |
if (p3 == NIL) |
{ cprintf("Can't create goofy2 task...\n"); return 1; } |
PI_mutexattr_default(a); |
mutex_init(&m1,&a); |
cprintf("main before mutex_lock\n"); |
mutex_lock(&m1); |
cprintf("main after mutex_lock\n"); |
group_activate(1); |
cprintf("main after group_activate\n"); |
mutex_unlock(&m1); |
cprintf("main after mutex_unlock\n"); |
mutex_destroy(&m1); |
cprintf("main after mutex_destroy\n"); |
do { |
sys_gettime(&t); |
} while (t.tv_sec < 10); |
exit(0); |
return 0; |
} |
/demos/tags/rel_1_5_beta1/base/sig.c |
---|
0,0 → 1,167 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Paolo Gai <pj@gandalf.sssup.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/** |
------------ |
CVS : $Id: sig.c,v 1.4 2005-01-08 14:31:38 pj Exp $ |
File: $File$ |
Revision: $Revision: 1.4 $ |
Last update: $Date: 2005-01-08 14:31:38 $ |
------------ |
**/ |
/* |
* Copyright (C) 2000 Paolo Gai and Giorgio Buttazzo |
* |
* 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 |
* |
*/ |
/* |
Test Number 5: |
this test is a simple main() function with one other task |
This test can be useful to test functions like: |
sys_gettime |
sigemptyset |
sigaddset |
hartik_deliver_pending_signals |
task_sigmask |
sigaction |
sigqueue |
task_signal |
*/ |
#include "kernel/kern.h" |
TASK goofy(void *arg) |
{ |
struct timespec t; |
cprintf("Goofy: waiting 2 secs...\n"); |
do { |
sys_gettime(&t); |
} while (t.tv_sec < 2); // wait until 2 sec |
cprintf("Goofy: ok, I'm ready :-)\n"); |
return 0; |
} |
void catchit_RT(int signo, siginfo_t *info, void *extra) |
{ |
cprintf("RT signal: Current Running Task = %d signo=%d code=%d value=%d from pid=%d\n", |
exec_shadow, |
info->si_signo, info->si_code, |
info->si_value.sival_int, info->si_task); |
} |
void catchit(int signo) |
{ |
cprintf("RT signal: Current Running Task = %d signo=%d\n", |
exec_shadow, signo); |
} |
int main(int argc, char **argv) |
{ |
struct timespec t; |
NRT_TASK_MODEL m; |
PID p2; |
sigset_t newmask; |
sigset_t oldmask; |
struct sigaction action; |
union sigval sval; |
clear(); |
/* Set the signal action */ |
action.sa_flags = SA_SIGINFO; |
action.sa_sigaction = catchit_RT; |
action.sa_handler = 0; |
action.sa_mask = 0; |
if (sigaction(SIGUSR1, &action, NULL) == -1) { |
perror("Error using sigaction."); |
return -1; |
} |
action.sa_flags = 0; |
action.sa_handler = (void (*)(int))catchit; |
if (sigaction(SIGILL, &action, NULL) == -1) { |
perror("Error using sigaction."); |
return -1; |
} |
/* create another task */ |
nrt_task_default_model(m); |
nrt_task_def_group(m,1); |
p2 = task_create("goofy", goofy, &m, NULL); |
if (p2 == NIL) |
{ |
cprintf("Can't create goofy task...\n"); |
return 1; |
} |
group_activate(1); |
/* block the signal for the main task */ |
sigemptyset(&newmask); |
sigaddset(&newmask,SIGUSR1); |
task_sigmask(SIG_BLOCK, &newmask, &oldmask); // pthread_sigmask |
cprintf("main: Sending 2 signals ...\n"); |
sval.sival_int = 123; |
sigqueue(0,SIGUSR1,sval); |
sval.sival_int = 999; |
sigqueue(0,SIGUSR1,sval); |
cprintf("main: Now sending a signal to myself," |
" then wait until 4 secs...\n"); |
task_signal(0 /* main */, SIGILL); // pthread_kill |
NULL_TIMESPEC(&t); |
do { |
sys_gettime(&t); |
} while (t.tv_sec < 4); // wait until 4 s |
cprintf("main: ending...\n"); |
return 0; |
} |
/demos/tags/rel_1_5_beta1/base/condtest.c |
---|
0,0 → 1,209 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Paolo Gai <pj@gandalf.sssup.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/* |
* Copyright (C) 2000 Giorgio Buttazzo, 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 |
* |
* |
* CVS : $Id: condtest.c,v 1.3 2005-01-08 14:31:38 pj Exp $ |
This test verify the correctness of the condition variables. |
(... it doesn't test all...) |
The test uses 1 mutex |
the main task (NRT) creates three tasks. |
J0, J1, J3 |
starts, lock the mutex, and wait on a condition variable |
J2 |
at t = 0.5 lock the mutex and call cond_signal |
at t = 1 lock the mutex and call cond_signal |
*/ |
#include "kernel/kern.h" |
mutex_t m0; |
cond_t c0; |
int number = 0; |
PID p0,p1,p2,p3; |
TASK j0() |
{ |
cprintf("J0: before locking m0\n"); |
mutex_lock(&m0); |
cprintf("J0: locked m0, waiting on c0, number =%d\n", number); |
while (!number) { |
cond_wait(&c0,&m0); |
cprintf("J0: number = %d, if >0 unlocking m0\n",number); |
} |
number--; |
mutex_unlock(&m0); |
cprintf("J0: unlocked m0, end task\n"); |
return 0; |
} |
TASK j1() |
{ |
cprintf("J1: before locking m0\n"); |
mutex_lock(&m0); |
cprintf("J1: locked m0, waiting on c0, number =%d\n", number); |
while (!number) { |
cond_wait(&c0,&m0); |
cprintf("J1: number = %d, if >0 unlocking m0\n",number); |
} |
number--; |
mutex_unlock(&m0); |
cprintf("J1: unlocked m0, end task\n"); |
return 0; |
} |
TASK j2() |
{ |
cprintf("J2: started, waiting t=0.5 sec\n"); |
while (sys_gettime(NULL) < 500000); |
cprintf("J2: before locking m0\n"); |
mutex_lock(&m0); |
cprintf("J2: locked m0, number++ (was %d), cond_signal\n", number); |
number++; |
cond_signal(&c0); |
cprintf("J2: unlocking m0\n"); |
mutex_unlock(&m0); |
cprintf("J2: waiting t=1 sec\n"); |
while (sys_gettime(NULL) < 1000000); |
cprintf("J2: Killing J3\n"); |
task_kill(p3); |
cprintf("J2: before locking m0\n"); |
mutex_lock(&m0); |
cprintf("J2: locked m0, number++ (was %d), cond_signal\n", number); |
number++; |
cond_signal(&c0); |
cprintf("J2: unlocking m0\n"); |
mutex_unlock(&m0); |
cprintf("J2: unlocked m0, end task\n"); |
return 0; |
} |
void cleanup_lock(void *arg) |
{ |
cprintf("J3: KILL!!!\n"); |
mutex_unlock(&m0); |
cprintf("J3: unlocked m0 by the cleanup function\n"); |
} |
TASK j3() |
{ |
cprintf("J3: before locking m0\n"); |
mutex_lock(&m0); |
cprintf("J3: locked m0, waiting on c0, number =%d\n", number); |
task_cleanup_push(cleanup_lock, (void *)&m0); |
while (!number) { |
cond_wait(&c0,&m0); |
cprintf("J3: number = %d, if >0 unlocking m0\n",number); |
} |
task_cleanup_pop(0); |
// I hope this task never reach this point... it is killed by J2!!! |
number--; |
mutex_unlock(&m0); |
cprintf("J3: unlocked m0, end task\n"); |
return 0; |
} |
int main(int argc, char **argv) |
{ |
struct timespec t; |
NRT_TASK_MODEL m; |
PI_mutexattr_t a; |
/* --------------------------------------------------------------------- |
Task creation |
--------------------------------------------------------------------- */ |
nrt_task_default_model(m); |
nrt_task_def_group(m,1); |
p0 = task_create("J0", j0, &m, NULL); |
if (p0 == NIL) |
{ cprintf("Can't create J0 task...\n"); return 1; } |
p1 = task_create("J1", j1, &m, NULL); |
if (p1 == NIL) |
{ cprintf("Can't create J1 task...\n"); return 1; } |
p2 = task_create("J2", j2, &m, NULL); |
if (p2 == NIL) |
{ cprintf("Can't create J2 task...\n"); return 1; } |
p3 = task_create("J3", j3, &m, NULL); |
if (p3 == NIL) |
{ cprintf("Can't create J3 task...\n"); return 1; } |
/* --------------------------------------------------------------------- |
Mutex creation |
--------------------------------------------------------------------- */ |
PI_mutexattr_default(a); |
mutex_init(&m0,&a); |
cond_init(&c0); |
/* --------------------------------------------------------------------- |
Event post |
--------------------------------------------------------------------- */ |
group_activate(1); |
do { |
sys_gettime(&t); |
} while (t.tv_sec < 10); |
exit(1); |
return 0; |
} |
/demos/tags/rel_1_5_beta1/base/semdemo.c |
---|
0,0 → 1,105 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Paolo Gai <pj@gandalf.sssup.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/* |
* 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 |
* |
* |
* CVS : $Id: semdemo.c,v 1.3 2005-01-08 14:31:38 pj Exp $ |
This is a really simple semaphore demo. |
*/ |
#include "kernel/kern.h" |
#include "semaphore.h" |
sem_t s; |
void *goofy(void *a) |
{ |
struct timespec t; |
char *n = proc_table[exec_shadow].name; |
cprintf("Task %s: Locking semaphore...\n", n); |
sem_wait(&s); |
cprintf("Task %s: Semaphore locked...\n", n); |
do { |
sys_gettime(&t); |
} while (t.tv_sec < (int)a); |
cprintf("Task %s: Unlocking semaphore...\n", n); |
sem_post(&s); |
cprintf("Task %s: Semaphore unlocked...\n", n); |
return 0; |
} |
int main(int argc, char **argv) |
{ |
NRT_TASK_MODEL m; |
PID p2,p3; |
struct timespec t; |
nrt_task_default_model(m); |
nrt_task_def_group(m,1); |
nrt_task_def_arg(m,(void *)1); |
p2 = task_create("goofy1", goofy, &m, NULL); |
if (p2 == NIL) |
{ cprintf("Can't create goofy1 task...\n"); return 1; } |
nrt_task_def_arg(m,(void *)2); |
p3 = task_create("goofy2", goofy, &m, NULL); |
if (p3 == NIL) |
{ cprintf("Can't create goofy2 task...\n"); return 1; } |
cprintf("Initializing semaphore...\n"); |
sem_init(&s,0,1); |
group_activate(1); |
do { |
sys_gettime(&t); |
} while (t.tv_sec < 10); |
exit(0); |
return 0; |
} |
/demos/tags/rel_1_5_beta1/base/pcidemo.c |
---|
0,0 → 1,45 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/* |
* |
* 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 "unistd.h" |
int main (int argc, char *argv[]) |
{ |
cprintf("Init Done...\n"); |
sleep(5); |
return 0; |
} |
/demos/tags/rel_1_5_beta1/base/readme |
---|
0,0 → 1,44 |
This directory contains a set of simple examples, useful to understand |
How to make a Shark application. |
Text mode demos: |
- hello.c --> a hello world application |
- timer.c --> tests if the time reads are always increasing |
(useful for debugging purposes) |
- sig.c --> simple example that sends signals |
- semdemo.c --> simple example that uses a semaphore for mutual exclusion |
- pidemo.c --> simple example that uses PI mutexes between NRT and Hard tasks |
- pcdemo.c --> simple example that uses PC mutexes between NRT and Hard tasks |
- srpdemo.c --> simple example that uses SRP mutexes between NRT and Hard tasks |
- mdemo.c --> simple example that uses a mutex, initialized with whatever |
protocol you want ;-) |
- aster.c --> Wow! the original Hartik ASTER demo!!! (EDF, CABs, ...) |
- aster1.c --> a -lot- of periodic tasks that are created and then die |
(6 seconds demo) |
- aster2.c --> a simple stress test: a lot of tasks are created until Utot=1; |
uses jet functions to dump statistics. (60 seconds demo) |
- aster3.c --> aster2 + 8 tasks handled by 2 different TBS servers |
- aster4.c --> aster3 + CBS tasks + Shutdown demo with system tasks |
- aster5.c --> aster3 + only CBS tasks + mutexes... Really interesting! |
- aster6.c --> aster5 + Polling Server to serve the JetCtrl task |
- aster7.c --> another aster clone with Rate monotonic and Polling server |
- aster8.c --> aster5 + Sporadic Server |
- preempt.c --> simple test for CBS, task_preempt, task_nopreempt, and |
save/skip arrivals |
- pcidemo.c --> PCI Bus scan |
- jointest.c--> Simple test that uses the task_join primitive |
- condtest.c--> Simple test that uses condition variables |
- intsem.c --> Simple test that uses internal semaphores |
Graphical demos: |
- fly.c --> Random flies going around the screen |
- ego.c --> Periodic tasks that writes a phrease on the screen |
- cabs.c --> Example that uses cabs |
Note on the init files: |
- ihello.c (RR+dummy) |
- isemdemo.c (iaster1+Semaphores) |
- iaster1.c (EDF+RR+dummy) |
- iaster3.c (EDF+RR+TBS(0.1)+TBS(0.3)+dummy) |
- iaster4.c (iaster3+CBS) |
- initfile.c (EDF+CBS+RR+dummy, SEMaphores, CABS, HARTPORTs and Keyboard) |
/demos/tags/rel_1_5_beta1/base/hello.c |
---|
0,0 → 1,53 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Paolo Gai <pj@gandalf.sssup.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/* |
* 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 |
*/ |
/* |
CVS : $Id: hello.c,v 1.1 2002-10-28 08:13:37 pj Exp $ |
hello.c: |
This test is a simple hello world function. |
*/ |
#include "kernel/kern.h" |
int main(int argc, char **argv) |
{ |
cprintf("Hello, world!\n"); |
return 0; |
} |
/demos/tags/rel_1_5_beta1/readme.txt |
---|
0,0 → 1,7 |
Hi, these are the S.Ha.R.K. demos... |
the old examples directory is now called demos/oldexamples... |
Enjoy |
PJ |
/demos/tags/rel_1_5_beta1/dosfs/initfile.c |
---|
0,0 → 1,91 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Paolo Gai <pj@gandalf.sssup.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/** |
------------ |
CVS : $Id: initfile.c,v 1.2 2005-02-25 11:10:46 pj Exp $ |
File: $File$ |
Revision: $Revision: 1.2 $ |
Last update: $Date: 2005-02-25 11:10:46 $ |
------------ |
**/ |
/* |
* Copyright (C) 2000 Paolo Gai and Gabriele Bolognini |
* |
* 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 "rr/rr/rr.h" |
#include "dummy/dummy/dummy.h" |
/*+ sysyem tick in us +*/ |
#define TICK 0 |
/*+ RR tick in us +*/ |
#define RRTICK 10000 |
void read_myfile(void); |
TIME __kernel_register_levels__(void *arg) |
{ |
struct multiboot_info *mb = (struct multiboot_info *)arg; |
RR_register_level(RRTICK, RR_MAIN_YES, mb); |
dummy_register_level(); |
/* If you need to interact with the DOS Filesystem and you use |
the X eXtender, this is the better place where you can use |
the DOS_fXXX functions... |
WARNING: You can call these functions only when you are in |
real mode!!! |
The system is in real mode: |
- into __kernel_register_levels__() |
- into sys_atrunlevel functions posted with RUNLEVEL_AFTER_EXIT |
*/ |
read_myfile(); |
return TICK; |
} |
TASK __init__(void *arg) |
{ |
struct multiboot_info *mb = (struct multiboot_info *)arg; |
__call_main__(mb); |
return (void *)0; |
} |
/demos/tags/rel_1_5_beta1/dosfs/makefile |
---|
0,0 → 1,16 |
# |
# |
# |
ifndef BASE |
BASE=../.. |
endif |
include $(BASE)/config/config.mk |
PROGS= dosfs |
include $(BASE)/config/example.mk |
dosfs: |
make -f $(SUBMAKE) APP=dosfs INIT= OTHEROBJS="initfile.o" OTHERINCL= SHARKOPT= |
/demos/tags/rel_1_5_beta1/dosfs/dosfs.c |
---|
0,0 → 1,174 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Paolo Gai <pj@gandalf.sssup.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/** |
------------ |
CVS : $Id: dosfs.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $ |
File: $File$ |
Revision: $Revision: 1.1.1.1 $ |
Last update: $Date: 2002-09-02 09:37:41 $ |
------------ |
**/ |
/* |
* Copyright (C) 2000 Paolo Gai and Gabriele Bolognini |
* |
* 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 "string.h" |
#include "ll/i386/x-dos.h" |
/* This is the buffer used by read_myfile */ |
char myfilebuf[1000]; |
/* This is the number of bytes read by read_myfile */ |
int myfilebuf_length; |
/* This function write myfile.out (up to 30 chars) */ |
void write_myfile(void *arg); |
int main(int argc, char **argv) |
{ |
int x; |
cprintf("\nBuffer contents:\n"); |
for (x=0; x<myfilebuf_length; x++) |
cputc(myfilebuf[x]); |
/* |
WARNING: You can call these functions only when you are in |
real mode!!! |
The system is in real mode: |
- into __kernel_register_levels__() |
- into sys_atrunlevel functions posted with RUNLEVEL_AFTER_EXIT |
*/ |
if (myfilebuf_length) |
sys_atrunlevel(write_myfile, NULL, RUNLEVEL_AFTER_EXIT); |
return 0; |
/* |
* Since there is only one user task, the kernel will shut down after this |
* task finishes... |
*/ |
} |
/* This function read myfile.txt (up to 1000 chars) */ |
void read_myfile(void) |
{ |
/* DOS file descriptor */ |
DOS_FILE *f; |
/* Error code */ |
int err; |
/* open the DOS file for reading (you can specify only "r" or "w") */ |
f = DOS_fopen("myfile.txt","r"); |
/* check for open errors */ |
if (!f) { |
/* error!! */ |
err = DOS_error(); |
/* note that if you call DOS_error() here, it return 0!!! */ |
cprintf("Error %d opening myfile.txt...\n", err); |
myfilebuf_length = 0; |
return; |
} |
/* read up to 1000 chars */ |
myfilebuf_length = DOS_fread(&myfilebuf,1,1000,f); |
/* check for errors */ |
err = DOS_error(); |
cprintf("Read %d bytes from myfile.txt...\n", myfilebuf_length); |
if (err) { |
cprintf("Error %d reading myfile.txt...\n", err); |
myfilebuf_length = 0; |
/* there is not return because I want to close the file! */ |
} |
/* Close the file */ |
DOS_fclose(f); |
} |
/* This function write myfile.out (up to 30 chars) */ |
void write_myfile(void *arg) |
{ |
DOS_FILE *f; /* DOS file descriptor */ |
int err; /* Error code */ |
int maxbytes; |
int writtenbytes; /* number of files written */ |
/* open the DOS file for writing (you can specify only "r" or "w") */ |
f = DOS_fopen("myfile.out","w"); |
/* check for open errors */ |
if (!f) { |
/* error!! */ |
err = DOS_error(); |
/* note that if you call DOS_error() here, it return 0!!! */ |
cprintf("Error %d opening myfile.out...\n", err); |
return; |
} |
/* write up to 30 bytes */ |
if (myfilebuf_length > 30) |
maxbytes = 30; |
else |
maxbytes = myfilebuf_length; |
writtenbytes = DOS_fwrite(myfilebuf,1,maxbytes,f); |
/* check for errors */ |
err = DOS_error(); |
cprintf("Written %d bytes into myfile.out...\n", writtenbytes); |
if (err) { |
cprintf("Error %d writing myfile.txt...\n", err); |
/* there is not return because I want to close the file! */ |
} |
/* Close the file */ |
DOS_fclose(f); |
} |
/demos/tags/rel_1_5_beta1/dosfs/myfile.txt |
---|
0,0 → 1,3 |
0.2.4.6.8.0.2.4.6.8.0.2.4.6.8.0.2.4.6.8. |
This is the myfile.txt file... |
/demos/tags/rel_1_5_beta1/dosfs/readme.txt |
---|
0,0 → 1,46 |
-------------------------------------- |
DOS_fXXX Demo |
by |
Paolo Gai pj@sssup.it |
and |
Gabriele Bolognini gabrieleb@sssup.it |
2001 |
-------------------------------------- |
The DOS_fXXX functions provided into ll/i386/x-dos.h are a few |
shortcuts that can be used to call INT21's DOS calls. |
These functions can be used to read and write files before/after |
the kernel goes into i386 protected mode. |
THEY CANNOT BE USED IF YOU BOOT WITH GRUB. |
-------------------------------------- |
The demo is composed by: |
MAKEFILE The makefile used to compile the application; |
dosfs is the rule to compile the application |
README.TXT This file |
INITFILE.C The init file (only RR) |
DOSFS.C The DOS_fread and DOS_fwrite demo |
-------------------------------------- |
The demo works as follows: |
- Into __kernel_register_levels__() the demo reads up to 1000 bytes from |
myfile.txt |
- Then, into the main() function it prints the contents of the buffer at |
screen |
- Finally, at the end of the system it writes a file called myfile.out |
with up to 30 of the first bytes of the buffer |
The demo should work on any processor speed, and does not use keyboard or |
graphics. |
Bug: at the moment (01 Jun 2001) sometimes the demo hangs when using |
the one-shot timer. |
/demos/tags/rel_1_5_beta1/first/test.c |
---|
0,0 → 1,327 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Giacomo Guidi <giacomo@gandalf.sssup.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/* |
* Copyright (C) 2002 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 "edf/edf/edf.h" |
#include "cbs/cbs/cbs.h" |
#include "pthread.h" |
#include "posix/posix/posix.h" |
#include "fsf.h" |
#include "fsf_server.h" |
#include "dummy/dummy/dummy.h" |
#include "sem/sem/sem.h" |
#include "pi/pi/pi.h" |
#include "pc/pc/pc.h" |
#include "hartport/hartport/hartport.h" |
#include "cabs/cabs/cabs.h" |
#include "drivers/keyb.h" |
#include <stdlib.h> |
// -------------------------------------------------- |
// -------------------------------------------------- |
// Init Part |
// -------------------------------------------------- |
// -------------------------------------------------- |
/*+ sysyem tick in us +*/ |
#define TICK 0 |
/*+ RR tick in us +*/ |
#define RRTICK 10000 |
int grubstar_level; |
int posix_level; |
//fsf_shared_object_t obj; |
//fsf_shared_operation_t op; |
TIME __kernel_register_levels__(void *arg) |
{ |
struct multiboot_info *mb = (struct multiboot_info *)arg; |
EDF_register_level(EDF_ENABLE_ALL); |
posix_level=POSIX_register_level(RRTICK, 1, mb, 32); |
grubstar_level = GRUBSTAR_register_level(5, 0); |
FSF_register_module(posix_level,grubstar_level, (int)(MAX_BANDWIDTH * 0.9)); |
dummy_register_level(); |
// for the keyboard... |
CBS_register_level(CBS_ENABLE_ALL, 0); |
PI_register_module(); |
PC_register_module(); |
SEM_register_module(); |
PTHREAD_register_module(1, 0, 1); |
return TICK; |
} |
TASK __init__(void *arg) |
{ |
struct multiboot_info *mb = (struct multiboot_info *)arg; |
HARTPORT_init(); |
KEYB_init(NULL); |
__call_main__(mb); |
return (void *)0; |
} |
// -------------------------------------------------- |
// -------------------------------------------------- |
// The Test |
// -------------------------------------------------- |
// -------------------------------------------------- |
pthread_t jposix = -1; |
pthread_t j1 = -1; |
pthread_t j2 = -1; |
fsf_server_id_t server1 = -1; |
fsf_server_id_t server2 = -1; |
fsf_contract_parameters_t contract; |
void *star(void *arg) |
{ |
struct timespec actual,end; |
int actpersecond,act; |
int cycle,rec; |
act = 0; |
actpersecond = 0; |
cycle = 0; |
rec = 0; |
for (;;) { |
cycle++; |
kern_gettime(&actual); |
rec = SERVER_get_last_reclaiming(grubstar_level,exec_shadow); |
if (act == 0) { |
TIMESPEC_ASSIGN(&end,&actual); |
end.tv_sec++; |
} |
if (TIMESPEC_A_LT_B(&actual,&end)) { |
act++; |
} else { |
actpersecond = act; |
act = 0; |
} |
//pthread_mutex_lock(&mux); |
printf_xy(0,exec_shadow,WHITE,"Thread %3d Act_per_Second = %8d cycle = %8d rec = %8d", |
exec_shadow,actpersecond,cycle,rec); |
//pthread_mutex_unlock(&mux); |
} |
return NULL; |
} |
void *periodic_star(void *arg) |
{ |
struct timespec actual,end; |
int actpersecond,act; |
int cycle,rec; |
act = 0; |
actpersecond = 0; |
cycle = 0; |
rec = 0; |
for (;;) { |
cycle++; |
kern_gettime(&actual); |
rec = SERVER_get_last_reclaiming(grubstar_level,exec_shadow); |
if (act == 0) { |
TIMESPEC_ASSIGN(&end,&actual); |
end.tv_sec++; |
} |
if (TIMESPEC_A_LT_B(&actual,&end)) { |
act++; |
} else { |
actpersecond = act; |
act = 0; |
} |
//fsf_lock_object(&op); |
printf_xy(0,exec_shadow,RED,"Thread %3d Act_per_Second = %8d cycle = %8d rec = %8d", |
exec_shadow,actpersecond,cycle,rec); |
//fsf_unlock_object(&op); |
task_endcycle(); |
} |
return NULL; |
} |
int keyinc = 5; |
void *edftask(void *arg) |
{ |
long long j; |
while(1) { |
for (j=0; j<10000*keyinc; j++); |
task_endcycle(); |
} |
return NULL; |
} |
void create() |
{ |
struct timespec period1 = {0,90000000}; //30% |
struct timespec period2 = {0,75000000}; //80% |
struct timespec budget1 = {0,30000000}; |
struct timespec budget2 = {0,60000000}; |
FSF_start_service_task(); |
kern_printf("(Start Create)"); |
fsf_initialize_contract(&contract); |
fsf_set_contract_basic_parameters(&contract,&budget1,&period1,FSF_DEFAULT_WORKLOAD); |
fsf_set_contract_scheduling_policy(&contract, FSF_EDF); |
fsf_set_contract_reclamation_parameters(&contract,&budget2, &period2, FSF_DEFAULT_GRANULARITY, NULL, 1, 0); |
fsf_negotiate_contract(&contract,&server1); |
fsf_set_contract_basic_parameters(&contract,&budget1,&period1,FSF_DEFAULT_WORKLOAD); |
fsf_set_contract_scheduling_policy(&contract, FSF_EDF); |
fsf_set_contract_reclamation_parameters(&contract,&budget2, &period2,FSF_DEFAULT_GRANULARITY, NULL, 1, 1); |
fsf_negotiate_contract(&contract,&server2); |
kern_printf("(End Create)"); |
} |
void renegotiate(void) { |
struct timespec period2 = {0,75000000}; |
struct timespec budget2 = {0,60000000}; |
struct timespec budget1 = {0,60000000}; |
union sigval sval; |
for (;;) { |
fsf_set_contract_basic_parameters(&contract,&budget2,&period2,FSF_DEFAULT_WORKLOAD); |
fsf_set_contract_reclamation_parameters(&contract,&budget1, &period2,FSF_DEFAULT_GRANULARITY, NULL, 20, 0); |
//fsf_request_contract_renegotiation(&contract,server2, 0, sval); |
fsf_renegotiate_contract(&contract, server2); |
budget2.tv_nsec -=60000; |
task_endcycle(); |
} |
} |
int main(int argc, char **argv) |
{ |
int err; |
HARD_TASK_MODEL ht; |
struct timespec endtimer; |
//fsf_init_shared_object(&obj,1); |
//op.op_id=1; |
//op.wcet.tv_sec=0; |
//op.wcet.tv_nsec=100000; |
//fsf_declare_shared_object_operation(&obj, &op); |
srand(kern_gettime(NULL)); |
create(); |
kern_gettime(&endtimer); |
endtimer.tv_sec += 20; |
kern_event_post(&endtimer, (void (*)(void *))(exit), NULL); |
hard_task_default_model(ht); |
hard_task_def_mit(ht,200000); |
hard_task_def_wcet(ht,5000); |
err = fsf_create_thread(server1,&j1,NULL,periodic_star,NULL,&ht); |
kern_printf("(%d)",err); |
task_activate(j1); |
hard_task_default_model(ht); |
hard_task_def_mit(ht,1000000); |
hard_task_def_wcet(ht,50000); |
err = fsf_create_thread(server1,&j1,NULL,renegotiate,NULL,&ht); |
kern_printf("(%d)",err); |
task_activate(j1); |
hard_task_default_model(ht); |
hard_task_def_mit(ht,159000); |
hard_task_def_wcet(ht,5000); |
err = fsf_create_thread(server2,&j2,NULL,periodic_star,NULL,&ht); |
kern_printf("(%d)",err); |
task_activate(j2); |
hard_task_default_model(ht); |
hard_task_def_mit(ht,159000); |
hard_task_def_wcet(ht,5000); |
err = fsf_create_thread(server2,&j2,NULL,periodic_star,NULL,&ht); |
kern_printf("(%d)",err); |
task_activate(j2); |
return 0; |
} |
/demos/tags/rel_1_5_beta1/first/makefile |
---|
0,0 → 1,24 |
# |
# |
BASE=../.. |
include $(BASE)/config/config.mk |
PROGS= test test1 test2 |
MPEG2 = ./mpeg2/getbits.o ./mpeg2/getblk.o ./mpeg2/gethdr.o ./mpeg2/getpic.o\ |
./mpeg2/getvlc.o ./mpeg2/idct.o ./mpeg2/idctref.o ./mpeg2/motion.o\ |
./mpeg2/mpeg2dec.o ./mpeg2/recon.o ./mpeg2/spatscal.o ./mpeg2/store.o\ |
./mpeg2/subspic.o ./mpeg2/systems.o ./mpeg2/verify.o ./mpeg2/gvideo.o |
include $(BASE)/config/example.mk |
#test: |
# make -f $(SUBMAKE) APP=test INIT= OTHEROBJS= OTHERINCL= SHARKOPT="__OLDCHAR__ __FIRST__ __NEW_TRACER__" |
test1: |
make -f $(SUBMAKE) APP=test1 INIT= OTHEROBJS= OTHERINCL= SHARKOPT="__OLDCHAR__ __FIRST__ __NEW_TRACER__" |
test2: |
make -f $(SUBMAKE) APP=test2 INIT= OTHEROBJS="initfile.o $(MPEG2)" OTHERINCL= SHARKOPT="__INPUT__ __FIRST__ __NEW_TRACER__ __LINUXC26__ __PCI__ __NET__ __GRX__" |
/demos/tags/rel_1_5_beta1/first/test1.c |
---|
0,0 → 1,385 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Giacomo Guidi <giacomo@gandalf.sssup.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/* |
* Copyright (C) 2002 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 "edf/edf/edf.h" |
#include "cbs/cbs/cbs.h" |
#include "pthread.h" |
#include "posix/posix/posix.h" |
#include "fsf.h" |
#include "fsf_server.h" |
#include "dummy/dummy/dummy.h" |
#include "sem/sem/sem.h" |
#include "pi/pi/pi.h" |
#include "pc/pc/pc.h" |
#include "hartport/hartport/hartport.h" |
#include "cabs/cabs/cabs.h" |
#include "drivers/keyb.h" |
#include <stdlib.h> |
// -------------------------------------------------- |
// -------------------------------------------------- |
// Init Part |
// -------------------------------------------------- |
// -------------------------------------------------- |
/*+ sysyem tick in us +*/ |
#define TICK 0 |
/*+ RR tick in us +*/ |
#define RRTICK 10000 |
int grubstar_level; |
int posix_level; |
TIME __kernel_register_levels__(void *arg) |
{ |
struct multiboot_info *mb = (struct multiboot_info *)arg; |
EDF_register_level(EDF_ENABLE_ALL); |
posix_level=POSIX_register_level(RRTICK, 1, mb, 32); |
grubstar_level = GRUBSTAR_register_level(5, 0); |
FSF_register_module(posix_level,grubstar_level, (int)(MAX_BANDWIDTH * 0.9)); |
dummy_register_level(); |
// for the keyboard... |
CBS_register_level(CBS_ENABLE_ALL, 0); |
PI_register_module(); |
PC_register_module(); |
SEM_register_module(); |
PTHREAD_register_module(1, 0, 1); |
return TICK; |
} |
TASK __init__(void *arg) |
{ |
struct multiboot_info *mb = (struct multiboot_info *)arg; |
HARTPORT_init(); |
KEYB_init(NULL); |
__call_main__(mb); |
return (void *)0; |
} |
// -------------------------------------------------- |
// -------------------------------------------------- |
// The Test |
// -------------------------------------------------- |
// -------------------------------------------------- |
pthread_t j1 = -1; |
pthread_t j2 = -1; |
pthread_t j3 = -1; |
pthread_t j4 = -1; |
fsf_server_id_t server1 = -1; |
fsf_server_id_t server2 = -1; |
fsf_server_id_t server3 = -1; |
fsf_server_id_t server4 = -1; |
fsf_contract_parameters_t contract1, contract2; |
#define TASK_PERIOD 1000000 |
void *periodic_star(void *arg) |
{ |
struct timespec actual,end,next_time; |
int actpersecond,act,cycle; |
int mean,nmean; |
bool was_deadline_missed, was_budget_overran; |
act = 0; |
actpersecond = 0; |
mean = 0; |
nmean = 0; |
cycle = 0; |
for (;;) { |
kern_gettime(&actual); |
cycle++; |
if (act == 0) { |
TIMESPEC_ASSIGN(&end,&actual); |
end.tv_sec++; |
} |
if (TIMESPEC_A_LT_B(&actual,&end)) { |
act++; |
} else { |
actpersecond = act; |
act = 0; |
mean = (mean * nmean + actpersecond) / (nmean+1); |
nmean++; |
} |
printf_xy(0,exec_shadow,WHITE,"Thread %3d Act_per_Second = %8d Mean = %8d Cycle = %8d", |
exec_shadow,actpersecond,mean,cycle); |
kern_gettime(&next_time); |
ADDUSEC2TIMESPEC(TASK_PERIOD, &next_time); |
fsf_schedule_timed_job(&next_time, NULL, NULL, &was_deadline_missed, &was_budget_overran); |
} |
return NULL; |
} |
void *star(void *arg) |
{ |
struct timespec actual,end; |
int actpersecond,act; |
int mean,nmean,cycle; |
act = 0; |
actpersecond = 0; |
mean = 0; |
nmean = 0; |
cycle = 0; |
for (;;) { |
cycle++; |
kern_gettime(&actual); |
if (act == 0) { |
TIMESPEC_ASSIGN(&end,&actual); |
end.tv_sec++; |
} |
if (TIMESPEC_A_LT_B(&actual,&end)) { |
act++; |
} else { |
actpersecond = act; |
act = 0; |
mean = (mean * nmean + actpersecond) / (nmean+1); |
nmean++; |
} |
printf_xy(0,exec_shadow,WHITE,"Thread %3d Act_per_Second = %8d Mean = %8d Cycle = %8d", |
exec_shadow,actpersecond,mean,cycle); |
} |
return NULL; |
} |
void *edftask(void *arg) |
{ |
int i,j; |
while(1) { |
for (i=0;i<5; i++) { |
for (j=0; j<10; j++); |
//cputc('#'); |
//cputs((char *)(arg)); |
} |
task_endcycle(); |
} |
return NULL; |
} |
void create() |
{ |
HARD_TASK_MODEL mhard; |
struct timespec period1 = {0,100000000}; |
struct timespec period2 = {0,100000000}; |
struct timespec budget1 = {0,30000000}; |
struct timespec budget2 = {0,30000000}; |
PID t1, t2; |
int err; |
FSF_start_service_task(); |
kern_printf("(Start Create)"); |
hard_task_default_model(mhard); |
hard_task_def_ctrl_jet(mhard); |
hard_task_def_mit(mhard,32000); |
hard_task_def_wcet(mhard,3000); |
hard_task_def_arg(mhard,(void *)"X"); |
hard_task_def_group(mhard,1); |
hard_task_def_periodic(mhard); |
//t1 = task_create("X", edftask, &mhard, NULL); |
//if (t1 == NIL) { |
// perror("Could not create task X ..."); |
// exit(1); |
//} |
hard_task_def_mit(mhard,32000); |
hard_task_def_wcet(mhard,3000); |
hard_task_def_arg(mhard,(void *)"Y"); |
//t2 = task_create("Y", edftask, &mhard, NULL); |
//if (t2 == NIL) { |
// perror("Could not create task Y ..."); |
// exit(1); |
//} |
//group_activate(1); |
err = pthread_create(&j1, NULL, star, (void *)"A"); |
if (err) { |
perror("Could not create task A ..."); |
exit(1); |
} |
err = pthread_create(&j2, NULL, periodic_star, (void *)"B"); |
if (err) { |
perror("Could not create task B ..."); |
exit(1); |
} |
err = pthread_create(&j3, NULL, star, (void *)"C"); |
if (err) { |
perror("Could not create task C ..."); |
exit(1); |
} |
err = pthread_create(&j4, NULL, periodic_star, (void *)"D"); |
if (err) { |
perror("Could not create task D ..."); |
exit(1); |
} |
fsf_initialize_contract(&contract1); |
fsf_set_contract_basic_parameters(&contract1,&budget1,&period1,FSF_DEFAULT_WORKLOAD); |
fsf_initialize_contract(&contract2); |
fsf_set_contract_basic_parameters(&contract2,&budget2,&period2,FSF_DEFAULT_WORKLOAD); |
kern_printf("(End Create)"); |
} |
int main(int argc, char **argv) |
{ |
char ch = 0; |
int err; |
create(); |
do { |
ch = keyb_getch(BLOCK); |
switch(ch) { |
case '1': |
err = fsf_bind_thread_to_server(server1,j1); |
kern_printf("(%d)",err); |
break; |
case '2': |
err = fsf_bind_thread_to_server(server2,j2); |
kern_printf("(%d)",err); |
break; |
case '3': |
err = fsf_bind_thread_to_server(server1,j3); |
kern_printf("(%d)",err); |
break; |
case '4': |
err = fsf_bind_thread_to_server(server2,j4); |
kern_printf("(%d)",err); |
break; |
case '5': |
err = fsf_unbind_thread_from_server(j1); |
kern_printf("(%d)",err); |
break; |
case '6': |
err = fsf_unbind_thread_from_server(j2); |
kern_printf("(%d)",err); |
break; |
case '7': |
err = fsf_unbind_thread_from_server(j3); |
kern_printf("(%d)",err); |
break; |
case '8': |
err = fsf_unbind_thread_from_server(j4); |
kern_printf("(%d)",err); |
break; |
case 'q': |
err = fsf_negotiate_contract(&contract1,&server1); |
cprintf("(%d)",err); |
break; |
case 'w': |
err = fsf_negotiate_contract(&contract2,&server2); |
kern_printf("(%d)",err); |
break; |
case 'e': |
err = fsf_negotiate_contract(&contract1,&server3); |
kern_printf("(%d)",err); |
break; |
case 'r': |
err = fsf_cancel_contract(server1); |
kern_printf("(%d)",err); |
break; |
case 't': |
err = fsf_cancel_contract(server2); |
kern_printf("(%d)",err); |
break; |
case 'y': |
err = fsf_cancel_contract(server3); |
kern_printf("(%d)",err); |
break; |
} |
} while(ch != ESC); |
exit(1); |
return 0; |
} |
/demos/tags/rel_1_5_beta1/first/test2.c |
---|
0,0 → 1,431 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Giacomo Guidi <giacomo@gandalf.sssup.it> |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/* |
* 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 "fsf.h" |
#include "fsf_server.h" |
#include "stdlib.h" |
#include "unistd.h" |
#include "string.h" |
#include "pistar.h" |
#include "pthread.h" |
#include "drivers/glib.h" |
#include <tracer.h> |
#include "FTrace_udp.h" |
#include "FTrace_chunk.h" |
#include <drivers/shark_keyb26.h> |
#define TEST_PERIOD 50000 |
mutex_t mux; |
int main_chunk; |
TASK finish_task() { |
#ifdef __NEW_TRACER__ |
group_kill(1); |
group_kill(2); |
FTrace_OSD_init_udp(1,"192.168.82.43","192.168.82.41"); |
FTrace_send_chunk(main_chunk, 0, FTRACE_CHUNK_FLAG_FREE | FTRACE_CHUNK_FLAG_CYC); |
exit(0); |
#else |
exit(0); |
#endif |
return NULL; |
} |
void print_timer(int x, int y) |
{ |
long nsec,sec,min,hrs,day; |
struct timespec actual_timer; |
char tmp[100]; |
sys_gettime(&actual_timer); |
nsec = actual_timer.tv_nsec; |
sec = actual_timer.tv_sec; |
min = sec / 60; |
sec %= 60; |
hrs = min / 60; |
min %= 60; |
day = hrs / 24; |
hrs %= 24; |
sprintf(tmp,"Time: %2ld d %2ld h %2ld m %2ld s %12ld ns",day,hrs,min,sec,(long)nsec); |
mutex_lock(&mux); |
grx_text(tmp,x,y,rgb16(255,255,255),0); |
mutex_unlock(&mux); |
} |
#define LOAD_VARIATION 10 |
#define MAX_V_QOS 30 |
#define MIN_V_QOS 2 |
void *test_task_variable(void *arg) { |
struct timespec next_time; |
bool was_deadline_missed = false, was_budget_overran = false; |
char tmp[100]; |
long long i; |
int task_qos; |
int var_load, rd_per; |
TIME exectime; |
task_qos = 7; |
var_load = 5; |
rd_per = 0; |
while(1) { |
print_timer(307,10+30*exec_shadow); |
sprintf(tmp,"Test Thread V QOS = %5d PID = %3d VLOAD = %3d",task_qos,exec_shadow,var_load); |
mutex_lock(&mux); |
if (!was_deadline_missed) |
grx_text(tmp,307,20+30*exec_shadow,rgb16(255,255,255),0); |
else |
grx_text(tmp,307,20+30*exec_shadow,rgb16(255,0,0),0); |
mutex_unlock(&mux); |
//jet_gettable(exec_shadow, &exectime, 1); |
//sprintf(tmp,"Thread Exec Timer = %10d us",(int)exectime); |
//grx_text(tmp,307,30+30*exec_shadow,rgb16(255,255,255),0); |
if (rd_per > LOAD_VARIATION) { |
var_load += rand()%3-1; |
if (var_load > 20) var_load = 20; |
if (var_load < 0) var_load = 0; |
rd_per = 0; |
} else { |
rd_per++; |
} |
for(i = 0; i < 10000*(task_qos+var_load); i++); |
} |
return NULL; |
} |
#define MAX_C_QOS 30 |
#define MIN_C_QOS 2 |
void *test_task_constant(void *arg) { |
struct timespec next_time; |
bool was_deadline_missed = false, was_budget_overran = false; |
char tmp[100]; |
long long i; |
int task_qos; |
task_qos = 7; |
while(1) { |
print_timer(307,10+20*exec_shadow); |
sprintf(tmp,"Test Task C QOS = %5d PID = %3d",task_qos,exec_shadow); |
mutex_lock(&mux); |
if (!was_deadline_missed) |
grx_text(tmp,307,20+20*exec_shadow,rgb16(255,255,255),0); |
else |
grx_text(tmp,307,20+20*exec_shadow,rgb16(255,0,0),0); |
mutex_unlock(&mux); |
for(i = 0; i < 10000*task_qos; i++); |
} |
return NULL; |
} |
void draw_box(int x1, int y1, int x2, int y2) |
{ |
grx_rect(x1,y1,x2,y2,rgb16(160,160,160)); |
grx_rect(x1+2,y1+2,x2-2,y2-2,rgb16(210,210,210)); |
} |
void layout_screen() |
{ |
draw_box(0,0,300,500); |
grx_text("Application Task List",5,5,rgb16(255,255,255),0); |
draw_box(303,0,799,500); |
grx_text("Task Output",305,5,rgb16(255,255,255),0); |
draw_box(0,503,799,599); |
grx_line(140,505,140,597,rgb16(255,255,255)); |
grx_line(140,583,797,583,rgb16(255,255,255)); |
grx_text("Application Statistics",142,507,rgb16(255,255,255),0); |
} |
void program_end() |
{ |
grx_close(); |
} |
void *mpeg2decoder(void *arg); |
void add_posixstar_thread(fsf_server_id_t server) |
{ |
int err; |
pthread_t j = -1; |
static fsf_sched_params_t pr; |
NRT_TASK_MODEL nrt; |
pr.policy=FSF_RR; |
pr.params=&nrt; |
nrt_task_default_model(nrt); |
nrt_task_def_save_arrivals(nrt); |
nrt_task_def_group(nrt,1); |
err = pthread_create(&j, NULL, test_task_variable, NULL); |
if (err) { |
perror("Could not create task..."); |
exit(1); |
} |
err=fsf_bind_local_thread_to_server(server, j, (fsf_sched_params_t *)(&pr)); |
if (err) { |
grx_close(); |
kern_printf("Could not bind task.. %d", err); |
exit(1); |
} |
} |
void add_edfstar_thread(fsf_server_id_t server) |
{ |
int err; |
pthread_t j = -1; |
HARD_TASK_MODEL ht; |
static fsf_sched_params_t pr; |
pr.policy=FSF_EDF; |
pr.params=&ht; |
hard_task_default_model(ht); |
hard_task_def_mit(ht,100000); |
hard_task_def_wcet(ht,90000); |
nrt_task_def_group(ht,2); |
err = pthread_create(&j, NULL, mpeg2decoder, NULL); |
if (err) { |
grx_close(); |
perror("Could not create task..."); |
exit(1); |
} |
err=fsf_bind_local_thread_to_server(server, j,(fsf_sched_params_t *)(&pr)); |
if (err) { |
grx_close(); |
perror("Could not bind task.."); |
exit(1); |
} |
} |
void ending_system(KEY_EVT *e) { |
grx_close(); |
#ifdef __NEW_TRACER__ |
NRT_TASK_MODEL nrt; |
TRACER_LOGEVENT(FTrace_EVT_trace_stop,0,0); |
FTrace_disable(); |
//group_kill(l->group); |
nrt_task_default_model(nrt); |
task_activate(task_create("Finish",finish_task,&nrt,NULL)); |
#else |
exit(0); |
#endif |
} |
int main(int argc, char **argv) |
{ |
char ch; |
int err; |
//KEY_EVT k; |
PI_mutexattr_t a; |
KEY_EVT ev; |
union sigval no_sigval = {0}; |
struct timespec period = {0,10000000}; |
struct timespec budget = {0,1000000}; |
struct timespec period1 = {0,10000000}; |
struct timespec period2 = {0,10000000}; |
struct timespec budget1 = {0,3000000}; |
struct timespec budget2 = {0,3000000}; |
fsf_server_id_t server1, server2; |
fsf_contract_parameters_t contract1, contract2; |
union sigval sval; |
ev.ascii = 'c'; |
ev.scan = KEY_C; |
ev.status = KEY_PRESSED; |
ev.flag = CNTR_BIT; |
keyb_hook(ev, ending_system, FALSE); |
#ifdef __NEW_TRACER__ |
main_chunk = FTrace_chunk_create(10000000, 1000, FTRACE_CHUNK_FLAG_FREE | FTRACE_CHUNK_FLAG_CYC); |
FTrace_actual_chunk_select(main_chunk); |
FTrace_enable(); |
#endif |
TRACER_LOGEVENT(FTrace_EVT_trace_start,0,0); |
PI_mutexattr_default(a); |
FSF_start_service_task(); |
mutex_init(&mux,&a); |
fsf_initialize_contract(&contract1); |
fsf_set_contract_basic_parameters(&contract1,&budget1,&period1,FSF_DEFAULT_WORKLOAD); |
fsf_set_contract_timing_requirements(&contract1,true,NULL,0,no_sigval,0,no_sigval); |
fsf_initialize_contract(&contract2); |
fsf_set_contract_scheduling_policy(&contract1, FSF_RR); |
fsf_set_contract_basic_parameters(&contract2,&budget2,&period2,FSF_DEFAULT_WORKLOAD); |
fsf_set_contract_timing_requirements(&contract2,true,NULL,0,no_sigval,0,no_sigval); |
fsf_set_contract_scheduling_policy(&contract2, FSF_EDF); |
err = fsf_negotiate_contract(&contract1,&server1); |
if (err) cprintf("(FSF ERROR %d)",err); |
err = fsf_negotiate_contract(&contract2,&server2); |
if (err) cprintf("(FSF ERROR %d)",err); |
//graphic card Initialization |
if (grx_init() < 1) { |
exit(1); |
} |
if (grx_open(800, 600, 16) < 0) { |
cprintf("GRX Err\n"); |
exit(0); |
} |
layout_screen(); |
ch = keyb_getch(BLOCK); |
while(ch != ESC) { |
switch (ch) { |
case '1': |
add_posixstar_thread(server1); |
break; |
case '2': |
add_edfstar_thread(server2); |
break; |
case '3': |
fsf_set_contract_basic_parameters(&contract2,&budget,&period,FSF_DEFAULT_WORKLOAD); |
fsf_request_contract_renegotiation(&contract2,server2, 0, sval); |
break; |
case '4': |
ending_system(NULL); |
break; |
case '5': |
break; |
} |
ch = keyb_getch(BLOCK); |
} |
ending_system(NULL); |
return 0; |
} |
/demos/tags/rel_1_5_beta1/first/initfile.c |
---|
0,0 → 1,203 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Giacomo Guidi <giacomo@gandalf.sssup.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/* |
* 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 "edf/edf/edf.h" |
#include "cbs/cbs/cbs.h" |
#include "posix/posix/posix.h" |
#include "pthread.h" |
#include "sem/sem/sem.h" |
#include "dummy/dummy/dummy.h" |
#include "hartport/hartport/hartport.h" |
#include "fsf.h" |
#include "pi/pi/pi.h" |
#include "pc/pc/pc.h" |
#include "intdrive/intdrive/intdrive.h" |
#include <drivers/shark_linuxc26.h> |
#include <drivers/shark_input26.h> |
#include <drivers/shark_keyb26.h> |
#include <drivers/shark_pci26.h> |
#define TICK 0 |
#define RRTICK 10000 |
/*+ Interrupt Server +*/ |
#define INTDRIVE_Q 1000 |
#define INTDRIVE_T 10000 |
#define INTDRIVE_FLAG 0 |
void call_shutdown_task(void *arg); |
int device_drivers_init(); |
int device_drivers_close(); |
void set_shutdown_task(); |
TASK shutdown_task_body(void *arg); |
PID shutdown_task_PID = 1; |
void load_file(); |
int device_drivers_close() { |
KEYB26_close(); |
INPUT26_close(); |
return 0; |
} |
int device_drivers_init() { |
KEYB_PARMS kparms = BASE_KEYB; |
LINUXC26_register_module(); |
PCI26_init(); |
INPUT26_init(); |
/*keyb_def_map(kparms, KEYMAP_IT);*/ |
keyb_def_ctrlC(kparms, NULL); |
KEYB26_init(&kparms); |
return 0; |
} |
TASK shutdown_task_body(void *arg) { |
device_drivers_close(); |
sys_shutdown_message("-- S.Ha.R.K. Closed --\n"); |
return NULL; |
} |
#define SHUTDOWN_TIMEOUT_SEC 3 |
void set_shutdown_task() { |
NRT_TASK_MODEL nrt; |
nrt_task_default_model(nrt); |
nrt_task_def_system(nrt); |
shutdown_task_PID = task_create("Shutdown Task", shutdown_task_body, &nrt, NULL); |
if (shutdown_task_PID == NIL) { |
sys_shutdown_message("Error: Cannot create shutdown task\n"); |
exit(1); |
} |
} |
void call_shutdown_task(void *arg) { |
struct timespec t; |
sys_gettime(&t); |
t.tv_sec += SHUTDOWN_TIMEOUT_SEC; |
/* Emergency timeout to exit from RUNLEVEL_SHUTDOWN */ |
kern_event_post(&t,(void *)((void *)sys_abort_shutdown),(void *)0); |
task_activate(shutdown_task_PID); |
} |
TIME __kernel_register_levels__(void *arg) |
{ |
struct multiboot_info *mb = (struct multiboot_info *)arg; |
int edf_level; |
int grubstar_level; |
int posix_level; |
int pi_level; |
int pc_level; |
INTDRIVE_register_level(INTDRIVE_Q, INTDRIVE_T, INTDRIVE_FLAG); |
edf_level=EDF_register_level(EDF_ENABLE_ALL); |
posix_level=POSIX_register_level(RRTICK, edf_level, mb, 32); |
grubstar_level = GRUBSTAR_register_level(FSF_MAX_N_SERVERS, edf_level); |
FSF_register_module(posix_level,grubstar_level, (int)(MAX_BANDWIDTH*0.8)); |
dummy_register_level(); |
CBS_register_level(CBS_ENABLE_ALL,1); |
SEM_register_module(); |
pi_level=PI_register_module(); |
pc_level=PC_register_module(); |
PTHREAD_register_module(posix_level, pi_level, pc_level); |
load_file(); |
return TICK; |
} |
TASK __init__(void *arg) |
{ |
struct multiboot_info *mb = (struct multiboot_info *)arg; |
HARTPORT_init(); |
set_shutdown_task(); |
device_drivers_init(); |
sys_atrunlevel(call_shutdown_task, NULL, RUNLEVEL_SHUTDOWN); |
__call_main__(mb); |
return (void *)0; |
} |
int dos_video_preload(void *filename, long max_size, void **start, void **end); |
void *start_file; |
void *end_file; |
void load_file() |
{ |
start_file = NULL; |
end_file = NULL; |
dos_video_preload("test.m2v",5000000,&start_file,&end_file); |
cprintf("Start file ptr = %08lx\n",(long)(start_file)); |
cprintf("End file ptr = %08lx\n",(long)(end_file)); |
cprintf("Size = %8ld\n",(long)(end_file - start_file)); |
} |
/demos/tags/rel_1_5_beta1/first/mpeg2/mpeg2dec.c |
---|
0,0 → 1,495 |
/* mpeg2dec.c, main(), initialization, option processing */ |
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */ |
/* |
* Disclaimer of Warranty |
* |
* These software programs are available to the user without any license fee or |
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims |
* any and all warranties, whether express, implied, or statuary, including any |
* implied warranties or merchantability or of fitness for a particular |
* purpose. In no event shall the copyright-holder be liable for any |
* incidental, punitive, or consequential damages of any kind whatsoever |
* arising from the use of these programs. |
* |
* This disclaimer of warranty extends to the user of these programs and user's |
* customers, employees, agents, transferees, successors, and assigns. |
* |
* The MPEG Software Simulation Group does not represent or warrant that the |
* programs furnished hereunder are free of infringement of any third-party |
* patents. |
* |
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware, |
* are subject to royalty fees to patent holders. Many of these patents are |
* general enough such that they are unavoidable regardless of implementation |
* design. |
* |
*/ |
#include "stdlib.h" |
#include "drivers/glib.h" |
#include "fsf.h" |
#define GLOBAL |
#include "config.h" |
#include "global.h" |
/* private prototypes */ |
static int video_sequence _ANSI_ARGS_((int *framenum)); |
static int Headers _ANSI_ARGS_((void)); |
static void Initialize_Sequence _ANSI_ARGS_((void)); |
static void Initialize_Decoder _ANSI_ARGS_((void)); |
static void Deinitialize_Sequence _ANSI_ARGS_((void)); |
/* #define DEBUG */ |
static void Clear_Options(); |
#ifdef DEBUG |
static void Print_Options(); |
#endif |
#define MAX_M_QOS 0 |
#define MIN_M_QOS 0 |
int dos_video_preload(char *file_name, long max_size, void **start, void **end) |
{ |
DOS_FILE* file; |
void *buf; |
long rd; |
file = DOS_fopen(file_name,"r"); |
if (file == NULL) return -1; |
buf = malloc(max_size); |
*start = buf; |
while(((rd = DOS_fread(buf, sizeof(BYTE), 2048, file)) == 2048) && |
((buf - *start + rd) < (max_size-2048))) { |
buf += rd; |
} |
*end = buf + rd; |
DOS_fclose(file); |
return(0); |
} |
int Init_Mpeg_Decoder(void *start, void *end) |
{ |
int code; |
Clear_Options(); |
#ifdef DEBUG |
Print_Options(); |
#endif |
ld = &base; /* select base layer context */ |
ld->start_file_ptr = start; |
ld->end_file_ptr = end; |
ld->actual_file_ptr = ld->start_file_ptr; |
/* open MPEG base layer bitstream file(s) */ |
/* NOTE: this is either a base layer stream or a spatial enhancement stream */ |
if ((base.Infile=1)<0) |
{ |
cprintf("Base layer input file %s not found\n", Main_Bitstream_Filename); |
} |
if(base.Infile != 0) |
{ |
Initialize_Buffer(); |
if(Show_Bits(8)==0x47) |
{ |
sprintf(Error_Text,"Decoder currently does not parse transport streams\n"); |
Error(Error_Text); |
} |
next_start_code(); |
code = Show_Bits(32); |
switch(code) |
{ |
case SEQUENCE_HEADER_CODE: |
break; |
case PACK_START_CODE: |
System_Stream_Flag = 1; |
case VIDEO_ELEMENTARY_STREAM: |
System_Stream_Flag = 1; |
break; |
default: |
sprintf(Error_Text,"Unable to recognize stream type\n"); |
Error(Error_Text); |
break; |
} |
ld->actual_file_ptr = ld->start_file_ptr; |
Initialize_Buffer(); |
} |
if(base.Infile!=0) |
{ |
ld->actual_file_ptr = ld->start_file_ptr; |
} |
Initialize_Buffer(); |
if(Two_Streams) |
{ |
ld = &enhan; /* select enhancement layer context */ |
if ((enhan.Infile = 1)<0) |
{ |
sprintf(Error_Text,"enhancment layer bitstream file %s not found\n", |
Enhancement_Layer_Bitstream_Filename); |
Error(Error_Text); |
} |
Initialize_Buffer(); |
ld = &base; |
} |
Initialize_Decoder(); |
//Decode_Bitstream(); |
return 0; |
} |
/* IMPLEMENTAION specific rouintes */ |
static void Initialize_Decoder() |
{ |
int i; |
/* Clip table */ |
if (!(Clip=(unsigned char *)malloc(1024))) |
Error("Clip[] malloc failed\n"); |
Clip += 384; |
for (i=-384; i<640; i++) |
Clip[i] = (i<0) ? 0 : ((i>255) ? 255 : i); |
/* IDCT */ |
if (Reference_IDCT_Flag) |
Initialize_Reference_IDCT(); |
else |
Initialize_Fast_IDCT(); |
} |
/* mostly IMPLEMENTAION specific rouintes */ |
static void Initialize_Sequence() |
{ |
int cc, size; |
static int Table_6_20[3] = {6,8,12}; |
/* check scalability mode of enhancement layer */ |
if (Two_Streams && (enhan.scalable_mode!=SC_SNR) && (base.scalable_mode!=SC_DP)) |
Error("unsupported scalability mode\n"); |
/* force MPEG-1 parameters for proper decoder behavior */ |
/* see ISO/IEC 13818-2 section D.9.14 */ |
if (!base.MPEG2_Flag) |
{ |
progressive_sequence = 1; |
progressive_frame = 1; |
picture_structure = FRAME_PICTURE; |
frame_pred_frame_dct = 1; |
chroma_format = CHROMA420; |
matrix_coefficients = 5; |
} |
/* round to nearest multiple of coded macroblocks */ |
/* ISO/IEC 13818-2 section 6.3.3 sequence_header() */ |
mb_width = (horizontal_size+15)/16; |
mb_height = (base.MPEG2_Flag && !progressive_sequence) ? 2*((vertical_size+31)/32) |
: (vertical_size+15)/16; |
Coded_Picture_Width = 16*mb_width; |
Coded_Picture_Height = 16*mb_height; |
/* ISO/IEC 13818-2 sections 6.1.1.8, 6.1.1.9, and 6.1.1.10 */ |
Chroma_Width = (chroma_format==CHROMA444) ? Coded_Picture_Width |
: Coded_Picture_Width>>1; |
Chroma_Height = (chroma_format!=CHROMA420) ? Coded_Picture_Height |
: Coded_Picture_Height>>1; |
/* derived based on Table 6-20 in ISO/IEC 13818-2 section 6.3.17 */ |
block_count = Table_6_20[chroma_format-1]; |
for (cc=0; cc<3; cc++) |
{ |
if (cc==0) |
size = Coded_Picture_Width*Coded_Picture_Height; |
else |
size = Chroma_Width*Chroma_Height; |
if (!(backward_reference_frame[cc] = (unsigned char *)malloc(size))) |
Error("backward_reference_frame[] malloc failed\n"); |
if (!(forward_reference_frame[cc] = (unsigned char *)malloc(size))) |
Error("forward_reference_frame[] malloc failed\n"); |
if (!(auxframe[cc] = (unsigned char *)malloc(size))) |
Error("auxframe[] malloc failed\n"); |
if(Ersatz_Flag) |
if (!(substitute_frame[cc] = (unsigned char *)malloc(size))) |
Error("substitute_frame[] malloc failed\n"); |
if (base.scalable_mode==SC_SPAT) |
{ |
/* this assumes lower layer is 4:2:0 */ |
if (!(llframe0[cc] = (unsigned char *)malloc((lower_layer_prediction_horizontal_size*lower_layer_prediction_vertical_size)/(cc?4:1)))) |
Error("llframe0 malloc failed\n"); |
if (!(llframe1[cc] = (unsigned char *)malloc((lower_layer_prediction_horizontal_size*lower_layer_prediction_vertical_size)/(cc?4:1)))) |
Error("llframe1 malloc failed\n"); |
} |
} |
/* SCALABILITY: Spatial */ |
if (base.scalable_mode==SC_SPAT) |
{ |
if (!(lltmp = (short *)malloc(lower_layer_prediction_horizontal_size*((lower_layer_prediction_vertical_size*vertical_subsampling_factor_n)/vertical_subsampling_factor_m)*sizeof(short)))) |
Error("lltmp malloc failed\n"); |
} |
#ifdef DISPLAY |
if (Output_Type==T_X11) |
{ |
Initialize_Display_Process(""); |
Initialize_Dither_Matrix(); |
} |
#endif /* DISPLAY */ |
} |
void Error(text) |
char *text; |
{ |
cprintf(text); |
} |
/* Trace_Flag output */ |
void Print_Bits(code,bits,len) |
int code,bits,len; |
{ |
int i; |
for (i=0; i<len; i++) |
cprintf("%d",(code>>(bits-1-i))&1); |
} |
static int Headers() |
{ |
int ret; |
ld = &base; |
/* return when end of sequence (0) or picture |
header has been parsed (1) */ |
ret = Get_Hdr(); |
if (Two_Streams) |
{ |
ld = &enhan; |
if (Get_Hdr()!=ret && !Quiet_Flag) |
cprintf("streams out of sync\n"); |
ld = &base; |
} |
return ret; |
} |
int Decode_Bitstream() |
{ |
int ret; |
int Bitstream_Framenum; |
Bitstream_Framenum = 0; |
for(;;) |
{ |
#ifdef VERIFY |
Clear_Verify_Headers(); |
#endif /* VERIFY */ |
ld->actual_file_ptr = ld->start_file_ptr; |
ret = Headers(); |
if(ret==1) |
{ |
ret = video_sequence(&Bitstream_Framenum); |
} |
else |
return(ret); |
} |
} |
static void Deinitialize_Sequence() |
{ |
int i; |
/* clear flags */ |
base.MPEG2_Flag=0; |
for(i=0;i<3;i++) |
{ |
free(backward_reference_frame[i]); |
free(forward_reference_frame[i]); |
free(auxframe[i]); |
if (base.scalable_mode==SC_SPAT) |
{ |
free(llframe0[i]); |
free(llframe1[i]); |
} |
} |
if (base.scalable_mode==SC_SPAT) |
free(lltmp); |
#ifdef DISPLAY |
if (Output_Type==T_X11) |
Terminate_Display_Process(); |
#endif |
} |
static int video_sequence(Bitstream_Framenumber) |
int *Bitstream_Framenumber; |
{ |
int Bitstream_Framenum; |
int Sequence_Framenum; |
int Return_Value; |
char tmp[100]; |
Bitstream_Framenum = *Bitstream_Framenumber; |
Sequence_Framenum=0; |
Initialize_Sequence(); |
/* decode picture whose header has already been parsed in |
Decode_Bitstream() */ |
ld->px = 310+(rand()%(500-Coded_Picture_Width)); |
ld->py = 100+(rand()%(400-Coded_Picture_Height)); |
sprintf(tmp,"Wx = %3d Wy = %3d",Coded_Picture_Width,Coded_Picture_Height); |
grx_text(tmp,ld->px,ld->py-10,rgb16(255,255,255),0); |
Decode_Picture(Bitstream_Framenum, Sequence_Framenum); |
/* update picture numbers */ |
if (!Second_Field) |
{ |
Bitstream_Framenum++; |
Sequence_Framenum++; |
} |
fsf_schedule_timed_job(NULL, NULL, NULL, NULL, NULL); |
/* loop through the rest of the pictures in the sequence */ |
while ((Return_Value=Headers())) |
{ |
Decode_Picture(Bitstream_Framenum, Sequence_Framenum); |
if (!Second_Field) |
{ |
Bitstream_Framenum++; |
Sequence_Framenum++; |
} |
fsf_schedule_timed_job(NULL, NULL, NULL, NULL, NULL); |
} |
/* put last frame */ |
if (Sequence_Framenum!=0) |
{ |
Output_Last_Frame_of_Sequence(Bitstream_Framenum); |
} |
Deinitialize_Sequence(); |
#ifdef VERIFY |
Clear_Verify_Headers(); |
#endif /* VERIFY */ |
*Bitstream_Framenumber = Bitstream_Framenum; |
return(Return_Value); |
} |
static void Clear_Options() |
{ |
Verbose_Flag = 0; |
Output_Type = 0; |
Output_Picture_Filename = " "; |
hiQdither = 0; |
Output_Type = 0; |
Frame_Store_Flag = 0; |
Spatial_Flag = 0; |
Lower_Layer_Picture_Filename = " "; |
Reference_IDCT_Flag = 0; |
Trace_Flag = 0; |
Quiet_Flag = 0; |
Ersatz_Flag = 0; |
Substitute_Picture_Filename = " "; |
Two_Streams = 0; |
Enhancement_Layer_Bitstream_Filename = " "; |
Big_Picture_Flag = 0; |
Main_Bitstream_Flag = 0; |
Main_Bitstream_Filename = " "; |
Verify_Flag = 0; |
Stats_Flag = 0; |
User_Data_Flag = 0; |
} |
#ifdef DEBUG |
static void Print_Options() |
{ |
printf("Verbose_Flag = %d\n", Verbose_Flag); |
printf("Output_Type = %d\n", Output_Type); |
printf("Output_Picture_Filename = %s\n", Output_Picture_Filename); |
printf("hiQdither = %d\n", hiQdither); |
printf("Output_Type = %d\n", Output_Type); |
printf("Frame_Store_Flag = %d\n", Frame_Store_Flag); |
printf("Spatial_Flag = %d\n", Spatial_Flag); |
printf("Lower_Layer_Picture_Filename = %s\n", Lower_Layer_Picture_Filename); |
printf("Reference_IDCT_Flag = %d\n", Reference_IDCT_Flag); |
printf("Trace_Flag = %d\n", Trace_Flag); |
printf("Quiet_Flag = %d\n", Quiet_Flag); |
printf("Ersatz_Flag = %d\n", Ersatz_Flag); |
printf("Substitute_Picture_Filename = %s\n", Substitute_Picture_Filename); |
printf("Two_Streams = %d\n", Two_Streams); |
printf("Enhancement_Layer_Bitstream_Filename = %s\n", Enhancement_Layer_Bitstream_Filename); |
printf("Big_Picture_Flag = %d\n", Big_Picture_Flag); |
printf("Main_Bitstream_Flag = %d\n", Main_Bitstream_Flag); |
printf("Main_Bitstream_Filename = %s\n", Main_Bitstream_Filename); |
printf("Verify_Flag = %d\n", Verify_Flag); |
printf("Stats_Flag = %d\n", Stats_Flag); |
printf("User_Data_Flag = %d\n", User_Data_Flag); |
} |
#endif |
/demos/tags/rel_1_5_beta1/first/mpeg2/getbits.c |
---|
0,0 → 1,217 |
/* getbits.c, bit level routines */ |
/* |
* All modifications (mpeg2decode -> mpeg2play) are |
* Copyright (C) 1996, Stefan Eckart. All Rights Reserved. |
*/ |
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */ |
/* |
* Disclaimer of Warranty |
* |
* These software programs are available to the user without any license fee or |
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims |
* any and all warranties, whether express, implied, or statuary, including any |
* implied warranties or merchantability or of fitness for a particular |
* purpose. In no event shall the copyright-holder be liable for any |
* incidental, punitive, or consequential damages of any kind whatsoever |
* arising from the use of these programs. |
* |
* This disclaimer of warranty extends to the user of these programs and user's |
* customers, employees, agents, transferees, successors, and assigns. |
* |
* The MPEG Software Simulation Group does not represent or warrant that the |
* programs furnished hereunder are free of infringement of any third-party |
* patents. |
* |
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware, |
* are subject to royalty fees to patent holders. Many of these patents are |
* general enough such that they are unavoidable regardless of implementation |
* design. |
* |
*/ |
#include <stdlib.h> |
#include "drivers/glib.h" |
#include "config.h" |
#include "global.h" |
/* initialize buffer, call once before first getbits or showbits */ |
void Initialize_Buffer() |
{ |
ld->Incnt = 0; |
ld->Rdptr = ld->Rdbfr + 2048; |
ld->Rdmax = ld->Rdptr; |
#ifdef VERIFY |
/* only the verifier uses this particular bit counter |
* Bitcnt keeps track of the current parser position with respect |
* to the video elementary stream being decoded, regardless |
* of whether or not it is wrapped within a systems layer stream |
*/ |
ld->Bitcnt = 0; |
#endif |
ld->Bfr = 0; |
Flush_Buffer(0); /* fills valid data into bfr */ |
} |
int read(int Infile, void *Rdbfr, int rdsize) { |
if (ld->actual_file_ptr + 2048 > ld->end_file_ptr) |
rdsize = (int)(ld->end_file_ptr - ld->actual_file_ptr); |
if (rdsize < 0) return 0; |
memcpy(Rdbfr,ld->actual_file_ptr,rdsize); |
ld->actual_file_ptr += rdsize; |
return rdsize; |
} |
void Fill_Buffer() |
{ |
int Buffer_Level; |
Buffer_Level = read(ld->Infile,ld->Rdbfr,2048); |
ld->Rdptr = ld->Rdbfr; |
if (System_Stream_Flag) |
ld->Rdmax -= 2048; |
/* end of the bitstream file */ |
if (Buffer_Level < 2048) |
{ |
/* just to be safe */ |
if (Buffer_Level < 0) |
Buffer_Level = 0; |
/* pad until the next to the next 32-bit word boundary */ |
while (Buffer_Level & 3) |
ld->Rdbfr[Buffer_Level++] = 0; |
/* pad the buffer with sequence end codes */ |
while (Buffer_Level < 2048) |
{ |
ld->Rdbfr[Buffer_Level++] = SEQUENCE_END_CODE>>24; |
ld->Rdbfr[Buffer_Level++] = SEQUENCE_END_CODE>>16; |
ld->Rdbfr[Buffer_Level++] = SEQUENCE_END_CODE>>8; |
ld->Rdbfr[Buffer_Level++] = SEQUENCE_END_CODE&0xff; |
} |
} |
} |
/* MPEG-1 system layer demultiplexer */ |
int Get_Byte() |
{ |
while(ld->Rdptr >= ld->Rdbfr+2048) |
{ |
read(ld->Infile,ld->Rdbfr,2048); |
ld->Rdptr -= 2048; |
ld->Rdmax -= 2048; |
} |
return *ld->Rdptr++; |
} |
/* extract a 16-bit word from the bitstream buffer */ |
int Get_Word() |
{ |
int Val; |
Val = Get_Byte(); |
return (Val<<8) | Get_Byte(); |
} |
/* return next n bits (right adjusted) without advancing */ |
unsigned int Show_Bits(N) |
int N; |
{ |
return ld->Bfr >> (32-N); |
} |
/* return next bit (could be made faster than Get_Bits(1)) */ |
unsigned int Get_Bits1() |
{ |
return Get_Bits(1); |
} |
/* advance by n bits */ |
void Flush_Buffer(N) |
int N; |
{ |
int Incnt; |
ld->Bfr <<= N; |
Incnt = ld->Incnt -= N; |
if (Incnt <= 24) |
{ |
if (System_Stream_Flag && (ld->Rdptr >= ld->Rdmax-4)) |
{ |
do |
{ |
if (ld->Rdptr >= ld->Rdmax) |
Next_Packet(); |
ld->Bfr |= Get_Byte() << (24 - Incnt); |
Incnt += 8; |
} |
while (Incnt <= 24); |
} |
else if (ld->Rdptr < ld->Rdbfr+2044) |
{ |
do |
{ |
ld->Bfr |= *ld->Rdptr++ << (24 - Incnt); |
Incnt += 8; |
} |
while (Incnt <= 24); |
} |
else |
{ |
do |
{ |
if (ld->Rdptr >= ld->Rdbfr+2048) |
Fill_Buffer(); |
ld->Bfr |= *ld->Rdptr++ << (24 - Incnt); |
Incnt += 8; |
} |
while (Incnt <= 24); |
} |
ld->Incnt = Incnt; |
} |
#ifdef VERIFY |
ld->Bitcnt += N; |
#endif /* VERIFY */ |
} |
/* return next n bits (right adjusted) */ |
unsigned int Get_Bits(N) |
int N; |
{ |
unsigned int Val; |
Val = Show_Bits(N); |
Flush_Buffer(N); |
return Val; |
} |
/demos/tags/rel_1_5_beta1/first/mpeg2/verify.c |
---|
0,0 → 1,300 |
/* verify.c |
* |
* Bitstream verification routines |
* |
* |
*/ |
#ifdef VERIFY |
#include <stdlib.h> |
#include <math.h> /* needed for ceil() */ |
#include "config.h" |
#include "global.h" |
/* #define DEBUG */ |
#ifdef DEBUG |
#define PC |
#endif |
#ifdef PC |
#include <conio.h> /* needed for getch() */ |
#endif /* PC */ |
/* |
Check picture headers: due to the VBV definition of picture data, |
this routine must be called immediately before any picture data |
is parsed. (before the first slice start code, including any slice |
start code stuffing). |
*/ |
static void Check_VBV_Delay _ANSI_ARGS_((int Bitstream_Framenum, int Sequence_Framenum)); |
void Check_Headers(Bitstream_Framenum, Sequence_Framenum) |
int Bitstream_Framenum; |
int Sequence_Framenum; |
{ |
if((!low_delay)&&(vbv_delay!=0)&&(vbv_delay!=0xFFFF)) |
Check_VBV_Delay(Bitstream_Framenum, Sequence_Framenum); |
/* clear out the header tracking variables so we have an accurate |
count next time */ |
Clear_Verify_Headers(); |
} |
/* |
* Verify vbv_delay value in picture header |
* (low_delay==1 checks not implemented. this does not exhaustively test all |
* possibilities suggested in ISO/IEC 13818-2 Annex C. It only checks |
* for constant rate streams) |
* |
* Q:how do we tell a variable rate stream from a constant rate stream anyway? |
* it's not as simple as vbv_delay==0xFFFF, since we need meaningful |
* vbv_delay values to calculate the piecewise rate in the first place! |
* |
* Also: no special provisions at the beginning or end of a sequence |
*/ |
static void Check_VBV_Delay(Bitstream_Framenum, Sequence_Framenum) |
int Bitstream_Framenum; |
int Sequence_Framenum; |
{ |
double B; /* buffer size */ |
double Bn; /* buffer fullness for picture n */ |
double R; /* bitrate */ |
double I; /* time interval (t[n+1] - t[n]) */ |
double T; /* inverse of the frame rate (frame period) */ |
int d; |
int internal_vbv_delay; |
static int previous_IorP_picture_structure; |
static int previous_IorP_repeat_first_field; |
static int previous_IorP_top_field_first; |
static int previous_vbv_delay; |
static int previous_bitstream_position; |
static double previous_Bn; |
static double E; /* maximum quantization error or mismatch */ |
if((Sequence_Framenum==0)&&(!Second_Field)) |
{ /* first coded picture of sequence */ |
R = bit_rate; |
/* the initial buffer occupancy is taken on faith |
that is, we believe what is transmitted in the first coded picture header |
to be the true/actual buffer occupancy */ |
Bn = (R * (double) vbv_delay) / 90000.0; |
B = 16 * 1024 * vbv_buffer_size; |
/* maximum quantization error in bitrate (bit_rate_value is quantized/ |
rounded-up to units of 400 bits/sec as per ISO/IEC 13818-2 |
section 6.3.3 */ |
E = (400.0/frame_rate) + 400; |
#ifdef DEBUG |
cprintf("vbv_buffer_size (B) = %.0f, Bn=%f, E=%f, \nbitrate=%f, vbv_delay=%d frame_rate=%f\n", |
B, Bn, E, bit_rate, vbv_delay, frame_rate); |
#endif |
} |
else /* not the first coded picture of sequence */ |
{ |
/* derive the interval (I). The interval tells us how many constant rate bits |
* will have been downloaded to the buffer during the current picture period |
* |
* interval assumes that: |
* 1. whilst we are decoding the current I or P picture, we are displaying |
* the previous I or P picture which was stored in the reorder |
* buffer (pointed to by forward_reference_frame in this implementation) |
* |
* 2. B pictures are output ("displayed") at the time when they are decoded |
* |
*/ |
if(progressive_sequence) /* Annex C.9 (progressive_sequence==1, low_delay==0) */ |
{ |
T = 1/frame_rate; /* inverse of the frame rate (frame period) */ |
if(picture_coding_type==B_TYPE) |
{ |
if(repeat_first_field==1) |
{ |
if(top_field_first==1) |
I = T*3; /* three frame periods */ |
else |
I = T*2; /* two frame periods */ |
} |
else |
I = T; /* one frame period */ |
} |
else /* P or I frame */ |
{ |
if(previous_IorP_repeat_first_field==1) |
{ |
if(previous_IorP_top_field_first==1) |
I = 3*T; |
else |
I = 2*T; |
} |
else |
I = T; |
} |
} |
else /* Annex C.11 (progressive_sequence==0, low_delay==0) */ |
{ |
T = 1/(2*frame_rate); /* inverse of two times the frame rate (field period) */ |
if(picture_coding_type==B_TYPE) |
{ |
if(picture_structure==FRAME_PICTURE) |
{ |
if(repeat_first_field==0) |
I = 2*T; /* two field periods */ |
else |
I = 3*T; /* three field periods */ |
} |
else /* B field */ |
{ |
I = T; /* one field period */ |
} |
} |
else /* I or P picture */ |
{ |
if(picture_structure==FRAME_PICTURE) |
{ |
if(previous_IorP_repeat_first_field==0) |
I = 2*T; |
else |
I = 3*T; |
} |
else |
{ |
if(Second_Field==0) /* first field of current frame */ |
I = T; |
else /* second field of current frame */ |
{ |
/* formula: previous I or P display period (2*T or 3*T) minus the |
very recent decode period (T) of the first field of the current |
frame */ |
if(previous_IorP_picture_structure!=FRAME_PICTURE |
|| previous_IorP_repeat_first_field==0) |
I = 2*T - T; /* a net of one field period */ |
else if(previous_IorP_picture_structure==FRAME_PICTURE |
&& previous_IorP_repeat_first_field==1) |
I = 3*T - T; /* a net of two field periods */ |
} |
} |
} |
} |
/* derive coded size of previous picture */ |
d = ld->Bitcnt - previous_bitstream_position; |
/* Rate = Distance/Time */ |
/* piecewise constant rate (variable rate stream) calculation |
* R = ((double) d /((previous_vbv_delay - vbv_delay)/90000 + I)); |
*/ |
R = bit_rate; |
/* compute buffer fullness just before removing picture n |
* |
* Bn = previous_Bn + (I*R) - d; (recursive formula) |
* |
* where: |
* |
* n is the current picture |
* |
* Bn is the buffer fullness for the current picture |
* |
* previous_Bn is the buffer fullness of the previous picture |
* |
* (I*R ) is the bits accumulated during the current picture |
* period |
* |
* d is the number of bits removed during the decoding of the |
* previous picture |
*/ |
Bn = previous_Bn + (I*R) - d; |
/* compute internally derived vbv_delay (rouding up with ceil()) */ |
internal_vbv_delay = (int) ceil((90000 * Bn / bit_rate)); |
#ifdef DEBUG |
cprintf("\nvbv_delay: internal=%d, bitstream=%d\n", internal_vbv_delay, vbv_delay); |
cprintf("Bn=%f, prevBn=%f, I=%f, R=%f, d=%d\n", Bn, previous_Bn, I, R, d); |
cprintf("frame(%d), pictstruct(%d), picttype(%d)\n", Sequence_Framenum, |
picture_structure, picture_coding_type); |
/* report error */ |
if(internal_vbv_delay != vbv_delay) |
{ |
cprintf("WARNING: internal_vbv_delay(%d) != vbv_delay(%d)\n", |
internal_vbv_delay, vbv_delay); |
} |
#endif |
} /* not the first coded picture of sequence */ |
#ifdef PC |
getch(); |
#endif /* PC */ |
/* update generic tracking variables */ |
previous_bitstream_position = ld->Bitcnt ; |
previous_vbv_delay = vbv_delay; |
previous_Bn = Bn; |
/* reference picture: reordered/delayed output picture */ |
if(picture_coding_type!=B_TYPE) |
{ |
previous_IorP_repeat_first_field = repeat_first_field; |
previous_IorP_top_field_first = top_field_first; |
previous_IorP_picture_structure = picture_structure; |
} |
} |
/* variables to keep track of the occurance of redundant headers between pictures */ |
void Clear_Verify_Headers() |
{ |
verify_sequence_header = 0; |
verify_group_of_pictures_header = 0; |
verify_picture_header = 0; |
verify_slice_header = 0; |
verify_sequence_extension = 0; |
verify_sequence_display_extension = 0; |
verify_quant_matrix_extension = 0; |
verify_sequence_scalable_extension = 0; |
verify_picture_display_extension = 0; |
verify_picture_coding_extension = 0; |
verify_picture_spatial_scalable_extension = 0; |
verify_picture_temporal_scalable_extension = 0; |
verify_copyright_extension = 0; |
} |
#endif /* VERIFY */ |
/demos/tags/rel_1_5_beta1/first/mpeg2/motion.c |
---|
0,0 → 1,234 |
/* motion.c, motion vector decoding */ |
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */ |
/* |
* Disclaimer of Warranty |
* |
* These software programs are available to the user without any license fee or |
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims |
* any and all warranties, whether express, implied, or statuary, including any |
* implied warranties or merchantability or of fitness for a particular |
* purpose. In no event shall the copyright-holder be liable for any |
* incidental, punitive, or consequential damages of any kind whatsoever |
* arising from the use of these programs. |
* |
* This disclaimer of warranty extends to the user of these programs and user's |
* customers, employees, agents, transferees, successors, and assigns. |
* |
* The MPEG Software Simulation Group does not represent or warrant that the |
* programs furnished hereunder are free of infringement of any third-party |
* patents. |
* |
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware, |
* are subject to royalty fees to patent holders. Many of these patents are |
* general enough such that they are unavoidable regardless of implementation |
* design. |
* |
*/ |
#include "config.h" |
#include "global.h" |
/* private prototypes */ |
static void decode_motion_vector _ANSI_ARGS_((int *pred, int r_size, int motion_code, |
int motion_residualesidual, int full_pel_vector)); |
/* ISO/IEC 13818-2 sections 6.2.5.2, 6.3.17.2, and 7.6.3: Motion vectors */ |
void motion_vectors(PMV,dmvector, |
motion_vertical_field_select,s,motion_vector_count,mv_format,h_r_size,v_r_size,dmv,mvscale) |
int PMV[2][2][2]; |
int dmvector[2]; |
int motion_vertical_field_select[2][2]; |
int s, motion_vector_count, mv_format, h_r_size, v_r_size, dmv, mvscale; |
{ |
if (motion_vector_count==1) |
{ |
if (mv_format==MV_FIELD && !dmv) |
{ |
motion_vertical_field_select[1][s] = motion_vertical_field_select[0][s] = Get_Bits(1); |
#ifdef TRACE |
if (Trace_Flag) |
{ |
cprintf("motion_vertical_field_select[][%d] (%d): %d\n",s, |
motion_vertical_field_select[0][s],motion_vertical_field_select[0][s]); |
} |
#endif /* TRACE */ |
} |
motion_vector(PMV[0][s],dmvector,h_r_size,v_r_size,dmv,mvscale,0); |
/* update other motion vector predictors */ |
PMV[1][s][0] = PMV[0][s][0]; |
PMV[1][s][1] = PMV[0][s][1]; |
} |
else |
{ |
motion_vertical_field_select[0][s] = Get_Bits(1); |
#ifdef TRACE |
if (Trace_Flag) |
{ |
cprintf("motion_vertical_field_select[0][%d] (%d): %d\n",s, |
motion_vertical_field_select[0][s],motion_vertical_field_select[0][s]); |
} |
#endif /* TRACE */ |
motion_vector(PMV[0][s],dmvector,h_r_size,v_r_size,dmv,mvscale,0); |
motion_vertical_field_select[1][s] = Get_Bits(1); |
#ifdef TRACE |
if (Trace_Flag) |
{ |
cprintf("motion_vertical_field_select[1][%d] (%d): %d\n",s, |
motion_vertical_field_select[1][s],motion_vertical_field_select[1][s]); |
} |
#endif /* TRACE */ |
motion_vector(PMV[1][s],dmvector,h_r_size,v_r_size,dmv,mvscale,0); |
} |
} |
/* get and decode motion vector and differential motion vector |
for one prediction */ |
void motion_vector(PMV,dmvector, |
h_r_size,v_r_size,dmv,mvscale,full_pel_vector) |
int *PMV; |
int *dmvector; |
int h_r_size; |
int v_r_size; |
int dmv; /* MPEG-2 only: get differential motion vectors */ |
int mvscale; /* MPEG-2 only: field vector in frame pic */ |
int full_pel_vector; /* MPEG-1 only */ |
{ |
int motion_code, motion_residual; |
/* horizontal component */ |
/* ISO/IEC 13818-2 Table B-10 */ |
motion_code = Get_motion_code(); |
motion_residual = (h_r_size!=0 && motion_code!=0) ? Get_Bits(h_r_size) : 0; |
#ifdef TRACE |
if (Trace_Flag) |
{ |
if (h_r_size!=0 && motion_code!=0) |
{ |
cprintf("motion_residual ("); |
Print_Bits(motion_residual,h_r_size,h_r_size); |
cprintf("): %d\n",motion_residual); |
} |
} |
#endif /* TRACE */ |
decode_motion_vector(&PMV[0],h_r_size,motion_code,motion_residual,full_pel_vector); |
if (dmv) |
dmvector[0] = Get_dmvector(); |
/* vertical component */ |
motion_code = Get_motion_code(); |
motion_residual = (v_r_size!=0 && motion_code!=0) ? Get_Bits(v_r_size) : 0; |
#ifdef TRACE |
if (Trace_Flag) |
{ |
if (v_r_size!=0 && motion_code!=0) |
{ |
cprintf("motion_residual ("); |
Print_Bits(motion_residual,v_r_size,v_r_size); |
cprintf("): %d\n",motion_residual); |
} |
} |
#endif /* TRACE */ |
if (mvscale) |
PMV[1] >>= 1; /* DIV 2 */ |
decode_motion_vector(&PMV[1],v_r_size,motion_code,motion_residual,full_pel_vector); |
if (mvscale) |
PMV[1] <<= 1; |
if (dmv) |
dmvector[1] = Get_dmvector(); |
#ifdef TRACE |
if (Trace_Flag) |
cprintf("PMV = %d,%d\n",PMV[0],PMV[1]); |
#endif /* TRACE */ |
} |
/* calculate motion vector component */ |
/* ISO/IEC 13818-2 section 7.6.3.1: Decoding the motion vectors */ |
/* Note: the arithmetic here is more elegant than that which is shown |
in 7.6.3.1. The end results (PMV[][][]) should, however, be the same. */ |
static void decode_motion_vector(pred,r_size,motion_code,motion_residual,full_pel_vector) |
int *pred; |
int r_size, motion_code, motion_residual; |
int full_pel_vector; /* MPEG-1 (ISO/IEC 11172-1) support */ |
{ |
int lim, vec; |
lim = 16<<r_size; |
vec = full_pel_vector ? (*pred >> 1) : (*pred); |
if (motion_code>0) |
{ |
vec+= ((motion_code-1)<<r_size) + motion_residual + 1; |
if (vec>=lim) |
vec-= lim + lim; |
} |
else if (motion_code<0) |
{ |
vec-= ((-motion_code-1)<<r_size) + motion_residual + 1; |
if (vec<-lim) |
vec+= lim + lim; |
} |
*pred = full_pel_vector ? (vec<<1) : vec; |
} |
/* ISO/IEC 13818-2 section 7.6.3.6: Dual prime additional arithmetic */ |
void Dual_Prime_Arithmetic(DMV,dmvector,mvx,mvy) |
int DMV[][2]; |
int *dmvector; /* differential motion vector */ |
int mvx, mvy; /* decoded mv components (always in field format) */ |
{ |
if (picture_structure==FRAME_PICTURE) |
{ |
if (top_field_first) |
{ |
/* vector for prediction of top field from bottom field */ |
DMV[0][0] = ((mvx +(mvx>0))>>1) + dmvector[0]; |
DMV[0][1] = ((mvy +(mvy>0))>>1) + dmvector[1] - 1; |
/* vector for prediction of bottom field from top field */ |
DMV[1][0] = ((3*mvx+(mvx>0))>>1) + dmvector[0]; |
DMV[1][1] = ((3*mvy+(mvy>0))>>1) + dmvector[1] + 1; |
} |
else |
{ |
/* vector for prediction of top field from bottom field */ |
DMV[0][0] = ((3*mvx+(mvx>0))>>1) + dmvector[0]; |
DMV[0][1] = ((3*mvy+(mvy>0))>>1) + dmvector[1] - 1; |
/* vector for prediction of bottom field from top field */ |
DMV[1][0] = ((mvx +(mvx>0))>>1) + dmvector[0]; |
DMV[1][1] = ((mvy +(mvy>0))>>1) + dmvector[1] + 1; |
} |
} |
else |
{ |
/* vector for prediction from field of opposite 'parity' */ |
DMV[0][0] = ((mvx+(mvx>0))>>1) + dmvector[0]; |
DMV[0][1] = ((mvy+(mvy>0))>>1) + dmvector[1]; |
/* correct for vertical field shift */ |
if (picture_structure==TOP_FIELD) |
DMV[0][1]--; |
else |
DMV[0][1]++; |
} |
} |
/demos/tags/rel_1_5_beta1/first/mpeg2/global.h |
---|
0,0 → 1,497 |
/* global.h, global variables */ |
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */ |
/* |
* Disclaimer of Warranty |
* |
* These software programs are available to the user without any license fee or |
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims |
* any and all warranties, whether express, implied, or statuary, including any |
* implied warranties or merchantability or of fitness for a particular |
* purpose. In no event shall the copyright-holder be liable for any |
* incidental, punitive, or consequential damages of any kind whatsoever |
* arising from the use of these programs. |
* |
* This disclaimer of warranty extends to the user of these programs and user's |
* customers, employees, agents, transferees, successors, and assigns. |
* |
* The MPEG Software Simulation Group does not represent or warrant that the |
* programs furnished hereunder are free of infringement of any third-party |
* patents. |
* |
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware, |
* are subject to royalty fees to patent holders. Many of these patents are |
* general enough such that they are unavoidable regardless of implementation |
* design. |
* |
*/ |
#include "ll/sys/types.h" |
#include "kernel/kern.h" |
#include "mpeg2dec.h" |
/* choose between declaration (GLOBAL undefined) |
* and definition (GLOBAL defined) |
* GLOBAL is defined in exactly one file mpeg2dec.c) |
*/ |
#ifndef GLOBAL |
#define EXTERN extern |
#else |
#define EXTERN |
#endif |
/* prototypes of global functions */ |
/* readpic.c */ |
void Substitute_Frame_Buffer _ANSI_ARGS_ ((int bitstream_framenum, |
int sequence_framenum)); |
/* Get_Bits.c */ |
void Initialize_Buffer _ANSI_ARGS_((void)); |
void Fill_Buffer _ANSI_ARGS_((void)); |
unsigned int Show_Bits _ANSI_ARGS_((int n)); |
unsigned int Get_Bits1 _ANSI_ARGS_((void)); |
void Flush_Buffer _ANSI_ARGS_((int n)); |
unsigned int Get_Bits _ANSI_ARGS_((int n)); |
int Get_Byte _ANSI_ARGS_((void)); |
int Get_Word _ANSI_ARGS_((void)); |
/* systems.c */ |
void Next_Packet _ANSI_ARGS_((void)); |
int Get_Long _ANSI_ARGS_((void)); |
void Flush_Buffer32 _ANSI_ARGS_((void)); |
unsigned int Get_Bits32 _ANSI_ARGS_((void)); |
/* getblk.c */ |
void Decode_MPEG1_Intra_Block _ANSI_ARGS_((int comp, int dc_dct_pred[])); |
void Decode_MPEG1_Non_Intra_Block _ANSI_ARGS_((int comp)); |
void Decode_MPEG2_Intra_Block _ANSI_ARGS_((int comp, int dc_dct_pred[])); |
void Decode_MPEG2_Non_Intra_Block _ANSI_ARGS_((int comp)); |
/* gethdr.c */ |
int Get_Hdr _ANSI_ARGS_((void)); |
void next_start_code _ANSI_ARGS_((void)); |
int slice_header _ANSI_ARGS_((void)); |
void marker_bit _ANSI_ARGS_((char *text)); |
/* getpic.c */ |
void Decode_Picture _ANSI_ARGS_((int bitstream_framenum, |
int sequence_framenum)); |
void Output_Last_Frame_of_Sequence _ANSI_ARGS_((int framenum)); |
/* getvlc.c */ |
int Get_macroblock_type _ANSI_ARGS_((void)); |
int Get_motion_code _ANSI_ARGS_((void)); |
int Get_dmvector _ANSI_ARGS_((void)); |
int Get_coded_block_pattern _ANSI_ARGS_((void)); |
int Get_macroblock_address_increment _ANSI_ARGS_((void)); |
int Get_Luma_DC_dct_diff _ANSI_ARGS_((void)); |
int Get_Chroma_DC_dct_diff _ANSI_ARGS_((void)); |
/* idct.c */ |
void Fast_IDCT _ANSI_ARGS_((short *block)); |
void Initialize_Fast_IDCT _ANSI_ARGS_((void)); |
/* Reference_IDCT.c */ |
void Initialize_Reference_IDCT _ANSI_ARGS_((void)); |
void Reference_IDCT _ANSI_ARGS_((short *block)); |
/* motion.c */ |
void motion_vectors _ANSI_ARGS_((int PMV[2][2][2], int dmvector[2], |
int motion_vertical_field_select[2][2], int s, int motion_vector_count, |
int mv_format, int h_r_size, int v_r_size, int dmv, int mvscale)); |
void motion_vector _ANSI_ARGS_((int *PMV, int *dmvector, |
int h_r_size, int v_r_size, int dmv, int mvscale, int full_pel_vector)); |
void Dual_Prime_Arithmetic _ANSI_ARGS_((int DMV[][2], int *dmvector, int mvx, int mvy)); |
/* mpeg2dec.c */ |
void Error _ANSI_ARGS_((char *text)); |
void Warning _ANSI_ARGS_((char *text)); |
void Print_Bits _ANSI_ARGS_((int code, int bits, int len)); |
/* recon.c */ |
void form_predictions _ANSI_ARGS_((int bx, int by, int macroblock_type, |
int motion_type, int PMV[2][2][2], int motion_vertical_field_select[2][2], |
int dmvector[2], int stwtype)); |
/* spatscal.c */ |
void Spatial_Prediction _ANSI_ARGS_((void)); |
/* store.c */ |
void Write_Frame _ANSI_ARGS_((unsigned char *src[], int frame)); |
#ifdef DISPLAY |
/* display.c */ |
void Initialize_Display_Process _ANSI_ARGS_((char *name)); |
void Terminate_Display_Process _ANSI_ARGS_((void)); |
void Display_Second_Field _ANSI_ARGS_((void)); |
void dither _ANSI_ARGS_((unsigned char *src[])); |
void Initialize_Dither_Matrix _ANSI_ARGS_((void)); |
#endif |
/* global variables */ |
EXTERN char Version[] |
#ifdef GLOBAL |
="mpeg2decode V1.2a, 96/07/19" |
#endif |
; |
EXTERN char Author[] |
#ifdef GLOBAL |
="(C) 1996, MPEG Software Simulation Group" |
#endif |
; |
/* zig-zag and alternate scan patterns */ |
EXTERN unsigned char scan[2][64] |
#ifdef GLOBAL |
= |
{ |
{ /* Zig-Zag scan pattern */ |
0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5, |
12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28, |
35,42,49,56,57,50,43,36,29,22,15,23,30,37,44,51, |
58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63 |
}, |
{ /* Alternate scan pattern */ |
0,8,16,24,1,9,2,10,17,25,32,40,48,56,57,49, |
41,33,26,18,3,11,4,12,19,27,34,42,50,58,35,43, |
51,59,20,28,5,13,6,14,21,29,36,44,52,60,37,45, |
53,61,22,30,7,15,23,31,38,46,54,62,39,47,55,63 |
} |
} |
#endif |
; |
/* default intra quantization matrix */ |
EXTERN unsigned char default_intra_quantizer_matrix[64] |
#ifdef GLOBAL |
= |
{ |
8, 16, 19, 22, 26, 27, 29, 34, |
16, 16, 22, 24, 27, 29, 34, 37, |
19, 22, 26, 27, 29, 34, 34, 38, |
22, 22, 26, 27, 29, 34, 37, 40, |
22, 26, 27, 29, 32, 35, 40, 48, |
26, 27, 29, 32, 35, 40, 48, 58, |
26, 27, 29, 34, 38, 46, 56, 69, |
27, 29, 35, 38, 46, 56, 69, 83 |
} |
#endif |
; |
/* non-linear quantization coefficient table */ |
EXTERN unsigned char Non_Linear_quantizer_scale[32] |
#ifdef GLOBAL |
= |
{ |
0, 1, 2, 3, 4, 5, 6, 7, |
8,10,12,14,16,18,20,22, |
24,28,32,36,40,44,48,52, |
56,64,72,80,88,96,104,112 |
} |
#endif |
; |
/* color space conversion coefficients |
* for YCbCr -> RGB mapping |
* |
* entries are {crv,cbu,cgu,cgv} |
* |
* crv=(255/224)*65536*(1-cr)/0.5 |
* cbu=(255/224)*65536*(1-cb)/0.5 |
* cgu=(255/224)*65536*(cb/cg)*(1-cb)/0.5 |
* cgv=(255/224)*65536*(cr/cg)*(1-cr)/0.5 |
* |
* where Y=cr*R+cg*G+cb*B (cr+cg+cb=1) |
*/ |
/* ISO/IEC 13818-2 section 6.3.6 sequence_display_extension() */ |
EXTERN int Inverse_Table_6_9[8][4] |
#ifdef GLOBAL |
= |
{ |
{117504, 138453, 13954, 34903}, /* no sequence_display_extension */ |
{117504, 138453, 13954, 34903}, /* ITU-R Rec. 709 (1990) */ |
{104597, 132201, 25675, 53279}, /* unspecified */ |
{104597, 132201, 25675, 53279}, /* reserved */ |
{104448, 132798, 24759, 53109}, /* FCC */ |
{104597, 132201, 25675, 53279}, /* ITU-R Rec. 624-4 System B, G */ |
{104597, 132201, 25675, 53279}, /* SMPTE 170M */ |
{117579, 136230, 16907, 35559} /* SMPTE 240M (1987) */ |
} |
#endif |
; |
/* output types (Output_Type) */ |
#define T_YUV 0 |
#define T_SIF 1 |
#define T_TGA 2 |
#define T_PPM 3 |
#define T_X11 4 |
#define T_X11HIQ 5 |
/* decoder operation control variables */ |
EXTERN int Output_Type; |
EXTERN int hiQdither; |
/* decoder operation control flags */ |
EXTERN int Quiet_Flag; |
EXTERN int Trace_Flag; |
EXTERN int Fault_Flag; |
EXTERN int Verbose_Flag; |
EXTERN int Two_Streams; |
EXTERN int Spatial_Flag; |
EXTERN int Reference_IDCT_Flag; |
EXTERN int Frame_Store_Flag; |
EXTERN int System_Stream_Flag; |
EXTERN int Display_Progressive_Flag; |
EXTERN int Ersatz_Flag; |
EXTERN int Big_Picture_Flag; |
EXTERN int Verify_Flag; |
EXTERN int Stats_Flag; |
EXTERN int User_Data_Flag; |
EXTERN int Main_Bitstream_Flag; |
/* filenames */ |
EXTERN char *Output_Picture_Filename; |
EXTERN char *Substitute_Picture_Filename; |
EXTERN char *Main_Bitstream_Filename; |
EXTERN char *Enhancement_Layer_Bitstream_Filename; |
/* buffers for multiuse purposes */ |
EXTERN char Error_Text[256]; |
EXTERN unsigned char *Clip; |
/* pointers to generic picture buffers */ |
EXTERN unsigned char *backward_reference_frame[3]; |
EXTERN unsigned char *forward_reference_frame[3]; |
EXTERN unsigned char *auxframe[3]; |
EXTERN unsigned char *current_frame[3]; |
EXTERN unsigned char *substitute_frame[3]; |
/* pointers to scalability picture buffers */ |
EXTERN unsigned char *llframe0[3]; |
EXTERN unsigned char *llframe1[3]; |
EXTERN short *lltmp; |
EXTERN char *Lower_Layer_Picture_Filename; |
/* non-normative variables derived from normative elements */ |
EXTERN int Coded_Picture_Width; |
EXTERN int Coded_Picture_Height; |
EXTERN int Chroma_Width; |
EXTERN int Chroma_Height; |
EXTERN int block_count; |
EXTERN int Second_Field; |
EXTERN int profile, level; |
/* normative derived variables (as per ISO/IEC 13818-2) */ |
EXTERN int horizontal_size; |
EXTERN int vertical_size; |
EXTERN int mb_width; |
EXTERN int mb_height; |
EXTERN double bit_rate; |
EXTERN double frame_rate; |
/* headers */ |
/* ISO/IEC 13818-2 section 6.2.2.1: sequence_header() */ |
EXTERN int aspect_ratio_information; |
EXTERN int frame_rate_code; |
EXTERN int bit_rate_value; |
EXTERN int vbv_buffer_size; |
EXTERN int constrained_parameters_flag; |
/* ISO/IEC 13818-2 section 6.2.2.3: sequence_extension() */ |
EXTERN int profile_and_level_indication; |
EXTERN int progressive_sequence; |
EXTERN int chroma_format; |
EXTERN int low_delay; |
EXTERN int frame_rate_extension_n; |
EXTERN int frame_rate_extension_d; |
/* ISO/IEC 13818-2 section 6.2.2.4: sequence_display_extension() */ |
EXTERN int video_format; |
EXTERN int color_description; |
EXTERN int color_primaries; |
EXTERN int transfer_characteristics; |
EXTERN int matrix_coefficients; |
EXTERN int display_horizontal_size; |
EXTERN int display_vertical_size; |
/* ISO/IEC 13818-2 section 6.2.3: picture_header() */ |
EXTERN int temporal_reference; |
EXTERN int picture_coding_type; |
EXTERN int vbv_delay; |
EXTERN int full_pel_forward_vector; |
EXTERN int forward_f_code; |
EXTERN int full_pel_backward_vector; |
EXTERN int backward_f_code; |
/* ISO/IEC 13818-2 section 6.2.3.1: picture_coding_extension() header */ |
EXTERN int f_code[2][2]; |
EXTERN int intra_dc_precision; |
EXTERN int picture_structure; |
EXTERN int top_field_first; |
EXTERN int frame_pred_frame_dct; |
EXTERN int concealment_motion_vectors; |
EXTERN int intra_vlc_format; |
EXTERN int repeat_first_field; |
EXTERN int chroma_420_type; |
EXTERN int progressive_frame; |
EXTERN int composite_display_flag; |
EXTERN int v_axis; |
EXTERN int field_sequence; |
EXTERN int sub_carrier; |
EXTERN int burst_amplitude; |
EXTERN int sub_carrier_phase; |
/* ISO/IEC 13818-2 section 6.2.3.3: picture_display_extension() header */ |
EXTERN int frame_center_horizontal_offset[3]; |
EXTERN int frame_center_vertical_offset[3]; |
/* ISO/IEC 13818-2 section 6.2.2.5: sequence_scalable_extension() header */ |
EXTERN int layer_id; |
EXTERN int lower_layer_prediction_horizontal_size; |
EXTERN int lower_layer_prediction_vertical_size; |
EXTERN int horizontal_subsampling_factor_m; |
EXTERN int horizontal_subsampling_factor_n; |
EXTERN int vertical_subsampling_factor_m; |
EXTERN int vertical_subsampling_factor_n; |
/* ISO/IEC 13818-2 section 6.2.3.5: picture_spatial_scalable_extension() header */ |
EXTERN int lower_layer_temporal_reference; |
EXTERN int lower_layer_horizontal_offset; |
EXTERN int lower_layer_vertical_offset; |
EXTERN int spatial_temporal_weight_code_table_index; |
EXTERN int lower_layer_progressive_frame; |
EXTERN int lower_layer_deinterlaced_field_select; |
/* ISO/IEC 13818-2 section 6.2.3.6: copyright_extension() header */ |
EXTERN int copyright_flag; |
EXTERN int copyright_identifier; |
EXTERN int original_or_copy; |
EXTERN int copyright_number_1; |
EXTERN int copyright_number_2; |
EXTERN int copyright_number_3; |
/* ISO/IEC 13818-2 section 6.2.2.6: group_of_pictures_header() */ |
EXTERN int drop_flag; |
EXTERN int hour; |
EXTERN int minute; |
EXTERN int sec; |
EXTERN int frame; |
EXTERN int closed_gop; |
EXTERN int broken_link; |
/* layer specific variables (needed for SNR and DP scalability) */ |
EXTERN struct layer_data { |
/* bit input */ |
int Infile; |
void *start_file_ptr; |
void *actual_file_ptr; |
void *end_file_ptr; |
int px; |
int py; |
unsigned char Rdbfr[2048]; |
unsigned char *Rdptr; |
unsigned char Inbfr[16]; |
/* from mpeg2play */ |
unsigned int Bfr; |
unsigned char *Rdmax; |
int Incnt; |
int Bitcnt; |
/* sequence header and quant_matrix_extension() */ |
int intra_quantizer_matrix[64]; |
int non_intra_quantizer_matrix[64]; |
int chroma_intra_quantizer_matrix[64]; |
int chroma_non_intra_quantizer_matrix[64]; |
int load_intra_quantizer_matrix; |
int load_non_intra_quantizer_matrix; |
int load_chroma_intra_quantizer_matrix; |
int load_chroma_non_intra_quantizer_matrix; |
int MPEG2_Flag; |
/* sequence scalable extension */ |
int scalable_mode; |
/* picture coding extension */ |
int q_scale_type; |
int alternate_scan; |
/* picture spatial scalable extension */ |
int pict_scal; |
/* slice/macroblock */ |
int priority_breakpoint; |
int quantizer_scale; |
int intra_slice; |
short block[12][64]; |
} base, enhan, *ld; |
#ifdef VERIFY |
EXTERN int verify_sequence_header; |
EXTERN int verify_group_of_pictures_header; |
EXTERN int verify_picture_header; |
EXTERN int verify_slice_header; |
EXTERN int verify_sequence_extension; |
EXTERN int verify_sequence_display_extension; |
EXTERN int verify_quant_matrix_extension; |
EXTERN int verify_sequence_scalable_extension; |
EXTERN int verify_picture_display_extension; |
EXTERN int verify_picture_coding_extension; |
EXTERN int verify_picture_spatial_scalable_extension; |
EXTERN int verify_picture_temporal_scalable_extension; |
EXTERN int verify_copyright_extension; |
#endif /* VERIFY */ |
EXTERN int Decode_Layer; |
/* verify.c */ |
#ifdef VERIFY |
void Check_Headers _ANSI_ARGS_((int Bitstream_Framenum, int Sequence_Framenum)); |
void Clear_Verify_Headers _ANSI_ARGS_((void)); |
#endif /* VERIFY */ |
EXTERN int global_MBA; |
EXTERN int global_pic; |
EXTERN int True_Framenum; |
/demos/tags/rel_1_5_beta1/first/mpeg2/recon.c |
---|
0,0 → 1,465 |
/* Predict.c, motion compensation routines */ |
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */ |
/* |
* Disclaimer of Warranty |
* |
* These software programs are available to the user without any license fee or |
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims |
* any and all warranties, whether express, implied, or statuary, including any |
* implied warranties or merchantability or of fitness for a particular |
* purpose. In no event shall the copyright-holder be liable for any |
* incidental, punitive, or consequential damages of any kind whatsoever |
* arising from the use of these programs. |
* |
* This disclaimer of warranty extends to the user of these programs and user's |
* customers, employees, agents, transferees, successors, and assigns. |
* |
* The MPEG Software Simulation Group does not represent or warrant that the |
* programs furnished hereunder are free of infringement of any third-party |
* patents. |
* |
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware, |
* are subject to royalty fees to patent holders. Many of these patents are |
* general enough such that they are unavoidable regardless of implementation |
* design. |
* |
*/ |
#include "config.h" |
#include "global.h" |
/* private prototypes */ |
static void form_prediction _ANSI_ARGS_((unsigned char *src[], int sfield, |
unsigned char *dst[], int dfield, |
int lx, int lx2, int w, int h, int x, int y, int dx, int dy, |
int average_flag)); |
static void form_component_prediction _ANSI_ARGS_((unsigned char *src, unsigned char *dst, |
int lx, int lx2, int w, int h, int x, int y, int dx, int dy, int average_flag)); |
void form_predictions(bx,by,macroblock_type,motion_type,PMV,motion_vertical_field_select,dmvector,stwtype) |
int bx, by; |
int macroblock_type; |
int motion_type; |
int PMV[2][2][2], motion_vertical_field_select[2][2], dmvector[2]; |
int stwtype; |
{ |
int currentfield; |
unsigned char **predframe; |
int DMV[2][2]; |
int stwtop, stwbot; |
stwtop = stwtype%3; /* 0:temporal, 1:(spat+temp)/2, 2:spatial */ |
stwbot = stwtype/3; |
if ((macroblock_type & MACROBLOCK_MOTION_FORWARD) |
|| (picture_coding_type==P_TYPE)) |
{ |
if (picture_structure==FRAME_PICTURE) |
{ |
if ((motion_type==MC_FRAME) |
|| !(macroblock_type & MACROBLOCK_MOTION_FORWARD)) |
{ |
/* frame-based prediction (broken into top and bottom halves |
for spatial scalability prediction purposes) */ |
if (stwtop<2) |
form_prediction(forward_reference_frame,0,current_frame,0, |
Coded_Picture_Width,Coded_Picture_Width<<1,16,8,bx,by, |
PMV[0][0][0],PMV[0][0][1],stwtop); |
if (stwbot<2) |
form_prediction(forward_reference_frame,1,current_frame,1, |
Coded_Picture_Width,Coded_Picture_Width<<1,16,8,bx,by, |
PMV[0][0][0],PMV[0][0][1],stwbot); |
} |
else if (motion_type==MC_FIELD) /* field-based prediction */ |
{ |
/* top field prediction */ |
if (stwtop<2) |
form_prediction(forward_reference_frame,motion_vertical_field_select[0][0], |
current_frame,0,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8, |
bx,by>>1,PMV[0][0][0],PMV[0][0][1]>>1,stwtop); |
/* bottom field prediction */ |
if (stwbot<2) |
form_prediction(forward_reference_frame,motion_vertical_field_select[1][0], |
current_frame,1,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8, |
bx,by>>1,PMV[1][0][0],PMV[1][0][1]>>1,stwbot); |
} |
else if (motion_type==MC_DMV) /* dual prime prediction */ |
{ |
/* calculate derived motion vectors */ |
Dual_Prime_Arithmetic(DMV,dmvector,PMV[0][0][0],PMV[0][0][1]>>1); |
if (stwtop<2) |
{ |
/* predict top field from top field */ |
form_prediction(forward_reference_frame,0,current_frame,0, |
Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by>>1, |
PMV[0][0][0],PMV[0][0][1]>>1,0); |
/* predict and add to top field from bottom field */ |
form_prediction(forward_reference_frame,1,current_frame,0, |
Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by>>1, |
DMV[0][0],DMV[0][1],1); |
} |
if (stwbot<2) |
{ |
/* predict bottom field from bottom field */ |
form_prediction(forward_reference_frame,1,current_frame,1, |
Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by>>1, |
PMV[0][0][0],PMV[0][0][1]>>1,0); |
/* predict and add to bottom field from top field */ |
form_prediction(forward_reference_frame,0,current_frame,1, |
Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by>>1, |
DMV[1][0],DMV[1][1],1); |
} |
} |
else |
/* invalid motion_type */ |
cprintf("invalid motion_type\n"); |
} |
else /* TOP_FIELD or BOTTOM_FIELD */ |
{ |
/* field picture */ |
currentfield = (picture_structure==BOTTOM_FIELD); |
/* determine which frame to use for prediction */ |
if ((picture_coding_type==P_TYPE) && Second_Field |
&& (currentfield!=motion_vertical_field_select[0][0])) |
predframe = backward_reference_frame; /* same frame */ |
else |
predframe = forward_reference_frame; /* previous frame */ |
if ((motion_type==MC_FIELD) |
|| !(macroblock_type & MACROBLOCK_MOTION_FORWARD)) |
{ |
/* field-based prediction */ |
if (stwtop<2) |
form_prediction(predframe,motion_vertical_field_select[0][0],current_frame,0, |
Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,16,bx,by, |
PMV[0][0][0],PMV[0][0][1],stwtop); |
} |
else if (motion_type==MC_16X8) |
{ |
if (stwtop<2) |
{ |
form_prediction(predframe,motion_vertical_field_select[0][0],current_frame,0, |
Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by, |
PMV[0][0][0],PMV[0][0][1],stwtop); |
/* determine which frame to use for lower half prediction */ |
if ((picture_coding_type==P_TYPE) && Second_Field |
&& (currentfield!=motion_vertical_field_select[1][0])) |
predframe = backward_reference_frame; /* same frame */ |
else |
predframe = forward_reference_frame; /* previous frame */ |
form_prediction(predframe,motion_vertical_field_select[1][0],current_frame,0, |
Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by+8, |
PMV[1][0][0],PMV[1][0][1],stwtop); |
} |
} |
else if (motion_type==MC_DMV) /* dual prime prediction */ |
{ |
if (Second_Field) |
predframe = backward_reference_frame; /* same frame */ |
else |
predframe = forward_reference_frame; /* previous frame */ |
/* calculate derived motion vectors */ |
Dual_Prime_Arithmetic(DMV,dmvector,PMV[0][0][0],PMV[0][0][1]); |
/* predict from field of same parity */ |
form_prediction(forward_reference_frame,currentfield,current_frame,0, |
Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,16,bx,by, |
PMV[0][0][0],PMV[0][0][1],0); |
/* predict from field of opposite parity */ |
form_prediction(predframe,!currentfield,current_frame,0, |
Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,16,bx,by, |
DMV[0][0],DMV[0][1],1); |
} |
else |
/* invalid motion_type */ |
cprintf("invalid motion_type\n"); |
} |
stwtop = stwbot = 1; |
} |
if (macroblock_type & MACROBLOCK_MOTION_BACKWARD) |
{ |
if (picture_structure==FRAME_PICTURE) |
{ |
if (motion_type==MC_FRAME) |
{ |
/* frame-based prediction */ |
if (stwtop<2) |
form_prediction(backward_reference_frame,0,current_frame,0, |
Coded_Picture_Width,Coded_Picture_Width<<1,16,8,bx,by, |
PMV[0][1][0],PMV[0][1][1],stwtop); |
if (stwbot<2) |
form_prediction(backward_reference_frame,1,current_frame,1, |
Coded_Picture_Width,Coded_Picture_Width<<1,16,8,bx,by, |
PMV[0][1][0],PMV[0][1][1],stwbot); |
} |
else /* field-based prediction */ |
{ |
/* top field prediction */ |
if (stwtop<2) |
form_prediction(backward_reference_frame,motion_vertical_field_select[0][1], |
current_frame,0,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8, |
bx,by>>1,PMV[0][1][0],PMV[0][1][1]>>1,stwtop); |
/* bottom field prediction */ |
if (stwbot<2) |
form_prediction(backward_reference_frame,motion_vertical_field_select[1][1], |
current_frame,1,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8, |
bx,by>>1,PMV[1][1][0],PMV[1][1][1]>>1,stwbot); |
} |
} |
else /* TOP_FIELD or BOTTOM_FIELD */ |
{ |
/* field picture */ |
if (motion_type==MC_FIELD) |
{ |
/* field-based prediction */ |
form_prediction(backward_reference_frame,motion_vertical_field_select[0][1], |
current_frame,0,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,16, |
bx,by,PMV[0][1][0],PMV[0][1][1],stwtop); |
} |
else if (motion_type==MC_16X8) |
{ |
form_prediction(backward_reference_frame,motion_vertical_field_select[0][1], |
current_frame,0,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8, |
bx,by,PMV[0][1][0],PMV[0][1][1],stwtop); |
form_prediction(backward_reference_frame,motion_vertical_field_select[1][1], |
current_frame,0,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8, |
bx,by+8,PMV[1][1][0],PMV[1][1][1],stwtop); |
} |
else |
/* invalid motion_type */ |
cprintf("invalid motion_type\n"); |
} |
} |
} |
static void form_prediction(src,sfield,dst,dfield,lx,lx2,w,h,x,y,dx,dy,average_flag) |
unsigned char *src[]; /* prediction source buffer */ |
int sfield; /* prediction source field number (0 or 1) */ |
unsigned char *dst[]; /* prediction destination buffer */ |
int dfield; /* prediction destination field number (0 or 1)*/ |
int lx,lx2; /* line strides */ |
int w,h; /* prediction block/sub-block width, height */ |
int x,y; /* pixel co-ordinates of top-left sample in current MB */ |
int dx,dy; /* horizontal, vertical prediction address */ |
int average_flag; /* add prediction error to prediction ? */ |
{ |
/* Y */ |
form_component_prediction(src[0]+(sfield?lx2>>1:0),dst[0]+(dfield?lx2>>1:0), |
lx,lx2,w,h,x,y,dx,dy,average_flag); |
if (chroma_format!=CHROMA444) |
{ |
lx>>=1; lx2>>=1; w>>=1; x>>=1; dx/=2; |
} |
if (chroma_format==CHROMA420) |
{ |
h>>=1; y>>=1; dy/=2; |
} |
/* Cb */ |
form_component_prediction(src[1]+(sfield?lx2>>1:0),dst[1]+(dfield?lx2>>1:0), |
lx,lx2,w,h,x,y,dx,dy,average_flag); |
/* Cr */ |
form_component_prediction(src[2]+(sfield?lx2>>1:0),dst[2]+(dfield?lx2>>1:0), |
lx,lx2,w,h,x,y,dx,dy,average_flag); |
} |
/* ISO/IEC 13818-2 section 7.6.4: Forming predictions */ |
/* NOTE: the arithmetic below produces numerically equivalent results |
* to 7.6.4, yet is more elegant. It differs in the following ways: |
* |
* 1. the vectors (dx, dy) are based on cartesian frame |
* coordiantes along a half-pel grid (always positive numbers) |
* In contrast, vector[r][s][t] are differential (with positive and |
* negative values). As a result, deriving the integer vectors |
* (int_vec[t]) from dx, dy is accomplished by a simple right shift. |
* |
* 2. Half pel flags (xh, yh) are equivalent to the LSB (Least |
* Significant Bit) of the half-pel coordinates (dx,dy). |
* |
* |
* NOTE: the work of combining predictions (ISO/IEC 13818-2 section 7.6.7) |
* is distributed among several other stages. This is accomplished by |
* folding line offsets into the source and destination (src,dst) |
* addresses (note the call arguments to form_prediction() in Predict()), |
* line stride variables lx and lx2, the block dimension variables (w,h), |
* average_flag, and by the very order in which Predict() is called. |
* This implementation design (implicitly different than the spec) |
* was chosen for its elegance. |
*/ |
static void form_component_prediction(src,dst,lx,lx2,w,h,x,y,dx,dy,average_flag) |
unsigned char *src; |
unsigned char *dst; |
int lx; /* raster line increment */ |
int lx2; |
int w,h; |
int x,y; |
int dx,dy; |
int average_flag; /* flag that signals bi-directional or Dual-Prime |
averaging (7.6.7.1 and 7.6.7.4). if average_flag==1, |
a previously formed prediction has been stored in |
pel_pred[] */ |
{ |
int xint; /* horizontal integer sample vector: analogous to int_vec[0] */ |
int yint; /* vertical integer sample vectors: analogous to int_vec[1] */ |
int xh; /* horizontal half sample flag: analogous to half_flag[0] */ |
int yh; /* vertical half sample flag: analogous to half_flag[1] */ |
int i, j, v; |
unsigned char *s; /* source pointer: analogous to pel_ref[][] */ |
unsigned char *d; /* destination pointer: analogous to pel_pred[][] */ |
/* half pel scaling for integer vectors */ |
xint = dx>>1; |
yint = dy>>1; |
/* derive half pel flags */ |
xh = dx & 1; |
yh = dy & 1; |
/* compute the linear address of pel_ref[][] and pel_pred[][] |
based on cartesian/raster cordinates provided */ |
s = src + lx*(y+yint) + x + xint; |
d = dst + lx*y + x; |
if (!xh && !yh) /* no horizontal nor vertical half-pel */ |
{ |
if (average_flag) |
{ |
for (j=0; j<h; j++) |
{ |
for (i=0; i<w; i++) |
{ |
v = d[i]+s[i]; |
d[i] = (v+(v>=0?1:0))>>1; |
} |
s+= lx2; |
d+= lx2; |
} |
} |
else |
{ |
for (j=0; j<h; j++) |
{ |
for (i=0; i<w; i++) |
{ |
d[i] = s[i]; |
} |
s+= lx2; |
d+= lx2; |
} |
} |
} |
else if (!xh && yh) /* no horizontal but vertical half-pel */ |
{ |
if (average_flag) |
{ |
for (j=0; j<h; j++) |
{ |
for (i=0; i<w; i++) |
{ |
v = d[i] + ((unsigned int)(s[i]+s[i+lx]+1)>>1); |
d[i]=(v+(v>=0?1:0))>>1; |
} |
s+= lx2; |
d+= lx2; |
} |
} |
else |
{ |
for (j=0; j<h; j++) |
{ |
for (i=0; i<w; i++) |
{ |
d[i] = (unsigned int)(s[i]+s[i+lx]+1)>>1; |
} |
s+= lx2; |
d+= lx2; |
} |
} |
} |
else if (xh && !yh) /* horizontal but no vertical half-pel */ |
{ |
if (average_flag) |
{ |
for (j=0; j<h; j++) |
{ |
for (i=0; i<w; i++) |
{ |
v = d[i] + ((unsigned int)(s[i]+s[i+1]+1)>>1); |
d[i] = (v+(v>=0?1:0))>>1; |
} |
s+= lx2; |
d+= lx2; |
} |
} |
else |
{ |
for (j=0; j<h; j++) |
{ |
for (i=0; i<w; i++) |
{ |
d[i] = (unsigned int)(s[i]+s[i+1]+1)>>1; |
} |
s+= lx2; |
d+= lx2; |
} |
} |
} |
else /* if (xh && yh) horizontal and vertical half-pel */ |
{ |
if (average_flag) |
{ |
for (j=0; j<h; j++) |
{ |
for (i=0; i<w; i++) |
{ |
v = d[i] + ((unsigned int)(s[i]+s[i+1]+s[i+lx]+s[i+lx+1]+2)>>2); |
d[i] = (v+(v>=0?1:0))>>1; |
} |
s+= lx2; |
d+= lx2; |
} |
} |
else |
{ |
for (j=0; j<h; j++) |
{ |
for (i=0; i<w; i++) |
{ |
d[i] = (unsigned int)(s[i]+s[i+1]+s[i+lx]+s[i+lx+1]+2)>>2; |
} |
s+= lx2; |
d+= lx2; |
} |
} |
} |
} |
/demos/tags/rel_1_5_beta1/first/mpeg2/systems.c |
---|
0,0 → 1,195 |
/* systems.c, systems-specific routines */ |
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */ |
/* |
* Disclaimer of Warranty |
* |
* These software programs are available to the user without any license fee or |
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims |
* any and all warranties, whether express, implied, or statuary, including any |
* implied warranties or merchantability or of fitness for a particular |
* purpose. In no event shall the copyright-holder be liable for any |
* incidental, punitive, or consequential damages of any kind whatsoever |
* arising from the use of these programs. |
* |
* This disclaimer of warranty extends to the user of these programs and user's |
* customers, employees, agents, transferees, successors, and assigns. |
* |
* The MPEG Software Simulation Group does not represent or warrant that the |
* programs furnished hereunder are free of infringement of any third-party |
* patents. |
* |
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware, |
* are subject to royalty fees to patent holders. Many of these patents are |
* general enough such that they are unavoidable regardless of implementation |
* design. |
* |
*/ |
#include <stdlib.h> |
#include "config.h" |
#include "global.h" |
/* initialize buffer, call once before first getbits or showbits */ |
/* parse system layer, ignore everything we don't need */ |
void Next_Packet() |
{ |
unsigned int code; |
int l; |
for(;;) |
{ |
code = Get_Long(); |
/* remove system layer byte stuffing */ |
while ((code & 0xffffff00) != 0x100) |
code = (code<<8) | Get_Byte(); |
switch(code) |
{ |
case PACK_START_CODE: /* pack header */ |
/* skip pack header (system_clock_reference and mux_rate) */ |
ld->Rdptr += 8; |
break; |
case VIDEO_ELEMENTARY_STREAM: |
code = Get_Word(); /* packet_length */ |
ld->Rdmax = ld->Rdptr + code; |
code = Get_Byte(); |
if((code>>6)==0x02) |
{ |
ld->Rdptr++; |
code=Get_Byte(); /* parse PES_header_data_length */ |
ld->Rdptr+=code; /* advance pointer by PES_header_data_length */ |
cprintf("MPEG-2 PES packet\n"); |
return; |
} |
else if(code==0xff) |
{ |
/* parse MPEG-1 packet header */ |
while((code=Get_Byte())== 0xFF); |
} |
/* stuffing bytes */ |
if(code>=0x40) |
{ |
if(code>=0x80) |
{ |
cprintf("Error in packet header\n"); |
} |
/* skip STD_buffer_scale */ |
ld->Rdptr++; |
code = Get_Byte(); |
} |
if(code>=0x30) |
{ |
if(code>=0x40) |
{ |
cprintf("Error in packet header\n"); |
} |
/* skip presentation and decoding time stamps */ |
ld->Rdptr += 9; |
} |
else if(code>=0x20) |
{ |
/* skip presentation time stamps */ |
ld->Rdptr += 4; |
} |
else if(code!=0x0f) |
{ |
cprintf("Error in packet header\n"); |
} |
return; |
case ISO_END_CODE: /* end */ |
/* simulate a buffer full of sequence end codes */ |
l = 0; |
while (l<2048) |
{ |
ld->Rdbfr[l++] = SEQUENCE_END_CODE>>24; |
ld->Rdbfr[l++] = SEQUENCE_END_CODE>>16; |
ld->Rdbfr[l++] = SEQUENCE_END_CODE>>8; |
ld->Rdbfr[l++] = SEQUENCE_END_CODE&0xff; |
} |
ld->Rdptr = ld->Rdbfr; |
ld->Rdmax = ld->Rdbfr + 2048; |
return; |
default: |
if(code>=SYSTEM_START_CODE) |
{ |
/* skip system headers and non-video packets*/ |
code = Get_Word(); |
ld->Rdptr += code; |
} |
else |
{ |
cprintf("Unexpected startcode %08x in system layer\n",code); |
} |
break; |
} |
} |
} |
void Flush_Buffer32() |
{ |
int Incnt; |
ld->Bfr = 0; |
Incnt = ld->Incnt; |
Incnt -= 32; |
if (System_Stream_Flag && (ld->Rdptr >= ld->Rdmax-4)) |
{ |
while (Incnt <= 24) |
{ |
if (ld->Rdptr >= ld->Rdmax) |
Next_Packet(); |
ld->Bfr |= Get_Byte() << (24 - Incnt); |
Incnt += 8; |
} |
} |
else |
{ |
while (Incnt <= 24) |
{ |
if (ld->Rdptr >= ld->Rdbfr+2048) |
Fill_Buffer(); |
ld->Bfr |= *ld->Rdptr++ << (24 - Incnt); |
Incnt += 8; |
} |
} |
ld->Incnt = Incnt; |
#ifdef VERIFY |
ld->Bitcnt += 32; |
#endif /* VERIFY */ |
} |
unsigned int Get_Bits32() |
{ |
unsigned int l; |
l = Show_Bits(32); |
Flush_Buffer32(); |
return l; |
} |
int Get_Long() |
{ |
int i; |
i = Get_Word(); |
return (i<<16) | Get_Word(); |
} |
/demos/tags/rel_1_5_beta1/first/mpeg2/getblk.c |
---|
0,0 → 1,571 |
/* getblk.c, DCT block decoding */ |
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */ |
/* |
* Disclaimer of Warranty |
* |
* These software programs are available to the user without any license fee or |
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims |
* any and all warranties, whether express, implied, or statuary, including any |
* implied warranties or merchantability or of fitness for a particular |
* purpose. In no event shall the copyright-holder be liable for any |
* incidental, punitive, or consequential damages of any kind whatsoever |
* arising from the use of these programs. |
* |
* This disclaimer of warranty extends to the user of these programs and user's |
* customers, employees, agents, transferees, successors, and assigns. |
* |
* The MPEG Software Simulation Group does not represent or warrant that the |
* programs furnished hereunder are free of infringement of any third-party |
* patents. |
* |
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware, |
* are subject to royalty fees to patent holders. Many of these patents are |
* general enough such that they are unavoidable regardless of implementation |
* design. |
* |
*/ |
#include "config.h" |
#include "global.h" |
/* defined in getvlc.h */ |
typedef struct { |
char run, level, len; |
} DCTtab; |
extern DCTtab DCTtabfirst[],DCTtabnext[],DCTtab0[],DCTtab1[]; |
extern DCTtab DCTtab2[],DCTtab3[],DCTtab4[],DCTtab5[],DCTtab6[]; |
extern DCTtab DCTtab0a[],DCTtab1a[]; |
/* decode one intra coded MPEG-1 block */ |
void Decode_MPEG1_Intra_Block(comp,dc_dct_pred) |
int comp; |
int dc_dct_pred[]; |
{ |
int val, i, j, sign; |
unsigned int code; |
DCTtab *tab; |
short *bp; |
bp = ld->block[comp]; |
/* ISO/IEC 11172-2 section 2.4.3.7: Block layer. */ |
/* decode DC coefficients */ |
if (comp<4) |
bp[0] = (dc_dct_pred[0]+=Get_Luma_DC_dct_diff()) << 3; |
else if (comp==4) |
bp[0] = (dc_dct_pred[1]+=Get_Chroma_DC_dct_diff()) << 3; |
else |
bp[0] = (dc_dct_pred[2]+=Get_Chroma_DC_dct_diff()) << 3; |
if (Fault_Flag) return; |
/* D-pictures do not contain AC coefficients */ |
if(picture_coding_type == D_TYPE) |
return; |
/* decode AC coefficients */ |
for (i=1; ; i++) |
{ |
code = Show_Bits(16); |
if (code>=16384) |
tab = &DCTtabnext[(code>>12)-4]; |
else if (code>=1024) |
tab = &DCTtab0[(code>>8)-4]; |
else if (code>=512) |
tab = &DCTtab1[(code>>6)-8]; |
else if (code>=256) |
tab = &DCTtab2[(code>>4)-16]; |
else if (code>=128) |
tab = &DCTtab3[(code>>3)-16]; |
else if (code>=64) |
tab = &DCTtab4[(code>>2)-16]; |
else if (code>=32) |
tab = &DCTtab5[(code>>1)-16]; |
else if (code>=16) |
tab = &DCTtab6[code-16]; |
else |
{ |
if (!Quiet_Flag) |
cprintf("invalid Huffman code in Decode_MPEG1_Intra_Block()\n"); |
Fault_Flag = 1; |
return; |
} |
Flush_Buffer(tab->len); |
if (tab->run==64) /* end_of_block */ |
return; |
if (tab->run==65) /* escape */ |
{ |
i+= Get_Bits(6); |
val = Get_Bits(8); |
if (val==0) |
val = Get_Bits(8); |
else if (val==128) |
val = Get_Bits(8) - 256; |
else if (val>128) |
val -= 256; |
if((sign = (val<0))) |
val = -val; |
} |
else |
{ |
i+= tab->run; |
val = tab->level; |
sign = Get_Bits(1); |
} |
if (i>=64) |
{ |
if (!Quiet_Flag) |
cprintf("DCT coeff index (i) out of bounds (intra)\n"); |
Fault_Flag = 1; |
return; |
} |
j = scan[ZIG_ZAG][i]; |
val = (val*ld->quantizer_scale*ld->intra_quantizer_matrix[j]) >> 3; |
/* mismatch control ('oddification') */ |
if (val!=0) /* should always be true, but it's not guaranteed */ |
val = (val-1) | 1; /* equivalent to: if ((val&1)==0) val = val - 1; */ |
/* saturation */ |
if (!sign) |
bp[j] = (val>2047) ? 2047 : val; /* positive */ |
else |
bp[j] = (val>2048) ? -2048 : -val; /* negative */ |
} |
} |
/* decode one non-intra coded MPEG-1 block */ |
void Decode_MPEG1_Non_Intra_Block(comp) |
int comp; |
{ |
int val, i, j, sign; |
unsigned int code; |
DCTtab *tab; |
short *bp; |
bp = ld->block[comp]; |
/* decode AC coefficients */ |
for (i=0; ; i++) |
{ |
code = Show_Bits(16); |
if (code>=16384) |
{ |
if (i==0) |
tab = &DCTtabfirst[(code>>12)-4]; |
else |
tab = &DCTtabnext[(code>>12)-4]; |
} |
else if (code>=1024) |
tab = &DCTtab0[(code>>8)-4]; |
else if (code>=512) |
tab = &DCTtab1[(code>>6)-8]; |
else if (code>=256) |
tab = &DCTtab2[(code>>4)-16]; |
else if (code>=128) |
tab = &DCTtab3[(code>>3)-16]; |
else if (code>=64) |
tab = &DCTtab4[(code>>2)-16]; |
else if (code>=32) |
tab = &DCTtab5[(code>>1)-16]; |
else if (code>=16) |
tab = &DCTtab6[code-16]; |
else |
{ |
if (!Quiet_Flag) |
cprintf("invalid Huffman code in Decode_MPEG1_Non_Intra_Block()\n"); |
Fault_Flag = 1; |
return; |
} |
Flush_Buffer(tab->len); |
if (tab->run==64) /* end_of_block */ |
return; |
if (tab->run==65) /* escape */ |
{ |
i+= Get_Bits(6); |
val = Get_Bits(8); |
if (val==0) |
val = Get_Bits(8); |
else if (val==128) |
val = Get_Bits(8) - 256; |
else if (val>128) |
val -= 256; |
if((sign = (val<0))) |
val = -val; |
} |
else |
{ |
i+= tab->run; |
val = tab->level; |
sign = Get_Bits(1); |
} |
if (i>=64) |
{ |
if (!Quiet_Flag) |
cprintf("DCT coeff index (i) out of bounds (inter)\n"); |
Fault_Flag = 1; |
return; |
} |
j = scan[ZIG_ZAG][i]; |
val = (((val<<1)+1)*ld->quantizer_scale*ld->non_intra_quantizer_matrix[j]) >> 4; |
/* mismatch control ('oddification') */ |
if (val!=0) /* should always be true, but it's not guaranteed */ |
val = (val-1) | 1; /* equivalent to: if ((val&1)==0) val = val - 1; */ |
/* saturation */ |
if (!sign) |
bp[j] = (val>2047) ? 2047 : val; /* positive */ |
else |
bp[j] = (val>2048) ? -2048 : -val; /* negative */ |
} |
} |
/* decode one intra coded MPEG-2 block */ |
void Decode_MPEG2_Intra_Block(comp,dc_dct_pred) |
int comp; |
int dc_dct_pred[]; |
{ |
int val, i, j, sign, nc, cc, run; |
unsigned int code; |
DCTtab *tab; |
short *bp; |
int *qmat; |
struct layer_data *ld1; |
/* with data partitioning, data always goes to base layer */ |
ld1 = (ld->scalable_mode==SC_DP) ? &base : ld; |
bp = ld1->block[comp]; |
if (base.scalable_mode==SC_DP) { |
if (base.priority_breakpoint<64) |
ld = &enhan; |
else |
ld = &base; |
} |
cc = (comp<4) ? 0 : (comp&1)+1; |
qmat = (comp<4 || chroma_format==CHROMA420) |
? ld1->intra_quantizer_matrix |
: ld1->chroma_intra_quantizer_matrix; |
/* ISO/IEC 13818-2 section 7.2.1: decode DC coefficients */ |
if (cc==0) |
val = (dc_dct_pred[0]+= Get_Luma_DC_dct_diff()); |
else if (cc==1) |
val = (dc_dct_pred[1]+= Get_Chroma_DC_dct_diff()); |
else |
val = (dc_dct_pred[2]+= Get_Chroma_DC_dct_diff()); |
if (Fault_Flag) return; |
bp[0] = val << (3-intra_dc_precision); |
nc=0; |
#ifdef TRACE |
if (Trace_Flag) |
cprintf("DCT(%d)i:",comp); |
#endif /* TRACE */ |
/* decode AC coefficients */ |
for (i=1; ; i++) |
{ |
code = Show_Bits(16); |
if (code>=16384 && !intra_vlc_format) |
tab = &DCTtabnext[(code>>12)-4]; |
else if (code>=1024) |
{ |
if (intra_vlc_format) |
tab = &DCTtab0a[(code>>8)-4]; |
else |
tab = &DCTtab0[(code>>8)-4]; |
} |
else if (code>=512) |
{ |
if (intra_vlc_format) |
tab = &DCTtab1a[(code>>6)-8]; |
else |
tab = &DCTtab1[(code>>6)-8]; |
} |
else if (code>=256) |
tab = &DCTtab2[(code>>4)-16]; |
else if (code>=128) |
tab = &DCTtab3[(code>>3)-16]; |
else if (code>=64) |
tab = &DCTtab4[(code>>2)-16]; |
else if (code>=32) |
tab = &DCTtab5[(code>>1)-16]; |
else if (code>=16) |
tab = &DCTtab6[code-16]; |
else |
{ |
if (!Quiet_Flag) |
cprintf("invalid Huffman code in Decode_MPEG2_Intra_Block()\n"); |
Fault_Flag = 1; |
return; |
} |
Flush_Buffer(tab->len); |
#ifdef TRACE |
if (Trace_Flag) |
{ |
printf(" ("); |
Print_Bits(code,16,tab->len); |
} |
#endif /* TRACE */ |
if (tab->run==64) /* end_of_block */ |
{ |
#ifdef TRACE |
if (Trace_Flag) |
printf("): EOB\n"); |
#endif /* TRACE */ |
return; |
} |
if (tab->run==65) /* escape */ |
{ |
#ifdef TRACE |
if (Trace_Flag) |
{ |
putchar(' '); |
Print_Bits(Show_Bits(6),6,6); |
} |
#endif /* TRACE */ |
i+= run = Get_Bits(6); |
#ifdef TRACE |
if (Trace_Flag) |
{ |
putchar(' '); |
Print_Bits(Show_Bits(12),12,12); |
} |
#endif /* TRACE */ |
val = Get_Bits(12); |
if ((val&2047)==0) |
{ |
if (!Quiet_Flag) |
cprintf("invalid escape in Decode_MPEG2_Intra_Block()\n"); |
Fault_Flag = 1; |
return; |
} |
if((sign = (val>=2048))) |
val = 4096 - val; |
} |
else |
{ |
i+= run = tab->run; |
val = tab->level; |
sign = Get_Bits(1); |
#ifdef TRACE |
if (Trace_Flag) |
cprintf("%d",sign); |
#endif /* TRACE */ |
} |
if (i>=64) |
{ |
if (!Quiet_Flag) |
cprintf("DCT coeff index (i) out of bounds (intra2)\n"); |
Fault_Flag = 1; |
return; |
} |
#ifdef TRACE |
if (Trace_Flag) |
cprintf("): %d/%d",run,sign ? -val : val); |
#endif /* TRACE */ |
j = scan[ld1->alternate_scan][i]; |
val = (val * ld1->quantizer_scale * qmat[j]) >> 4; |
bp[j] = sign ? -val : val; |
nc++; |
if (base.scalable_mode==SC_DP && nc==base.priority_breakpoint-63) |
ld = &enhan; |
} |
} |
/* decode one non-intra coded MPEG-2 block */ |
void Decode_MPEG2_Non_Intra_Block(comp) |
int comp; |
{ |
int val, i, j, sign, nc, run; |
unsigned int code; |
DCTtab *tab; |
short *bp; |
int *qmat; |
struct layer_data *ld1; |
/* with data partitioning, data always goes to base layer */ |
ld1 = (ld->scalable_mode==SC_DP) ? &base : ld; |
bp = ld1->block[comp]; |
if (base.scalable_mode==SC_DP) { |
if (base.priority_breakpoint<64) |
ld = &enhan; |
else |
ld = &base; |
} |
qmat = (comp<4 || chroma_format==CHROMA420) |
? ld1->non_intra_quantizer_matrix |
: ld1->chroma_non_intra_quantizer_matrix; |
nc = 0; |
#ifdef TRACE |
if (Trace_Flag) |
cprintf("DCT(%d)n:",comp); |
#endif /* TRACE */ |
/* decode AC coefficients */ |
for (i=0; ; i++) |
{ |
code = Show_Bits(16); |
if (code>=16384) |
{ |
if (i==0) |
tab = &DCTtabfirst[(code>>12)-4]; |
else |
tab = &DCTtabnext[(code>>12)-4]; |
} |
else if (code>=1024) |
tab = &DCTtab0[(code>>8)-4]; |
else if (code>=512) |
tab = &DCTtab1[(code>>6)-8]; |
else if (code>=256) |
tab = &DCTtab2[(code>>4)-16]; |
else if (code>=128) |
tab = &DCTtab3[(code>>3)-16]; |
else if (code>=64) |
tab = &DCTtab4[(code>>2)-16]; |
else if (code>=32) |
tab = &DCTtab5[(code>>1)-16]; |
else if (code>=16) |
tab = &DCTtab6[code-16]; |
else |
{ |
if (!Quiet_Flag) |
cprintf("invalid Huffman code in Decode_MPEG2_Non_Intra_Block()\n"); |
Fault_Flag = 1; |
return; |
} |
Flush_Buffer(tab->len); |
#ifdef TRACE |
if (Trace_Flag) |
{ |
cprintf(" ("); |
Print_Bits(code,16,tab->len); |
} |
#endif /* TRACE */ |
if (tab->run==64) /* end_of_block */ |
{ |
#ifdef TRACE |
if (Trace_Flag) |
cprintf("): EOB\n"); |
#endif /* TRACE */ |
return; |
} |
if (tab->run==65) /* escape */ |
{ |
#ifdef TRACE |
if (Trace_Flag) |
{ |
cprintf(" "); |
Print_Bits(Show_Bits(6),6,6); |
} |
#endif /* TRACE */ |
i+= run = Get_Bits(6); |
#ifdef TRACE |
if (Trace_Flag) |
{ |
cprintf(" "); |
Print_Bits(Show_Bits(12),12,12); |
} |
#endif /* TRACE */ |
val = Get_Bits(12); |
if ((val&2047)==0) |
{ |
if (!Quiet_Flag) |
cprintf("invalid escape in Decode_MPEG2_Intra_Block()\n"); |
Fault_Flag = 1; |
return; |
} |
if((sign = (val>=2048))) |
val = 4096 - val; |
} |
else |
{ |
i+= run = tab->run; |
val = tab->level; |
sign = Get_Bits(1); |
#ifdef TRACE |
if (Trace_Flag) |
cprintf("%d",sign); |
#endif /* TRACE */ |
} |
if (i>=64) |
{ |
if (!Quiet_Flag) |
cprintf("DCT coeff index (i) out of bounds (inter2)\n"); |
Fault_Flag = 1; |
return; |
} |
#ifdef TRACE |
if (Trace_Flag) |
cprintf("): %d/%d",run,sign?-val:val); |
#endif /* TRACE */ |
j = scan[ld1->alternate_scan][i]; |
val = (((val<<1)+1) * ld1->quantizer_scale * qmat[j]) >> 5; |
bp[j] = sign ? -val : val; |
nc++; |
if (base.scalable_mode==SC_DP && nc==base.priority_breakpoint-63) |
ld = &enhan; |
} |
} |
/demos/tags/rel_1_5_beta1/first/mpeg2/subspic.c |
---|
0,0 → 1,384 |
/* #define DEBUG */ |
/* subspic.c, Frame buffer substitution routines */ |
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */ |
/* |
* Disclaimer of Warranty |
* |
* These software programs are available to the user without any license fee or |
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims |
* any and all warranties, whether express, implied, or statuary, including any |
* implied warranties or merchantability or of fitness for a particular |
* purpose. In no event shall the copyright-holder be liable for any |
* incidental, punitive, or consequential damages of any kind whatsoever |
* arising from the use of these programs. |
* |
* This disclaimer of warranty extends to the user of these programs and user's |
* customers, employees, agents, transferees, successors, and assigns. |
* |
* The MPEG Software Simulation Group does not represent or warrant that the |
* programs furnished hereunder are free of infringement of any third-party |
* patents. |
* |
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware, |
* are subject to royalty fees to patent holders. Many of these patents are |
* general enough such that they are unavoidable regardless of implementation |
* design. |
* |
*/ |
#include <stdlib.h> |
#include "config.h" |
#include "global.h" |
/* private prototypes*/ |
static void Read_Frame _ANSI_ARGS_((char *filename, |
unsigned char *frame_buffer[], int framenum)); |
static void Copy_Frame _ANSI_ARGS_((unsigned char *src, unsigned char *dst, |
int width, int height, int parity, int incr)); |
static int Read_Components _ANSI_ARGS_ ((char *filename, |
unsigned char *frame[3], int framenum)); |
static int Read_Component _ANSI_ARGS_ ((char *fname, unsigned char *frame, |
int width, int height)); |
static int Extract_Components _ANSI_ARGS_ ((char *filename, |
unsigned char *frame[3], int framenum)); |
extern int read(int Infile, void *Rdbfr, int rdsize); |
/* substitute frame buffer routine */ |
void Substitute_Frame_Buffer (bitstream_framenum, sequence_framenum) |
int bitstream_framenum; |
int sequence_framenum; |
{ |
/* static tracking variables */ |
static int previous_temporal_reference; |
static int previous_bitstream_framenum; |
static int previous_anchor_temporal_reference; |
static int previous_anchor_bitstream_framenum; |
static int previous_picture_coding_type; |
static int bgate; |
/* local temporary variables */ |
int substitute_display_framenum; |
#ifdef DEBUG |
cprintf("SUB: seq fn(%d) bitfn(%d) tempref(%d) picstr(%d) type(%d)\n", |
sequence_framenum, bitstream_framenum, temporal_reference, |
picture_structure, picture_coding_type); |
#endif |
/* we don't substitute at the first picture of a sequence */ |
if((sequence_framenum!=0)||(Second_Field)) |
{ |
/* only at the start of the frame */ |
if ((picture_structure==FRAME_PICTURE)||(!Second_Field)) |
{ |
if(picture_coding_type==P_TYPE) |
{ |
/* the most recently decoded reference frame needs substituting */ |
substitute_display_framenum = bitstream_framenum - 1; |
Read_Frame(Substitute_Picture_Filename, forward_reference_frame, |
substitute_display_framenum); |
} |
/* only the first B frame in a consequitve set of B pictures |
loads a substitute backward_reference_frame since all subsequent |
B frames predict from the same reference pictures */ |
else if((picture_coding_type==B_TYPE)&&(bgate!=1)) |
{ |
substitute_display_framenum = |
(previous_temporal_reference - temporal_reference) |
+ bitstream_framenum - 1; |
Read_Frame(Substitute_Picture_Filename, backward_reference_frame, |
substitute_display_framenum); |
} |
} /* P fields can predict from the two most recently decoded fields, even |
from the first field of the same frame being decoded */ |
else if(Second_Field && (picture_coding_type==P_TYPE)) |
{ |
/* our favourite case: the IP field picture pair */ |
if((previous_picture_coding_type==I_TYPE)&&(picture_coding_type==P_TYPE)) |
{ |
substitute_display_framenum = bitstream_framenum; |
} |
else /* our more generic P field picture pair */ |
{ |
substitute_display_framenum = |
(temporal_reference - previous_anchor_temporal_reference) |
+ bitstream_framenum - 1; |
} |
Read_Frame(Substitute_Picture_Filename, current_frame, substitute_display_framenum); |
} |
#ifdef DEBUG |
else if((picture_coding_type!=B_TYPE)||(picture_coding_type!=D_TYPE)) |
{ |
cprintf("NO SUBS FOR THIS PICTURE\n"); |
} |
#endif |
} |
/* set b gate so we don't redundantly load next time around */ |
if(picture_coding_type==B_TYPE) |
bgate = 1; |
else |
bgate = 0; |
/* update general tracking variables */ |
if((picture_structure==FRAME_PICTURE)||(!Second_Field)) |
{ |
previous_temporal_reference = temporal_reference; |
previous_bitstream_framenum = bitstream_framenum; |
} |
/* update reference frame tracking variables */ |
if((picture_coding_type!=B_TYPE) && |
((picture_structure==FRAME_PICTURE)||Second_Field)) |
{ |
previous_anchor_temporal_reference = temporal_reference; |
previous_anchor_bitstream_framenum = bitstream_framenum; |
} |
previous_picture_coding_type = picture_coding_type; |
} |
/* Note: fields are only read to serve as the same-frame reference for |
a second field */ |
static void Read_Frame(fname,frame,framenum) |
char *fname; |
unsigned char *frame[]; |
int framenum; |
{ |
int parity; |
int rerr = 0; |
int field_mode; |
if(framenum<0) |
cprintf("ERROR: framenum (%d) is less than zero\n", framenum); |
if(Big_Picture_Flag) |
rerr = Extract_Components(fname, substitute_frame, framenum); |
else |
rerr = Read_Components(fname, substitute_frame, framenum); |
if(rerr!=0) |
{ |
cprintf("was unable to substitute frame\n"); |
} |
/* now copy to the appropriate buffer */ |
/* first field (which we are attempting to substitute) must be |
of opposite field parity to the current one */ |
if((Second_Field)&&(picture_coding_type==P_TYPE)) |
{ |
parity = (picture_structure==TOP_FIELD ? 1:0); |
field_mode = (picture_structure==FRAME_PICTURE ? 0:1); |
} |
else |
{ |
/* Like frame structued pictures, B pictures only substitute an entire frame |
since both fields always predict from the same frame (with respect |
to forward/backwards directions) */ |
parity = 0; |
field_mode = 0; |
} |
Copy_Frame(substitute_frame[0], frame[0], Coded_Picture_Width, |
Coded_Picture_Height, parity, field_mode); |
Copy_Frame(substitute_frame[1], frame[1], Chroma_Width, Chroma_Height, |
parity, field_mode); |
Copy_Frame(substitute_frame[2], frame[2], Chroma_Width, Chroma_Height, |
parity, field_mode); |
#ifdef VERBOSE |
if(Verbose_Flag > NO_LAYER) |
cprintf("substituted %s %d\n", |
(field_mode ? (parity?"bottom field":"bottom field"):"frame"), framenum); |
#endif |
} |
static int Read_Components(filename, frame, framenum) |
char *filename; |
unsigned char *frame[3]; |
int framenum; |
{ |
int err = 0; |
char outname[FILENAME_LENGTH]; |
char name[FILENAME_LENGTH]; |
sprintf(outname,filename,framenum); |
sprintf(name,"%s.Y",outname); |
err += Read_Component(name, frame[0], Coded_Picture_Width, |
Coded_Picture_Height); |
sprintf(name,"%s.U",outname); |
err += Read_Component(name, frame[1], Chroma_Width, Chroma_Height); |
sprintf(name,"%s.V",outname); |
err += Read_Component(name, frame[2], Chroma_Width, Chroma_Height); |
return(err); |
} |
static int Read_Component(Filename, Frame, Width, Height) |
char *Filename; |
unsigned char *Frame; |
int Width; |
int Height; |
{ |
int Size; |
int Bytes_Read; |
int Infile; |
Size = Width*Height; |
#ifdef DEBUG |
cprintf("SUBS: reading %s\n", filename); |
#endif |
if(!(Infile=1)<0) |
{ |
cprintf("ERROR: unable to open reference filename (%s)\n", Filename); |
return(-1); |
} |
Bytes_Read = read(Infile, Frame, Size); |
if(Bytes_Read!=Size) |
{ |
cprintf("was able to read only %d bytes of %d of file %s\n", |
Bytes_Read, Size, Filename); |
} |
return(0); |
} |
/* optimization: do not open the big file each time. Open once at start |
of decoder, and close at the very last frame */ |
/* Note: "big" files were used in E-mail exchanges almost exclusively by the |
MPEG Committee's syntax validation and conformance ad-hoc groups from |
the year 1993 until 1995 */ |
static int Extract_Components(filename, frame, framenum) |
char *filename; |
unsigned char *frame[3]; |
int framenum; |
{ |
/* int err = 0; */ |
int line; |
int size, offset; |
cprintf("Extract_Components\n"); |
/* compute size of each frame (in bytes) */ |
size = (Coded_Picture_Width*Coded_Picture_Height); |
if(chroma_format==CHROMA444) |
size = (size * 3); |
else if(chroma_format==CHROMA422) |
size = (size * 2); |
else if(chroma_format==CHROMA420) |
size = ((size*3)>>1); |
else |
cprintf("ERROR: chroma_format (%d) not recognized\n", chroma_format); |
/* compute distance into "big" file */ |
offset = size*framenum; |
#ifdef DEBUG |
printf("EXTRACTING: frame(%d) offset(%d), size (%d) from %s\n", |
framenum, offset, size, filename); |
#endif |
/* seek to location in big file where desired frame begins */ |
/* note: this offset cannot exceed a few billion bytes due to the */ |
/* obvious limitations of 32-bit integers */ |
//fseek(fd, offset, 0); |
/* Y */ |
for (line=0; line<Coded_Picture_Height; line++) |
{ |
//fread(frame[0]+(line*Coded_Picture_Width),1,Coded_Picture_Width,fd); |
} |
/* Cb */ |
for (line=0; line<Chroma_Height; line++) |
{ |
//fread(frame[1]+(line*Chroma_Width),1,Chroma_Width,fd); |
} |
/* Cr */ |
for (line=0; line<Chroma_Height; line++) |
{ |
//fread(frame[2]+(line*Chroma_Width),1,Chroma_Width,fd); |
} |
//fclose(fd); |
return(0); |
} |
static void Copy_Frame(src, dst, width, height, parity, field_mode) |
unsigned char *src; |
unsigned char *dst; |
int width; |
int height; |
int parity; /* field parity (top or bottom) to overwrite */ |
int field_mode; /* 0 = frame, 1 = field */ |
{ |
int row, col; |
int s, d; |
int incr; |
s = d = 0; |
#ifdef DEBUG |
cprintf("COPYING (w=%d, h=%d, parity=%d, field_mode=%d)\n", |
width,height,parity,field_mode); |
#endif /* DEBUG */ |
if(field_mode) |
{ |
incr = 2; |
if(parity==0) |
s += width; |
} |
else |
{ |
incr = 1; |
} |
for(row=0; row<height; row+=incr) |
{ |
for(col=0; col<width; col++) |
{ |
dst[d+col] = src[s+col]; |
} |
d += (width*incr); |
s += (width*incr); |
} |
} |
/demos/tags/rel_1_5_beta1/first/mpeg2/config.h |
---|
0,0 → 1,45 |
/* config.h, configuration defines */ |
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */ |
/* |
* Disclaimer of Warranty |
* |
* These software programs are available to the user without any license fee or |
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims |
* any and all warranties, whether express, implied, or statuary, including any |
* implied warranties or merchantability or of fitness for a particular |
* purpose. In no event shall the copyright-holder be liable for any |
* incidental, punitive, or consequential damages of any kind whatsoever |
* arising from the use of these programs. |
* |
* This disclaimer of warranty extends to the user of these programs and user's |
* customers, employees, agents, transferees, successors, and assigns. |
* |
* The MPEG Software Simulation Group does not represent or warrant that the |
* programs furnished hereunder are free of infringement of any third-party |
* patents. |
* |
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware, |
* are subject to royalty fees to patent holders. Many of these patents are |
* general enough such that they are unavoidable regardless of implementation |
* design. |
* |
*/ |
/* define NON_ANSI_COMPILER for compilers without function prototyping */ |
/* #define NON_ANSI_COMPILER */ |
#ifdef NON_ANSI_COMPILER |
#define _ANSI_ARGS_(x) () |
#else |
#define _ANSI_ARGS_(x) x |
#endif |
#define RB "rb" |
#define WB "wb" |
#ifndef O_BINARY |
#define O_BINARY 0 |
#endif |
/demos/tags/rel_1_5_beta1/first/mpeg2/spatscal.c |
---|
0,0 → 1,275 |
#include "config.h" |
#include "global.h" |
/* private prototypes */ |
static void Read_Lower_Layer_Component_Framewise _ANSI_ARGS_((int comp, int lw, int lh)); |
static void Read_Lower_Layer_Component_Fieldwise _ANSI_ARGS_((int comp, int lw, int lh)); |
static void Make_Spatial_Prediction_Frame _ANSI_ARGS_((int progressive_frame, |
int llprogressive_frame, unsigned char *fld0, unsigned char *fld1, |
short *tmp, unsigned char *dst, int llx0, int lly0, int llw, int llh, |
int horizontal_size, int vertical_size, int vm, int vn, int hm, int hn, |
int aperture)); |
static void Deinterlace _ANSI_ARGS_((unsigned char *fld0, unsigned char *fld1, |
int j0, int lx, int ly, int aperture)); |
static void Subsample_Vertical _ANSI_ARGS_((unsigned char *s, short *d, |
int lx, int lys, int lyd, int m, int n, int j0, int dj)); |
static void Subsample_Horizontal _ANSI_ARGS_((short *s, unsigned char *d, |
int x0, int lx, int lxs, int lxd, int ly, int m, int n)); |
/* get reference frame */ |
void Spatial_Prediction() |
{ |
if(Frame_Store_Flag) |
{ |
Read_Lower_Layer_Component_Framewise(0,lower_layer_prediction_horizontal_size, |
lower_layer_prediction_vertical_size); /* Y */ |
Read_Lower_Layer_Component_Framewise(1,lower_layer_prediction_horizontal_size>>1, |
lower_layer_prediction_vertical_size>>1); /* Cb ("U") */ |
Read_Lower_Layer_Component_Framewise(2,lower_layer_prediction_horizontal_size>>1, |
lower_layer_prediction_vertical_size>>1); /* Cr ("V") */ |
} |
else |
{ |
Read_Lower_Layer_Component_Fieldwise(0,lower_layer_prediction_horizontal_size, |
lower_layer_prediction_vertical_size); /* Y */ |
Read_Lower_Layer_Component_Fieldwise(1,lower_layer_prediction_horizontal_size>>1, |
lower_layer_prediction_vertical_size>>1); /* Cb ("U") */ |
Read_Lower_Layer_Component_Fieldwise(2,lower_layer_prediction_horizontal_size>>1, |
lower_layer_prediction_vertical_size>>1); /* Cr ("V") */ |
} |
Make_Spatial_Prediction_Frame /* Y */ |
(progressive_frame,lower_layer_progressive_frame,llframe0[0],llframe1[0], |
lltmp,current_frame[0],lower_layer_horizontal_offset, |
lower_layer_vertical_offset, |
lower_layer_prediction_horizontal_size, |
lower_layer_prediction_vertical_size, |
horizontal_size,vertical_size,vertical_subsampling_factor_m, |
vertical_subsampling_factor_n,horizontal_subsampling_factor_m, |
horizontal_subsampling_factor_n, |
picture_structure!=FRAME_PICTURE); /* this changed from CD to DIS */ |
Make_Spatial_Prediction_Frame /* Cb */ |
(progressive_frame,lower_layer_progressive_frame,llframe0[1],llframe1[1], |
lltmp,current_frame[1],lower_layer_horizontal_offset/2, |
lower_layer_vertical_offset/2, |
lower_layer_prediction_horizontal_size>>1, |
lower_layer_prediction_vertical_size>>1, |
horizontal_size>>1,vertical_size>>1,vertical_subsampling_factor_m, |
vertical_subsampling_factor_n,horizontal_subsampling_factor_m, |
horizontal_subsampling_factor_n,1); |
Make_Spatial_Prediction_Frame /* Cr */ |
(progressive_frame,lower_layer_progressive_frame,llframe0[2],llframe1[2], |
lltmp,current_frame[2],lower_layer_horizontal_offset/2, |
lower_layer_vertical_offset/2, |
lower_layer_prediction_horizontal_size>>1, |
lower_layer_prediction_vertical_size>>1, |
horizontal_size>>1,vertical_size>>1,vertical_subsampling_factor_m, |
vertical_subsampling_factor_n,horizontal_subsampling_factor_m, |
horizontal_subsampling_factor_n,1); |
} |
static void Read_Lower_Layer_Component_Framewise(comp,lw,lh) |
int comp; |
int lw, lh; |
{ |
cprintf("Read_Lower_Layer_Component_Framewise\n"); |
} |
static void Read_Lower_Layer_Component_Fieldwise(comp,lw,lh) |
int comp; |
int lw, lh; |
{ |
cprintf("Read_Lower_Layer_Component_Fieldwise\n"); |
} |
/* form spatial prediction */ |
static void Make_Spatial_Prediction_Frame(progressive_frame, |
llprogressive_frame,fld0,fld1,tmp,dst,llx0,lly0,llw,llh,horizontal_size, |
vertical_size,vm,vn,hm,hn,aperture) |
int progressive_frame,llprogressive_frame; |
unsigned char *fld0,*fld1; |
short *tmp; |
unsigned char *dst; |
int llx0,lly0,llw,llh,horizontal_size,vertical_size,vm,vn,hm,hn,aperture; |
{ |
int w, h, x0, llw2, llh2; |
llw2 = (llw*hn)/hm; |
llh2 = (llh*vn)/vm; |
if (llprogressive_frame) |
{ |
/* progressive -> progressive / interlaced */ |
Subsample_Vertical(fld0,tmp,llw,llh,llh2,vm,vn,0,1); |
} |
else if (progressive_frame) |
{ |
/* interlaced -> progressive */ |
if (lower_layer_deinterlaced_field_select) |
{ |
Deinterlace(fld1,fld0,0,llw,llh,aperture); |
Subsample_Vertical(fld1,tmp,llw,llh,llh2,vm,vn,0,1); |
} |
else |
{ |
Deinterlace(fld0,fld1,1,llw,llh,aperture); |
Subsample_Vertical(fld0,tmp,llw,llh,llh2,vm,vn,0,1); |
} |
} |
else |
{ |
/* interlaced -> interlaced */ |
Deinterlace(fld0,fld1,1,llw,llh,aperture); |
Deinterlace(fld1,fld0,0,llw,llh,aperture); |
Subsample_Vertical(fld0,tmp,llw,llh,llh2,vm,vn,0,2); |
Subsample_Vertical(fld1,tmp,llw,llh,llh2,vm,vn,1,2); |
} |
/* vertical limits */ |
if (lly0<0) |
{ |
tmp-= llw*lly0; |
llh2+= lly0; |
if (llh2<0) |
llh2 = 0; |
h = (vertical_size<llh2) ? vertical_size : llh2; |
} |
else |
{ |
dst+= horizontal_size*lly0; |
h= vertical_size - lly0; |
if (h>llh2) |
h = llh2; |
} |
/* horizontal limits */ |
if (llx0<0) |
{ |
x0 = -llx0; |
llw2+= llx0; |
if (llw2<0) |
llw2 = 0; |
w = (horizontal_size<llw2) ? horizontal_size : llw2; |
} |
else |
{ |
dst+= llx0; |
x0 = 0; |
w = horizontal_size - llx0; |
if (w>llw2) |
w = llw2; |
} |
Subsample_Horizontal(tmp,dst,x0,w,llw,horizontal_size,h,hm,hn); |
} |
/* deinterlace one field (interpolate opposite parity samples) |
* |
* deinterlacing is done in-place: if j0=1, fld0 contains the input field in |
* its even lines and the odd lines are interpolated by this routine |
* if j0=0, the input field is in the odd lines and the even lines are |
* interpolated |
* |
* fld0: field to be deinterlaced |
* fld1: other field (referenced by the two field aperture filter) |
* j0: 0: interpolate even (top) lines, 1: interpolate odd (bottom) lines |
* lx: width of fld0 and fld1 |
* ly: height of the deinterlaced field (has to be even) |
* aperture: 1: use one field aperture filter (two field otherwise) |
*/ |
static void Deinterlace(fld0,fld1,j0,lx,ly,aperture) |
unsigned char *fld0,*fld1; |
int j0,lx,ly; /* ly has to be even */ |
int aperture; |
{ |
int i,j,v; |
unsigned char *p0, *p0m1, *p0p1, *p1, *p1m2, *p1p2; |
/* deinterlace one field */ |
for (j=j0; j<ly; j+=2) |
{ |
p0 = fld0+lx*j; |
p0m1 = (j==0) ? p0+lx : p0-lx; |
p0p1 = (j==ly-1) ? p0-lx : p0+lx; |
if (aperture) |
for (i=0; i<lx; i++) |
p0[i] = (unsigned int)(p0m1[i] + p0p1[i] + 1)>>1; |
else |
{ |
p1 = fld1 + lx*j; |
p1m2 = (j<2) ? p1 : p1-2*lx; |
p1p2 = (j>=ly-2) ? p1 : p1+2*lx; |
for (i=0; i<lx; i++) |
{ |
v = 8*(p0m1[i]+p0p1[i]) + 2*p1[i] - p1m2[i] - p1p2[i]; |
p0[i] = Clip[(v + ((v>=0) ? 8 : 7))>>4]; |
} |
} |
} |
} |
/* vertical resampling */ |
static void Subsample_Vertical(s,d,lx,lys,lyd,m,n,j0,dj) |
unsigned char *s; |
short *d; |
int lx, lys, lyd, m, n, j0, dj; |
{ |
int i, j, c1, c2, jd; |
unsigned char *s1, *s2; |
short *d1; |
for (j=j0; j<lyd; j+=dj) |
{ |
d1 = d + lx*j; |
jd = (j*m)/n; |
s1 = s + lx*jd; |
s2 = (jd<lys-1)? s1+lx : s1; |
c2 = (16*((j*m)%n) + (n>>1))/n; |
c1 = 16 - c2; |
for (i=0; i<lx; i++) |
d1[i] = c1*s1[i] + c2*s2[i]; |
} |
} |
/* horizontal resampling */ |
static void Subsample_Horizontal(s,d,x0,lx,lxs,lxd,ly,m,n) |
short *s; |
unsigned char *d; |
int x0, lx, lxs, lxd, ly, m, n; |
{ |
int i, i1, j, id, c1, c2, v; |
short *s1, *s2; |
unsigned char *d1; |
for (i1=0; i1<lx; i1++) |
{ |
d1 = d + i1; |
i = x0 + i1; |
id = (i*m)/n; |
s1 = s+id; |
s2 = (id<lxs-1) ? s1+1 : s1; |
c2 = (16*((i*m)%n) + (n>>1))/n; |
c1 = 16 - c2; |
for (j=0; j<ly; j++) |
{ |
v = c1*(*s1) + c2*(*s2); |
*d1 = (v + ((v>=0) ? 128 : 127))>>8; |
d1+= lxd; |
s1+= lxs; |
s2+= lxs; |
} |
} |
} |
/demos/tags/rel_1_5_beta1/first/mpeg2/getpic.c |
---|
0,0 → 1,1223 |
/* getpic.c, picture decoding */ |
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */ |
/* |
* Disclaimer of Warranty |
* |
* These software programs are available to the user without any license fee or |
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims |
* any and all warranties, whether express, implied, or statuary, including any |
* implied warranties or merchantability or of fitness for a particular |
* purpose. In no event shall the copyright-holder be liable for any |
* incidental, punitive, or consequential damages of any kind whatsoever |
* arising from the use of these programs. |
* |
* This disclaimer of warranty extends to the user of these programs and user's |
* customers, employees, agents, transferees, successors, and assigns. |
* |
* The MPEG Software Simulation Group does not represent or warrant that the |
* programs furnished hereunder are free of infringement of any third-party |
* patents. |
* |
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware, |
* are subject to royalty fees to patent holders. Many of these patents are |
* general enough such that they are unavoidable regardless of implementation |
* design. |
* |
*/ |
#include "config.h" |
#include "global.h" |
/* private prototypes*/ |
static void picture_data _ANSI_ARGS_((int framenum)); |
static void macroblock_modes _ANSI_ARGS_((int *pmacroblock_type, int *pstwtype, |
int *pstwclass, int *pmotion_type, int *pmotion_vector_count, int *pmv_format, int *pdmv, |
int *pmvscale, int *pdct_type)); |
static void Clear_Block _ANSI_ARGS_((int comp)); |
static void Sum_Block _ANSI_ARGS_((int comp)); |
static void Saturate _ANSI_ARGS_((short *bp)); |
static void Add_Block _ANSI_ARGS_((int comp, int bx, int by, |
int dct_type, int addflag)); |
static void Update_Picture_Buffers _ANSI_ARGS_((void)); |
static void frame_reorder _ANSI_ARGS_((int bitstream_framenum, |
int sequence_framenum)); |
static void Decode_SNR_Macroblock _ANSI_ARGS_((int *SNRMBA, int *SNRMBAinc, |
int MBA, int MBAmax, int *dct_type)); |
static void motion_compensation _ANSI_ARGS_((int MBA, int macroblock_type, |
int motion_type, int PMV[2][2][2], int motion_vertical_field_select[2][2], |
int dmvector[2], int stwtype, int dct_type)); |
static void skipped_macroblock _ANSI_ARGS_((int dc_dct_pred[3], |
int PMV[2][2][2], int *motion_type, int motion_vertical_field_select[2][2], |
int *stwtype, int *macroblock_type)); |
static int slice _ANSI_ARGS_((int framenum, int MBAmax)); |
static int start_of_slice _ANSI_ARGS_ ((int MBAmax, int *MBA, |
int *MBAinc, int dc_dct_pred[3], int PMV[2][2][2])); |
static int decode_macroblock _ANSI_ARGS_((int *macroblock_type, |
int *stwtype, int *stwclass, int *motion_type, int *dct_type, |
int PMV[2][2][2], int dc_dct_pred[3], |
int motion_vertical_field_select[2][2], int dmvector[2])); |
/* decode one frame or field picture */ |
void Decode_Picture(bitstream_framenum, sequence_framenum) |
int bitstream_framenum, sequence_framenum; |
{ |
if (picture_structure==FRAME_PICTURE && Second_Field) |
{ |
/* recover from illegal number of field pictures */ |
cprintf("odd number of field pictures\n"); |
Second_Field = 0; |
} |
/* IMPLEMENTATION: update picture buffer pointers */ |
Update_Picture_Buffers(); |
#ifdef VERIFY |
Check_Headers(bitstream_framenum, sequence_framenum); |
#endif /* VERIFY */ |
/* ISO/IEC 13818-4 section 2.4.5.4 "frame buffer intercept method" */ |
/* (section number based on November 1995 (Dallas) draft of the |
conformance document) */ |
if(Ersatz_Flag) |
Substitute_Frame_Buffer(bitstream_framenum, sequence_framenum); |
/* form spatial scalable picture */ |
/* form spatial scalable picture */ |
/* ISO/IEC 13818-2 section 7.7: Spatial scalability */ |
if (base.pict_scal && !Second_Field) |
{ |
Spatial_Prediction(); |
} |
/* decode picture data ISO/IEC 13818-2 section 6.2.3.7 */ |
picture_data(bitstream_framenum); |
/* write or display current or previously decoded reference frame */ |
/* ISO/IEC 13818-2 section 6.1.1.11: Frame reordering */ |
frame_reorder(bitstream_framenum, sequence_framenum); |
if (picture_structure!=FRAME_PICTURE) |
Second_Field = !Second_Field; |
} |
/* decode all macroblocks of the current picture */ |
/* stages described in ISO/IEC 13818-2 section 7 */ |
static void picture_data(framenum) |
int framenum; |
{ |
int MBAmax; |
int ret; |
/* number of macroblocks per picture */ |
MBAmax = mb_width*mb_height; |
if (picture_structure!=FRAME_PICTURE) |
MBAmax>>=1; /* field picture has half as mnay macroblocks as frame */ |
for(;;) |
{ |
if((ret=slice(framenum, MBAmax))<0) |
return; |
} |
} |
/* decode all macroblocks of the current picture */ |
/* ISO/IEC 13818-2 section 6.3.16 */ |
static int slice(framenum, MBAmax) |
int framenum, MBAmax; |
{ |
int MBA; |
int MBAinc, macroblock_type, motion_type, dct_type; |
int dc_dct_pred[3]; |
int PMV[2][2][2], motion_vertical_field_select[2][2]; |
int dmvector[2]; |
int stwtype, stwclass; |
int SNRMBA, SNRMBAinc; |
int ret; |
MBA = 0; /* macroblock address */ |
MBAinc = 0; |
if((ret=start_of_slice(MBAmax, &MBA, &MBAinc, dc_dct_pred, PMV))!=1) |
return(ret); |
if (Two_Streams && enhan.scalable_mode==SC_SNR) |
{ |
SNRMBA=0; |
SNRMBAinc=0; |
} |
Fault_Flag=0; |
for (;;) |
{ |
/* this is how we properly exit out of picture */ |
if (MBA>=MBAmax) |
return(-1); /* all macroblocks decoded */ |
#ifdef TRACE |
if (Trace_Flag) |
cprintf("frame %d, MB %d\n",framenum,MBA); |
#endif /* TRACE */ |
#ifdef DISPLAY |
if (!progressive_frame && picture_structure==FRAME_PICTURE |
&& MBA==(MBAmax>>1) && framenum!=0 && Output_Type==T_X11 |
&& !Display_Progressive_Flag) |
{ |
Display_Second_Field(); |
} |
#endif |
ld = &base; |
if (MBAinc==0) |
{ |
if (base.scalable_mode==SC_DP && base.priority_breakpoint==1) |
ld = &enhan; |
if (!Show_Bits(23) || Fault_Flag) /* next_start_code or fault */ |
{ |
resync: /* if Fault_Flag: resynchronize to next next_start_code */ |
Fault_Flag = 0; |
return(0); /* trigger: go to next slice */ |
} |
else /* neither next_start_code nor Fault_Flag */ |
{ |
if (base.scalable_mode==SC_DP && base.priority_breakpoint==1) |
ld = &enhan; |
/* decode macroblock address increment */ |
MBAinc = Get_macroblock_address_increment(); |
if (Fault_Flag) goto resync; |
} |
} |
if (MBA>=MBAmax) |
{ |
/* MBAinc points beyond picture dimensions */ |
if (!Quiet_Flag) |
cprintf("Too many macroblocks in picture\n"); |
return(-1); |
} |
if (MBAinc==1) /* not skipped */ |
{ |
ret = decode_macroblock(¯oblock_type, &stwtype, &stwclass, |
&motion_type, &dct_type, PMV, dc_dct_pred, |
motion_vertical_field_select, dmvector); |
if(ret==-1) |
return(-1); |
if(ret==0) |
goto resync; |
} |
else /* MBAinc!=1: skipped macroblock */ |
{ |
/* ISO/IEC 13818-2 section 7.6.6 */ |
skipped_macroblock(dc_dct_pred, PMV, &motion_type, |
motion_vertical_field_select, &stwtype, ¯oblock_type); |
} |
/* SCALABILITY: SNR */ |
/* ISO/IEC 13818-2 section 7.8 */ |
/* NOTE: we currently ignore faults encountered in this routine */ |
if (Two_Streams && enhan.scalable_mode==SC_SNR) |
Decode_SNR_Macroblock(&SNRMBA, &SNRMBAinc, MBA, MBAmax, &dct_type); |
/* ISO/IEC 13818-2 section 7.6 */ |
motion_compensation(MBA, macroblock_type, motion_type, PMV, |
motion_vertical_field_select, dmvector, stwtype, dct_type); |
/* advance to next macroblock */ |
MBA++; |
MBAinc--; |
/* SCALABILITY: SNR */ |
if (Two_Streams && enhan.scalable_mode==SC_SNR) |
{ |
SNRMBA++; |
SNRMBAinc--; |
} |
if (MBA>=MBAmax) |
return(-1); /* all macroblocks decoded */ |
} |
} |
/* ISO/IEC 13818-2 section 6.3.17.1: Macroblock modes */ |
static void macroblock_modes(pmacroblock_type,pstwtype,pstwclass, |
pmotion_type,pmotion_vector_count,pmv_format,pdmv,pmvscale,pdct_type) |
int *pmacroblock_type, *pstwtype, *pstwclass; |
int *pmotion_type, *pmotion_vector_count, *pmv_format, *pdmv, *pmvscale; |
int *pdct_type; |
{ |
int macroblock_type; |
int stwtype, stwcode, stwclass; |
int motion_type = 0; |
int motion_vector_count, mv_format, dmv, mvscale; |
int dct_type; |
static unsigned char stwc_table[3][4] |
= { {6,3,7,4}, {2,1,5,4}, {2,5,7,4} }; |
static unsigned char stwclass_table[9] |
= {0, 1, 2, 1, 1, 2, 3, 3, 4}; |
/* get macroblock_type */ |
macroblock_type = Get_macroblock_type(); |
if (Fault_Flag) return; |
/* get spatial_temporal_weight_code */ |
if (macroblock_type & MB_WEIGHT) |
{ |
if (spatial_temporal_weight_code_table_index==0) |
stwtype = 4; |
else |
{ |
stwcode = Get_Bits(2); |
#ifdef TRACE |
if (Trace_Flag) |
{ |
cprintf("spatial_temporal_weight_code ("); |
Print_Bits(stwcode,2,2); |
cprintf("): %d\n",stwcode); |
} |
#endif /* TRACE */ |
stwtype = stwc_table[spatial_temporal_weight_code_table_index-1][stwcode]; |
} |
} |
else |
stwtype = (macroblock_type & MB_CLASS4) ? 8 : 0; |
/* SCALABILITY: derive spatial_temporal_weight_class (Table 7-18) */ |
stwclass = stwclass_table[stwtype]; |
/* get frame/field motion type */ |
if (macroblock_type & (MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD)) |
{ |
if (picture_structure==FRAME_PICTURE) /* frame_motion_type */ |
{ |
motion_type = frame_pred_frame_dct ? MC_FRAME : Get_Bits(2); |
#ifdef TRACE |
if (!frame_pred_frame_dct && Trace_Flag) |
{ |
cprintf("frame_motion_type ("); |
Print_Bits(motion_type,2,2); |
cprintf("): %s\n",motion_type==MC_FIELD?"Field": |
motion_type==MC_FRAME?"Frame": |
motion_type==MC_DMV?"Dual_Prime":"Invalid"); |
} |
#endif /* TRACE */ |
} |
else /* field_motion_type */ |
{ |
motion_type = Get_Bits(2); |
#ifdef TRACE |
if (Trace_Flag) |
{ |
cprintf("field_motion_type ("); |
Print_Bits(motion_type,2,2); |
cprintf("): %s\n",motion_type==MC_FIELD?"Field": |
motion_type==MC_16X8?"16x8 MC": |
motion_type==MC_DMV?"Dual_Prime":"Invalid"); |
} |
#endif /* TRACE */ |
} |
} |
else if ((macroblock_type & MACROBLOCK_INTRA) && concealment_motion_vectors) |
{ |
/* concealment motion vectors */ |
motion_type = (picture_structure==FRAME_PICTURE) ? MC_FRAME : MC_FIELD; |
} |
#if 0 |
else |
{ |
printf("maroblock_modes(): unknown macroblock type\n"); |
motion_type = -1; |
} |
#endif |
/* derive motion_vector_count, mv_format and dmv, (table 6-17, 6-18) */ |
if (picture_structure==FRAME_PICTURE) |
{ |
motion_vector_count = (motion_type==MC_FIELD && stwclass<2) ? 2 : 1; |
mv_format = (motion_type==MC_FRAME) ? MV_FRAME : MV_FIELD; |
} |
else |
{ |
motion_vector_count = (motion_type==MC_16X8) ? 2 : 1; |
mv_format = MV_FIELD; |
} |
dmv = (motion_type==MC_DMV); /* dual prime */ |
/* field mv predictions in frame pictures have to be scaled |
* ISO/IEC 13818-2 section 7.6.3.1 Decoding the motion vectors |
* IMPLEMENTATION: mvscale is derived for later use in motion_vectors() |
* it displaces the stage: |
* |
* if((mv_format=="field")&&(t==1)&&(picture_structure=="Frame picture")) |
* prediction = PMV[r][s][t] DIV 2; |
*/ |
mvscale = ((mv_format==MV_FIELD) && (picture_structure==FRAME_PICTURE)); |
/* get dct_type (frame DCT / field DCT) */ |
dct_type = (picture_structure==FRAME_PICTURE) |
&& (!frame_pred_frame_dct) |
&& (macroblock_type & (MACROBLOCK_PATTERN|MACROBLOCK_INTRA)) |
? Get_Bits(1) |
: 0; |
#ifdef TRACE |
if (Trace_Flag && (picture_structure==FRAME_PICTURE) |
&& (!frame_pred_frame_dct) |
&& (macroblock_type & (MACROBLOCK_PATTERN|MACROBLOCK_INTRA))) |
cprintf("dct_type (%d): %s\n",dct_type,dct_type?"Field":"Frame"); |
#endif /* TRACE */ |
/* return values */ |
*pmacroblock_type = macroblock_type; |
*pstwtype = stwtype; |
*pstwclass = stwclass; |
*pmotion_type = motion_type; |
*pmotion_vector_count = motion_vector_count; |
*pmv_format = mv_format; |
*pdmv = dmv; |
*pmvscale = mvscale; |
*pdct_type = dct_type; |
} |
/* move/add 8x8-Block from block[comp] to backward_reference_frame */ |
/* copy reconstructed 8x8 block from block[comp] to current_frame[] |
* ISO/IEC 13818-2 section 7.6.8: Adding prediction and coefficient data |
* This stage also embodies some of the operations implied by: |
* - ISO/IEC 13818-2 section 7.6.7: Combining predictions |
* - ISO/IEC 13818-2 section 6.1.3: Macroblock |
*/ |
static void Add_Block(comp,bx,by,dct_type,addflag) |
int comp,bx,by,dct_type,addflag; |
{ |
int cc,i, j, iincr; |
unsigned char *rfp; |
short *bp; |
/* derive color component index */ |
/* equivalent to ISO/IEC 13818-2 Table 7-1 */ |
cc = (comp<4) ? 0 : (comp&1)+1; /* color component index */ |
if (cc==0) |
{ |
/* luminance */ |
if (picture_structure==FRAME_PICTURE) |
if (dct_type) |
{ |
/* field DCT coding */ |
rfp = current_frame[0] |
+ Coded_Picture_Width*(by+((comp&2)>>1)) + bx + ((comp&1)<<3); |
iincr = (Coded_Picture_Width<<1) - 8; |
} |
else |
{ |
/* frame DCT coding */ |
rfp = current_frame[0] |
+ Coded_Picture_Width*(by+((comp&2)<<2)) + bx + ((comp&1)<<3); |
iincr = Coded_Picture_Width - 8; |
} |
else |
{ |
/* field picture */ |
rfp = current_frame[0] |
+ (Coded_Picture_Width<<1)*(by+((comp&2)<<2)) + bx + ((comp&1)<<3); |
iincr = (Coded_Picture_Width<<1) - 8; |
} |
} |
else |
{ |
/* chrominance */ |
/* scale coordinates */ |
if (chroma_format!=CHROMA444) |
bx >>= 1; |
if (chroma_format==CHROMA420) |
by >>= 1; |
if (picture_structure==FRAME_PICTURE) |
{ |
if (dct_type && (chroma_format!=CHROMA420)) |
{ |
/* field DCT coding */ |
rfp = current_frame[cc] |
+ Chroma_Width*(by+((comp&2)>>1)) + bx + (comp&8); |
iincr = (Chroma_Width<<1) - 8; |
} |
else |
{ |
/* frame DCT coding */ |
rfp = current_frame[cc] |
+ Chroma_Width*(by+((comp&2)<<2)) + bx + (comp&8); |
iincr = Chroma_Width - 8; |
} |
} |
else |
{ |
/* field picture */ |
rfp = current_frame[cc] |
+ (Chroma_Width<<1)*(by+((comp&2)<<2)) + bx + (comp&8); |
iincr = (Chroma_Width<<1) - 8; |
} |
} |
bp = ld->block[comp]; |
if (addflag) |
{ |
for (i=0; i<8; i++) |
{ |
for (j=0; j<8; j++) |
{ |
*rfp = Clip[*bp++ + *rfp]; |
rfp++; |
} |
rfp+= iincr; |
} |
} |
else |
{ |
for (i=0; i<8; i++) |
{ |
for (j=0; j<8; j++) |
*rfp++ = Clip[*bp++ + 128]; |
rfp+= iincr; |
} |
} |
} |
/* ISO/IEC 13818-2 section 7.8 */ |
static void Decode_SNR_Macroblock(SNRMBA, SNRMBAinc, MBA, MBAmax, dct_type) |
int *SNRMBA, *SNRMBAinc; |
int MBA, MBAmax; |
int *dct_type; |
{ |
int SNRmacroblock_type, SNRcoded_block_pattern, SNRdct_type, dummy; |
int slice_vert_pos_ext, quantizer_scale_code, comp, code; |
ld = &enhan; |
if (*SNRMBAinc==0) |
{ |
if (!Show_Bits(23)) /* next_start_code */ |
{ |
next_start_code(); |
code = Show_Bits(32); |
if (code<SLICE_START_CODE_MIN || code>SLICE_START_CODE_MAX) |
{ |
/* only slice headers are allowed in picture_data */ |
if (!Quiet_Flag) |
cprintf("SNR: Premature end of picture\n"); |
return; |
} |
Flush_Buffer32(); |
/* decode slice header (may change quantizer_scale) */ |
slice_vert_pos_ext = slice_header(); |
/* decode macroblock address increment */ |
*SNRMBAinc = Get_macroblock_address_increment(); |
/* set current location */ |
*SNRMBA = |
((slice_vert_pos_ext<<7) + (code&255) - 1)*mb_width + *SNRMBAinc - 1; |
*SNRMBAinc = 1; /* first macroblock in slice: not skipped */ |
} |
else /* not next_start_code */ |
{ |
if (*SNRMBA>=MBAmax) |
{ |
if (!Quiet_Flag) |
cprintf("Too many macroblocks in picture\n"); |
return; |
} |
/* decode macroblock address increment */ |
*SNRMBAinc = Get_macroblock_address_increment(); |
} |
} |
if (*SNRMBA!=MBA) |
{ |
/* streams out of sync */ |
if (!Quiet_Flag) |
cprintf("Cant't synchronize streams\n"); |
return; |
} |
if (*SNRMBAinc==1) /* not skipped */ |
{ |
macroblock_modes(&SNRmacroblock_type, &dummy, &dummy, |
&dummy, &dummy, &dummy, &dummy, &dummy, |
&SNRdct_type); |
if (SNRmacroblock_type & MACROBLOCK_PATTERN) |
*dct_type = SNRdct_type; |
if (SNRmacroblock_type & MACROBLOCK_QUANT) |
{ |
quantizer_scale_code = Get_Bits(5); |
ld->quantizer_scale = |
ld->q_scale_type ? Non_Linear_quantizer_scale[quantizer_scale_code] : quantizer_scale_code<<1; |
} |
/* macroblock_pattern */ |
if (SNRmacroblock_type & MACROBLOCK_PATTERN) |
{ |
SNRcoded_block_pattern = Get_coded_block_pattern(); |
if (chroma_format==CHROMA422) |
SNRcoded_block_pattern = (SNRcoded_block_pattern<<2) | Get_Bits(2); /* coded_block_pattern_1 */ |
else if (chroma_format==CHROMA444) |
SNRcoded_block_pattern = (SNRcoded_block_pattern<<6) | Get_Bits(6); /* coded_block_pattern_2 */ |
} |
else |
SNRcoded_block_pattern = 0; |
/* decode blocks */ |
for (comp=0; comp<block_count; comp++) |
{ |
Clear_Block(comp); |
if (SNRcoded_block_pattern & (1<<(block_count-1-comp))) |
Decode_MPEG2_Non_Intra_Block(comp); |
} |
} |
else /* SNRMBAinc!=1: skipped macroblock */ |
{ |
for (comp=0; comp<block_count; comp++) |
Clear_Block(comp); |
} |
ld = &base; |
} |
/* IMPLEMENTATION: set scratch pad macroblock to zero */ |
static void Clear_Block(comp) |
int comp; |
{ |
short *Block_Ptr; |
int i; |
Block_Ptr = ld->block[comp]; |
for (i=0; i<64; i++) |
*Block_Ptr++ = 0; |
} |
/* SCALABILITY: add SNR enhancement layer block data to base layer */ |
/* ISO/IEC 13818-2 section 7.8.3.4: Addition of coefficients from the two layes */ |
static void Sum_Block(comp) |
int comp; |
{ |
short *Block_Ptr1, *Block_Ptr2; |
int i; |
Block_Ptr1 = base.block[comp]; |
Block_Ptr2 = enhan.block[comp]; |
for (i=0; i<64; i++) |
*Block_Ptr1++ += *Block_Ptr2++; |
} |
/* limit coefficients to -2048..2047 */ |
/* ISO/IEC 13818-2 section 7.4.3 and 7.4.4: Saturation and Mismatch control */ |
static void Saturate(Block_Ptr) |
short *Block_Ptr; |
{ |
int i, sum, val; |
sum = 0; |
/* ISO/IEC 13818-2 section 7.4.3: Saturation */ |
for (i=0; i<64; i++) |
{ |
val = Block_Ptr[i]; |
if (val>2047) |
val = 2047; |
else if (val<-2048) |
val = -2048; |
Block_Ptr[i] = val; |
sum+= val; |
} |
/* ISO/IEC 13818-2 section 7.4.4: Mismatch control */ |
if ((sum&1)==0) |
Block_Ptr[63]^= 1; |
} |
/* reuse old picture buffers as soon as they are no longer needed |
based on life-time axioms of MPEG */ |
static void Update_Picture_Buffers() |
{ |
int cc; /* color component index */ |
unsigned char *tmp; /* temporary swap pointer */ |
for (cc=0; cc<3; cc++) |
{ |
/* B pictures do not need to be save for future reference */ |
if (picture_coding_type==B_TYPE) |
{ |
current_frame[cc] = auxframe[cc]; |
} |
else |
{ |
/* only update at the beginning of the coded frame */ |
if (!Second_Field) |
{ |
tmp = forward_reference_frame[cc]; |
/* the previously decoded reference frame is stored |
coincident with the location where the backward |
reference frame is stored (backwards prediction is not |
needed in P pictures) */ |
forward_reference_frame[cc] = backward_reference_frame[cc]; |
/* update pointer for potential future B pictures */ |
backward_reference_frame[cc] = tmp; |
} |
/* can erase over old backward reference frame since it is not used |
in a P picture, and since any subsequent B pictures will use the |
previously decoded I or P frame as the backward_reference_frame */ |
current_frame[cc] = backward_reference_frame[cc]; |
} |
/* IMPLEMENTATION: |
one-time folding of a line offset into the pointer which stores the |
memory address of the current frame saves offsets and conditional |
branches throughout the remainder of the picture processing loop */ |
if (picture_structure==BOTTOM_FIELD) |
current_frame[cc]+= (cc==0) ? Coded_Picture_Width : Chroma_Width; |
} |
} |
/* store last frame */ |
void Output_Last_Frame_of_Sequence(Framenum) |
int Framenum; |
{ |
if (Second_Field) |
cprintf("last frame incomplete, not stored\n"); |
else |
Write_Frame(backward_reference_frame,Framenum-1); |
} |
static void frame_reorder(Bitstream_Framenum, Sequence_Framenum) |
int Bitstream_Framenum, Sequence_Framenum; |
{ |
/* tracking variables to insure proper output in spatial scalability */ |
static int Oldref_progressive_frame, Newref_progressive_frame; |
if (Sequence_Framenum!=0) |
{ |
if (picture_structure==FRAME_PICTURE || Second_Field) |
{ |
if (picture_coding_type==B_TYPE) |
Write_Frame(auxframe,Bitstream_Framenum-1); |
else |
{ |
Newref_progressive_frame = progressive_frame; |
progressive_frame = Oldref_progressive_frame; |
Write_Frame(forward_reference_frame,Bitstream_Framenum-1); |
Oldref_progressive_frame = progressive_frame = Newref_progressive_frame; |
} |
} |
#ifdef DISPLAY |
else if (Output_Type==T_X11) |
{ |
if(!Display_Progressive_Flag) |
Display_Second_Field(); |
} |
#endif |
} |
else |
Oldref_progressive_frame = progressive_frame; |
} |
/* ISO/IEC 13818-2 section 7.6 */ |
static void motion_compensation(MBA, macroblock_type, motion_type, PMV, |
motion_vertical_field_select, dmvector, stwtype, dct_type) |
int MBA; |
int macroblock_type; |
int motion_type; |
int PMV[2][2][2]; |
int motion_vertical_field_select[2][2]; |
int dmvector[2]; |
int stwtype; |
int dct_type; |
{ |
int bx, by; |
int comp; |
/* derive current macroblock position within picture */ |
/* ISO/IEC 13818-2 section 6.3.1.6 and 6.3.1.7 */ |
bx = 16*(MBA%mb_width); |
by = 16*(MBA/mb_width); |
/* motion compensation */ |
if (!(macroblock_type & MACROBLOCK_INTRA)) |
form_predictions(bx,by,macroblock_type,motion_type,PMV, |
motion_vertical_field_select,dmvector,stwtype); |
/* SCALABILITY: Data Partitioning */ |
if (base.scalable_mode==SC_DP) |
ld = &base; |
/* copy or add block data into picture */ |
for (comp=0; comp<block_count; comp++) |
{ |
/* SCALABILITY: SNR */ |
/* ISO/IEC 13818-2 section 7.8.3.4: Addition of coefficients from |
the two a layers */ |
if (Two_Streams && enhan.scalable_mode==SC_SNR) |
Sum_Block(comp); /* add SNR enhancement layer data to base layer */ |
/* MPEG-2 saturation and mismatch control */ |
/* base layer could be MPEG-1 stream, enhancement MPEG-2 SNR */ |
/* ISO/IEC 13818-2 section 7.4.3 and 7.4.4: Saturation and Mismatch control */ |
if ((Two_Streams && enhan.scalable_mode==SC_SNR) || ld->MPEG2_Flag) |
Saturate(ld->block[comp]); |
/* ISO/IEC 13818-2 section Annex A: inverse DCT */ |
if (Reference_IDCT_Flag) |
Reference_IDCT(ld->block[comp]); |
else |
Fast_IDCT(ld->block[comp]); |
/* ISO/IEC 13818-2 section 7.6.8: Adding prediction and coefficient data */ |
Add_Block(comp,bx,by,dct_type,(macroblock_type & MACROBLOCK_INTRA)==0); |
} |
} |
/* ISO/IEC 13818-2 section 7.6.6 */ |
static void skipped_macroblock(dc_dct_pred, PMV, motion_type, |
motion_vertical_field_select, stwtype, macroblock_type) |
int dc_dct_pred[3]; |
int PMV[2][2][2]; |
int *motion_type; |
int motion_vertical_field_select[2][2]; |
int *stwtype; |
int *macroblock_type; |
{ |
int comp; |
/* SCALABILITY: Data Paritioning */ |
if (base.scalable_mode==SC_DP) |
ld = &base; |
for (comp=0; comp<block_count; comp++) |
Clear_Block(comp); |
/* reset intra_dc predictors */ |
/* ISO/IEC 13818-2 section 7.2.1: DC coefficients in intra blocks */ |
dc_dct_pred[0]=dc_dct_pred[1]=dc_dct_pred[2]=0; |
/* reset motion vector predictors */ |
/* ISO/IEC 13818-2 section 7.6.3.4: Resetting motion vector predictors */ |
if (picture_coding_type==P_TYPE) |
PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0; |
/* derive motion_type */ |
if (picture_structure==FRAME_PICTURE) |
*motion_type = MC_FRAME; |
else |
{ |
*motion_type = MC_FIELD; |
/* predict from field of same parity */ |
/* ISO/IEC 13818-2 section 7.6.6.1 and 7.6.6.3: P field picture and B field |
picture */ |
motion_vertical_field_select[0][0]=motion_vertical_field_select[0][1] = |
(picture_structure==BOTTOM_FIELD); |
} |
/* skipped I are spatial-only predicted, */ |
/* skipped P and B are temporal-only predicted */ |
/* ISO/IEC 13818-2 section 7.7.6: Skipped macroblocks */ |
*stwtype = (picture_coding_type==I_TYPE) ? 8 : 0; |
/* IMPLEMENTATION: clear MACROBLOCK_INTRA */ |
*macroblock_type&= ~MACROBLOCK_INTRA; |
} |
/* return==-1 means go to next picture */ |
/* the expression "start of slice" is used throughout the normative |
body of the MPEG specification */ |
static int start_of_slice(MBAmax, MBA, MBAinc, |
dc_dct_pred, PMV) |
int MBAmax; |
int *MBA; |
int *MBAinc; |
int dc_dct_pred[3]; |
int PMV[2][2][2]; |
{ |
unsigned int code; |
int slice_vert_pos_ext; |
ld = &base; |
Fault_Flag = 0; |
next_start_code(); |
code = Show_Bits(32); |
if (code<SLICE_START_CODE_MIN || code>SLICE_START_CODE_MAX) |
{ |
/* only slice headers are allowed in picture_data */ |
if (!Quiet_Flag) |
cprintf("start_of_slice(): Premature end of picture\n"); |
return(-1); /* trigger: go to next picture */ |
} |
Flush_Buffer32(); |
/* decode slice header (may change quantizer_scale) */ |
slice_vert_pos_ext = slice_header(); |
/* SCALABILITY: Data Partitioning */ |
if (base.scalable_mode==SC_DP) |
{ |
ld = &enhan; |
next_start_code(); |
code = Show_Bits(32); |
if (code<SLICE_START_CODE_MIN || code>SLICE_START_CODE_MAX) |
{ |
/* only slice headers are allowed in picture_data */ |
if (!Quiet_Flag) |
cprintf("DP: Premature end of picture\n"); |
return(-1); /* trigger: go to next picture */ |
} |
Flush_Buffer32(); |
/* decode slice header (may change quantizer_scale) */ |
slice_vert_pos_ext = slice_header(); |
if (base.priority_breakpoint!=1) |
ld = &base; |
} |
/* decode macroblock address increment */ |
*MBAinc = Get_macroblock_address_increment(); |
if (Fault_Flag) |
{ |
cprintf("start_of_slice(): MBAinc unsuccessful\n"); |
return(0); /* trigger: go to next slice */ |
} |
/* set current location */ |
/* NOTE: the arithmetic used to derive macroblock_address below is |
* equivalent to ISO/IEC 13818-2 section 6.3.17: Macroblock |
*/ |
*MBA = ((slice_vert_pos_ext<<7) + (code&255) - 1)*mb_width + *MBAinc - 1; |
*MBAinc = 1; /* first macroblock in slice: not skipped */ |
/* reset all DC coefficient and motion vector predictors */ |
/* reset all DC coefficient and motion vector predictors */ |
/* ISO/IEC 13818-2 section 7.2.1: DC coefficients in intra blocks */ |
dc_dct_pred[0]=dc_dct_pred[1]=dc_dct_pred[2]=0; |
/* ISO/IEC 13818-2 section 7.6.3.4: Resetting motion vector predictors */ |
PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0; |
PMV[0][1][0]=PMV[0][1][1]=PMV[1][1][0]=PMV[1][1][1]=0; |
/* successfull: trigger decode macroblocks in slice */ |
return(1); |
} |
/* ISO/IEC 13818-2 sections 7.2 through 7.5 */ |
static int decode_macroblock(macroblock_type, stwtype, stwclass, |
motion_type, dct_type, PMV, dc_dct_pred, |
motion_vertical_field_select, dmvector) |
int *macroblock_type; |
int *stwtype; |
int *stwclass; |
int *motion_type; |
int *dct_type; |
int PMV[2][2][2]; |
int dc_dct_pred[3]; |
int motion_vertical_field_select[2][2]; |
int dmvector[2]; |
{ |
/* locals */ |
int quantizer_scale_code; |
int comp; |
int motion_vector_count; |
int mv_format; |
int dmv; |
int mvscale; |
int coded_block_pattern; |
/* SCALABILITY: Data Patitioning */ |
if (base.scalable_mode==SC_DP) |
{ |
if (base.priority_breakpoint<=2) |
ld = &enhan; |
else |
ld = &base; |
} |
/* ISO/IEC 13818-2 section 6.3.17.1: Macroblock modes */ |
macroblock_modes(macroblock_type, stwtype, stwclass, |
motion_type, &motion_vector_count, &mv_format, &dmv, &mvscale, |
dct_type); |
if (Fault_Flag) return(0); /* trigger: go to next slice */ |
if (*macroblock_type & MACROBLOCK_QUANT) |
{ |
quantizer_scale_code = Get_Bits(5); |
#ifdef TRACE |
if (Trace_Flag) |
{ |
cprintf("quantiser_scale_code ("); |
Print_Bits(quantizer_scale_code,5,5); |
cprintf("): %d\n",quantizer_scale_code); |
} |
#endif /* TRACE */ |
/* ISO/IEC 13818-2 section 7.4.2.2: Quantizer scale factor */ |
if (ld->MPEG2_Flag) |
ld->quantizer_scale = |
ld->q_scale_type ? Non_Linear_quantizer_scale[quantizer_scale_code] |
: (quantizer_scale_code << 1); |
else |
ld->quantizer_scale = quantizer_scale_code; |
/* SCALABILITY: Data Partitioning */ |
if (base.scalable_mode==SC_DP) |
/* make sure base.quantizer_scale is valid */ |
base.quantizer_scale = ld->quantizer_scale; |
} |
/* motion vectors */ |
/* ISO/IEC 13818-2 section 6.3.17.2: Motion vectors */ |
/* decode forward motion vectors */ |
if ((*macroblock_type & MACROBLOCK_MOTION_FORWARD) |
|| ((*macroblock_type & MACROBLOCK_INTRA) |
&& concealment_motion_vectors)) |
{ |
if (ld->MPEG2_Flag) |
motion_vectors(PMV,dmvector,motion_vertical_field_select, |
0,motion_vector_count,mv_format,f_code[0][0]-1,f_code[0][1]-1, |
dmv,mvscale); |
else |
motion_vector(PMV[0][0],dmvector, |
forward_f_code-1,forward_f_code-1,0,0,full_pel_forward_vector); |
} |
if (Fault_Flag) return(0); /* trigger: go to next slice */ |
/* decode backward motion vectors */ |
if (*macroblock_type & MACROBLOCK_MOTION_BACKWARD) |
{ |
if (ld->MPEG2_Flag) |
motion_vectors(PMV,dmvector,motion_vertical_field_select, |
1,motion_vector_count,mv_format,f_code[1][0]-1,f_code[1][1]-1,0, |
mvscale); |
else |
motion_vector(PMV[0][1],dmvector, |
backward_f_code-1,backward_f_code-1,0,0,full_pel_backward_vector); |
} |
if (Fault_Flag) return(0); /* trigger: go to next slice */ |
if ((*macroblock_type & MACROBLOCK_INTRA) && concealment_motion_vectors) |
Flush_Buffer(1); /* remove marker_bit */ |
if (base.scalable_mode==SC_DP && base.priority_breakpoint==3) |
ld = &enhan; |
/* macroblock_pattern */ |
/* ISO/IEC 13818-2 section 6.3.17.4: Coded block pattern */ |
if (*macroblock_type & MACROBLOCK_PATTERN) |
{ |
coded_block_pattern = Get_coded_block_pattern(); |
if (chroma_format==CHROMA422) |
{ |
/* coded_block_pattern_1 */ |
coded_block_pattern = (coded_block_pattern<<2) | Get_Bits(2); |
#ifdef TRACE |
if (Trace_Flag) |
{ |
cprintf("coded_block_pattern_1: "); |
Print_Bits(coded_block_pattern,2,2); |
cprintf(" (%d)\n",coded_block_pattern&3); |
} |
#endif /* TRACE */ |
} |
else if (chroma_format==CHROMA444) |
{ |
/* coded_block_pattern_2 */ |
coded_block_pattern = (coded_block_pattern<<6) | Get_Bits(6); |
#ifdef TRACE |
if (Trace_Flag) |
{ |
cprintf("coded_block_pattern_2: "); |
Print_Bits(coded_block_pattern,6,6); |
cprintf(" (%d)\n",coded_block_pattern&63); |
} |
#endif /* TRACE */ |
} |
} |
else |
coded_block_pattern = (*macroblock_type & MACROBLOCK_INTRA) ? |
(1<<block_count)-1 : 0; |
if (Fault_Flag) return(0); /* trigger: go to next slice */ |
/* decode blocks */ |
for (comp=0; comp<block_count; comp++) |
{ |
/* SCALABILITY: Data Partitioning */ |
if (base.scalable_mode==SC_DP) |
ld = &base; |
Clear_Block(comp); |
if (coded_block_pattern & (1<<(block_count-1-comp))) |
{ |
if (*macroblock_type & MACROBLOCK_INTRA) |
{ |
if (ld->MPEG2_Flag) |
Decode_MPEG2_Intra_Block(comp,dc_dct_pred); |
else |
Decode_MPEG1_Intra_Block(comp,dc_dct_pred); |
} |
else |
{ |
if (ld->MPEG2_Flag) |
Decode_MPEG2_Non_Intra_Block(comp); |
else |
Decode_MPEG1_Non_Intra_Block(comp); |
} |
if (Fault_Flag) return(0); /* trigger: go to next slice */ |
} |
} |
if(picture_coding_type==D_TYPE) |
{ |
/* remove end_of_macroblock (always 1, prevents startcode emulation) */ |
/* ISO/IEC 11172-2 section 2.4.2.7 and 2.4.3.6 */ |
marker_bit("D picture end_of_macroblock bit"); |
} |
/* reset intra_dc predictors */ |
/* ISO/IEC 13818-2 section 7.2.1: DC coefficients in intra blocks */ |
if (!(*macroblock_type & MACROBLOCK_INTRA)) |
dc_dct_pred[0]=dc_dct_pred[1]=dc_dct_pred[2]=0; |
/* reset motion vector predictors */ |
if ((*macroblock_type & MACROBLOCK_INTRA) && !concealment_motion_vectors) |
{ |
/* intra mb without concealment motion vectors */ |
/* ISO/IEC 13818-2 section 7.6.3.4: Resetting motion vector predictors */ |
PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0; |
PMV[0][1][0]=PMV[0][1][1]=PMV[1][1][0]=PMV[1][1][1]=0; |
} |
/* special "No_MC" macroblock_type case */ |
/* ISO/IEC 13818-2 section 7.6.3.5: Prediction in P pictures */ |
if ((picture_coding_type==P_TYPE) |
&& !(*macroblock_type & (MACROBLOCK_MOTION_FORWARD|MACROBLOCK_INTRA))) |
{ |
/* non-intra mb without forward mv in a P picture */ |
/* ISO/IEC 13818-2 section 7.6.3.4: Resetting motion vector predictors */ |
PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0; |
/* derive motion_type */ |
/* ISO/IEC 13818-2 section 6.3.17.1: Macroblock modes, frame_motion_type */ |
if (picture_structure==FRAME_PICTURE) |
*motion_type = MC_FRAME; |
else |
{ |
*motion_type = MC_FIELD; |
/* predict from field of same parity */ |
motion_vertical_field_select[0][0] = (picture_structure==BOTTOM_FIELD); |
} |
} |
if (*stwclass==4) |
{ |
/* purely spatially predicted macroblock */ |
/* ISO/IEC 13818-2 section 7.7.5.1: Resetting motion vector predictions */ |
PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0; |
PMV[0][1][0]=PMV[0][1][1]=PMV[1][1][0]=PMV[1][1][1]=0; |
} |
/* successfully decoded macroblock */ |
return(1); |
} /* decode_macroblock */ |
/demos/tags/rel_1_5_beta1/first/mpeg2/gvideo.c |
---|
0,0 → 1,50 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Paolo Gai <pj@gandalf.sssup.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
#include "drivers/glib.h" |
#include "fsf.h" |
#include "config.h" |
#include "global.h" |
extern void *start_file; |
extern void *end_file; |
int Init_Mpeg_Decoder(void *start,void *end); |
int Decode_Bitstream(); |
void *mpeg2decoder(void *arg) |
{ |
int init = 1; |
Init_Mpeg_Decoder(start_file,end_file); |
while(1) { |
if (init == 1) { |
Decode_Bitstream(); |
} |
} |
return 0; |
} |
/demos/tags/rel_1_5_beta1/first/mpeg2/gethdr.c |
---|
0,0 → 1,1074 |
/* gethdr.c, header decoding */ |
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */ |
/* |
* Disclaimer of Warranty |
* |
* These software programs are available to the user without any license fee or |
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims |
* any and all warranties, whether express, implied, or statuary, including any |
* implied warranties or merchantability or of fitness for a particular |
* purpose. In no event shall the copyright-holder be liable for any |
* incidental, punitive, or consequential damages of any kind whatsoever |
* arising from the use of these programs. |
* |
* This disclaimer of warranty extends to the user of these programs and user's |
* customers, employees, agents, transferees, successors, and assigns. |
* |
* The MPEG Software Simulation Group does not represent or warrant that the |
* programs furnished hereunder are free of infringement of any third-party |
* patents. |
* |
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware, |
* are subject to royalty fees to patent holders. Many of these patents are |
* general enough such that they are unavoidable regardless of implementation |
* design. |
* |
*/ |
#include "config.h" |
#include "global.h" |
/* private prototypes */ |
static void sequence_header _ANSI_ARGS_((void)); |
static void group_of_pictures_header _ANSI_ARGS_((void)); |
static void picture_header _ANSI_ARGS_((void)); |
static void extension_and_user_data _ANSI_ARGS_((void)); |
static void sequence_extension _ANSI_ARGS_((void)); |
static void sequence_display_extension _ANSI_ARGS_((void)); |
static void quant_matrix_extension _ANSI_ARGS_((void)); |
static void sequence_scalable_extension _ANSI_ARGS_((void)); |
static void picture_display_extension _ANSI_ARGS_((void)); |
static void picture_coding_extension _ANSI_ARGS_((void)); |
static void picture_spatial_scalable_extension _ANSI_ARGS_((void)); |
static void picture_temporal_scalable_extension _ANSI_ARGS_((void)); |
static int extra_bit_information _ANSI_ARGS_((void)); |
static void copyright_extension _ANSI_ARGS_((void)); |
static void user_data _ANSI_ARGS_((void)); |
static void user_data _ANSI_ARGS_((void)); |
/* introduced in September 1995 to assist spatial scalable decoding */ |
static void Update_Temporal_Reference_Tacking_Data _ANSI_ARGS_((void)); |
/* private variables */ |
static int Temporal_Reference_Base = 0; |
static int True_Framenum_max = -1; |
static int Temporal_Reference_GOP_Reset = 0; |
#define RESERVED -1 |
static double frame_rate_Table[16] = |
{ |
0.0, |
((23.0*1000.0)/1001.0), |
24.0, |
25.0, |
((30.0*1000.0)/1001.0), |
30.0, |
50.0, |
((60.0*1000.0)/1001.0), |
60.0, |
RESERVED, |
RESERVED, |
RESERVED, |
RESERVED, |
RESERVED, |
RESERVED, |
RESERVED |
}; |
/* |
* decode headers from one input stream |
* until an End of Sequence or picture start code |
* is found |
*/ |
int Get_Hdr() |
{ |
unsigned int code; |
for (;;) |
{ |
/* look for next_start_code */ |
next_start_code(); |
code = Get_Bits32(); |
switch (code) |
{ |
case SEQUENCE_HEADER_CODE: |
sequence_header(); |
break; |
case GROUP_START_CODE: |
group_of_pictures_header(); |
break; |
case PICTURE_START_CODE: |
picture_header(); |
return 1; |
break; |
case SEQUENCE_END_CODE: |
return 0; |
break; |
default: |
if (!Quiet_Flag) |
cprintf("Unexpected next_start_code %08x (ignored)\n",code); |
break; |
} |
} |
} |
/* align to start of next next_start_code */ |
void next_start_code() |
{ |
/* byte align */ |
Flush_Buffer(ld->Incnt&7); |
while (Show_Bits(24)!=0x01L) |
Flush_Buffer(8); |
} |
/* decode sequence header */ |
static void sequence_header() |
{ |
int i; |
int pos; |
pos = ld->Bitcnt; |
horizontal_size = Get_Bits(12); |
vertical_size = Get_Bits(12); |
aspect_ratio_information = Get_Bits(4); |
frame_rate_code = Get_Bits(4); |
bit_rate_value = Get_Bits(18); |
marker_bit("sequence_header()"); |
vbv_buffer_size = Get_Bits(10); |
constrained_parameters_flag = Get_Bits(1); |
if((ld->load_intra_quantizer_matrix = Get_Bits(1))) |
{ |
for (i=0; i<64; i++) |
ld->intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8); |
} |
else |
{ |
for (i=0; i<64; i++) |
ld->intra_quantizer_matrix[i] = default_intra_quantizer_matrix[i]; |
} |
if((ld->load_non_intra_quantizer_matrix = Get_Bits(1))) |
{ |
for (i=0; i<64; i++) |
ld->non_intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8); |
} |
else |
{ |
for (i=0; i<64; i++) |
ld->non_intra_quantizer_matrix[i] = 16; |
} |
/* copy luminance to chrominance matrices */ |
for (i=0; i<64; i++) |
{ |
ld->chroma_intra_quantizer_matrix[i] = |
ld->intra_quantizer_matrix[i]; |
ld->chroma_non_intra_quantizer_matrix[i] = |
ld->non_intra_quantizer_matrix[i]; |
} |
#ifdef VERBOSE |
if (Verbose_Flag > NO_LAYER) |
{ |
cprintf("sequence header (byte %d)\n",(pos>>3)-4); |
if (Verbose_Flag > SEQUENCE_LAYER) |
{ |
cprintf(" horizontal_size=%d\n",horizontal_size); |
cprintf(" vertical_size=%d\n",vertical_size); |
cprintf(" aspect_ratio_information=%d\n",aspect_ratio_information); |
cprintf(" frame_rate_code=%d",frame_rate_code); |
cprintf(" bit_rate_value=%d\n",bit_rate_value); |
cprintf(" vbv_buffer_size=%d\n",vbv_buffer_size); |
cprintf(" constrained_parameters_flag=%d\n",constrained_parameters_flag); |
cprintf(" load_intra_quantizer_matrix=%d\n",ld->load_intra_quantizer_matrix); |
cprintf(" load_non_intra_quantizer_matrix=%d\n",ld->load_non_intra_quantizer_matrix); |
} |
} |
#endif /* VERBOSE */ |
#ifdef VERIFY |
verify_sequence_header++; |
#endif /* VERIFY */ |
extension_and_user_data(); |
} |
/* decode group of pictures header */ |
/* ISO/IEC 13818-2 section 6.2.2.6 */ |
static void group_of_pictures_header() |
{ |
int pos; |
if (ld == &base) |
{ |
Temporal_Reference_Base = True_Framenum_max + 1; /* *CH* */ |
Temporal_Reference_GOP_Reset = 1; |
} |
pos = ld->Bitcnt; |
drop_flag = Get_Bits(1); |
hour = Get_Bits(5); |
minute = Get_Bits(6); |
marker_bit("group_of_pictures_header()"); |
sec = Get_Bits(6); |
frame = Get_Bits(6); |
closed_gop = Get_Bits(1); |
broken_link = Get_Bits(1); |
#ifdef VERBOSE |
if (Verbose_Flag > NO_LAYER) |
{ |
cprintf("group of pictures (byte %d)\n",(pos>>3)-4); |
if (Verbose_Flag > SEQUENCE_LAYER) |
{ |
cprintf(" drop_flag=%d\n",drop_flag); |
cprintf(" timecode %d:%02d:%02d:%02d\n",hour,minute,sec,frame); |
cprintf(" closed_gop=%d\n",closed_gop); |
cprintf(" broken_link=%d\n",broken_link); |
} |
} |
#endif /* VERBOSE */ |
#ifdef VERIFY |
verify_group_of_pictures_header++; |
#endif /* VERIFY */ |
extension_and_user_data(); |
} |
/* decode picture header */ |
/* ISO/IEC 13818-2 section 6.2.3 */ |
static void picture_header() |
{ |
int pos; |
int Extra_Information_Byte_Count; |
/* unless later overwritten by picture_spatial_scalable_extension() */ |
ld->pict_scal = 0; |
pos = ld->Bitcnt; |
temporal_reference = Get_Bits(10); |
picture_coding_type = Get_Bits(3); |
vbv_delay = Get_Bits(16); |
if (picture_coding_type==P_TYPE || picture_coding_type==B_TYPE) |
{ |
full_pel_forward_vector = Get_Bits(1); |
forward_f_code = Get_Bits(3); |
} |
if (picture_coding_type==B_TYPE) |
{ |
full_pel_backward_vector = Get_Bits(1); |
backward_f_code = Get_Bits(3); |
} |
#ifdef VERBOSE |
if (Verbose_Flag>NO_LAYER) |
{ |
cprintf("picture header (byte %d)\n",(pos>>3)-4); |
if (Verbose_Flag>SEQUENCE_LAYER) |
{ |
cprintf(" temporal_reference=%d\n",temporal_reference); |
cprintf(" picture_coding_type=%d\n",picture_coding_type); |
cprintf(" vbv_delay=%d\n",vbv_delay); |
if (picture_coding_type==P_TYPE || picture_coding_type==B_TYPE) |
{ |
cprintf(" full_pel_forward_vector=%d\n",full_pel_forward_vector); |
cprintf(" forward_f_code =%d\n",forward_f_code); |
} |
if (picture_coding_type==B_TYPE) |
{ |
cprintf(" full_pel_backward_vector=%d\n",full_pel_backward_vector); |
cprintf(" backward_f_code =%d\n",backward_f_code); |
} |
} |
} |
#endif /* VERBOSE */ |
#ifdef VERIFY |
verify_picture_header++; |
#endif /* VERIFY */ |
Extra_Information_Byte_Count = |
extra_bit_information(); |
extension_and_user_data(); |
/* update tracking information used to assist spatial scalability */ |
Update_Temporal_Reference_Tacking_Data(); |
} |
/* decode slice header */ |
/* ISO/IEC 13818-2 section 6.2.4 */ |
int slice_header() |
{ |
int slice_vertical_position_extension; |
int quantizer_scale_code; |
int pos; |
int slice_picture_id_enable = 0; |
int slice_picture_id = 0; |
int extra_information_slice = 0; |
pos = ld->Bitcnt; |
slice_vertical_position_extension = |
(ld->MPEG2_Flag && vertical_size>2800) ? Get_Bits(3) : 0; |
if (ld->scalable_mode==SC_DP) |
ld->priority_breakpoint = Get_Bits(7); |
quantizer_scale_code = Get_Bits(5); |
ld->quantizer_scale = |
ld->MPEG2_Flag ? (ld->q_scale_type ? Non_Linear_quantizer_scale[quantizer_scale_code] : quantizer_scale_code<<1) : quantizer_scale_code; |
/* slice_id introduced in March 1995 as part of the video corridendum |
(after the IS was drafted in November 1994) */ |
if (Get_Bits(1)) |
{ |
ld->intra_slice = Get_Bits(1); |
slice_picture_id_enable = Get_Bits(1); |
slice_picture_id = Get_Bits(6); |
extra_information_slice = extra_bit_information(); |
} |
else |
ld->intra_slice = 0; |
#ifdef VERBOSE |
if (Verbose_Flag>PICTURE_LAYER) |
{ |
cprintf("slice header (byte %d)\n",(pos>>3)-4); |
if (Verbose_Flag>SLICE_LAYER) |
{ |
if (ld->MPEG2_Flag && vertical_size>2800) |
cprintf(" slice_vertical_position_extension=%d\n",slice_vertical_position_extension); |
if (ld->scalable_mode==SC_DP) |
cprintf(" priority_breakpoint=%d\n",ld->priority_breakpoint); |
cprintf(" quantizer_scale_code=%d\n",quantizer_scale_code); |
cprintf(" slice_picture_id_enable = %d\n", slice_picture_id_enable); |
if(slice_picture_id_enable) |
cprintf(" slice_picture_id = %d\n", slice_picture_id); |
} |
} |
#endif /* VERBOSE */ |
#ifdef VERIFY |
verify_slice_header++; |
#endif /* VERIFY */ |
return slice_vertical_position_extension; |
} |
/* decode extension and user data */ |
/* ISO/IEC 13818-2 section 6.2.2.2 */ |
static void extension_and_user_data() |
{ |
int code,ext_ID; |
next_start_code(); |
while ((code = Show_Bits(32))==EXTENSION_START_CODE || code==USER_DATA_START_CODE) |
{ |
if (code==EXTENSION_START_CODE) |
{ |
Flush_Buffer32(); |
ext_ID = Get_Bits(4); |
switch (ext_ID) |
{ |
case SEQUENCE_EXTENSION_ID: |
sequence_extension(); |
break; |
case SEQUENCE_DISPLAY_EXTENSION_ID: |
sequence_display_extension(); |
break; |
case QUANT_MATRIX_EXTENSION_ID: |
quant_matrix_extension(); |
break; |
case SEQUENCE_SCALABLE_EXTENSION_ID: |
sequence_scalable_extension(); |
break; |
case PICTURE_DISPLAY_EXTENSION_ID: |
picture_display_extension(); |
break; |
case PICTURE_CODING_EXTENSION_ID: |
picture_coding_extension(); |
break; |
case PICTURE_SPATIAL_SCALABLE_EXTENSION_ID: |
picture_spatial_scalable_extension(); |
break; |
case PICTURE_TEMPORAL_SCALABLE_EXTENSION_ID: |
picture_temporal_scalable_extension(); |
break; |
case COPYRIGHT_EXTENSION_ID: |
copyright_extension(); |
break; |
default: |
cprintf("reserved extension start code ID %d\n",ext_ID); |
break; |
} |
next_start_code(); |
} |
else |
{ |
#ifdef VERBOSE |
if (Verbose_Flag>NO_LAYER) |
cprintf("user data\n"); |
#endif /* VERBOSE */ |
Flush_Buffer32(); |
user_data(); |
} |
} |
} |
/* decode sequence extension */ |
/* ISO/IEC 13818-2 section 6.2.2.3 */ |
static void sequence_extension() |
{ |
int horizontal_size_extension; |
int vertical_size_extension; |
int bit_rate_extension; |
int vbv_buffer_size_extension; |
/* derive bit position for trace */ |
#ifdef VERBOSE |
pos = ld->Bitcnt; |
#endif |
ld->MPEG2_Flag = 1; |
ld->scalable_mode = SC_NONE; /* unless overwritten by sequence_scalable_extension() */ |
layer_id = 0; /* unless overwritten by sequence_scalable_extension() */ |
profile_and_level_indication = Get_Bits(8); |
progressive_sequence = Get_Bits(1); |
chroma_format = Get_Bits(2); |
horizontal_size_extension = Get_Bits(2); |
vertical_size_extension = Get_Bits(2); |
bit_rate_extension = Get_Bits(12); |
marker_bit("sequence_extension"); |
vbv_buffer_size_extension = Get_Bits(8); |
low_delay = Get_Bits(1); |
frame_rate_extension_n = Get_Bits(2); |
frame_rate_extension_d = Get_Bits(5); |
frame_rate = frame_rate_Table[frame_rate_code] * |
((frame_rate_extension_n+1)/(frame_rate_extension_d+1)); |
/* special case for 422 profile & level must be made */ |
if((profile_and_level_indication>>7) & 1) |
{ /* escape bit of profile_and_level_indication set */ |
/* 4:2:2 Profile @ Main Level */ |
if((profile_and_level_indication&15)==5) |
{ |
profile = PROFILE_422; |
level = MAIN_LEVEL; |
} |
} |
else |
{ |
profile = profile_and_level_indication >> 4; /* Profile is upper nibble */ |
level = profile_and_level_indication & 0xF; /* Level is lower nibble */ |
} |
horizontal_size = (horizontal_size_extension<<12) | (horizontal_size&0x0fff); |
vertical_size = (vertical_size_extension<<12) | (vertical_size&0x0fff); |
/* ISO/IEC 13818-2 does not define bit_rate_value to be composed of |
* both the original bit_rate_value parsed in sequence_header() and |
* the optional bit_rate_extension in sequence_extension_header(). |
* However, we use it for bitstream verification purposes. |
*/ |
bit_rate_value += (bit_rate_extension << 18); |
bit_rate = ((double) bit_rate_value) * 400.0; |
vbv_buffer_size += (vbv_buffer_size_extension << 10); |
#ifdef VERBOSE |
if (Verbose_Flag>NO_LAYER) |
{ |
cprintf("sequence extension (byte %d)\n",(pos>>3)-4); |
if (Verbose_Flag>SEQUENCE_LAYER) |
{ |
cprintf(" profile_and_level_indication=%d\n",profile_and_level_indication); |
if (profile_and_level_indication<128) |
{ |
cprintf(" profile=%d, level=%d\n",profile,level); |
} |
cprintf(" progressive_sequence=%d\n",progressive_sequence); |
cprintf(" chroma_format=%d\n",chroma_format); |
cprintf(" horizontal_size_extension=%d\n",horizontal_size_extension); |
cprintf(" vertical_size_extension=%d\n",vertical_size_extension); |
cprintf(" bit_rate_extension=%d\n",bit_rate_extension); |
cprintf(" vbv_buffer_size_extension=%d\n",vbv_buffer_size_extension); |
cprintf(" low_delay=%d\n",low_delay); |
cprintf(" frame_rate_extension_n=%d\n",frame_rate_extension_n); |
cprintf(" frame_rate_extension_d=%d\n",frame_rate_extension_d); |
} |
} |
#endif /* VERBOSE */ |
#ifdef VERIFY |
verify_sequence_extension++; |
#endif /* VERIFY */ |
} |
/* decode sequence display extension */ |
static void sequence_display_extension() |
{ |
int pos; |
pos = ld->Bitcnt; |
video_format = Get_Bits(3); |
color_description = Get_Bits(1); |
if (color_description) |
{ |
color_primaries = Get_Bits(8); |
transfer_characteristics = Get_Bits(8); |
matrix_coefficients = Get_Bits(8); |
} |
display_horizontal_size = Get_Bits(14); |
marker_bit("sequence_display_extension"); |
display_vertical_size = Get_Bits(14); |
#ifdef VERBOSE |
if (Verbose_Flag>NO_LAYER) |
{ |
cprintf("sequence display extension (byte %d)\n",(pos>>3)-4); |
if (Verbose_Flag>SEQUENCE_LAYER) |
{ |
cprintf(" video_format=%d\n",video_format); |
cprintf(" color_description=%d\n",color_description); |
if (color_description) |
{ |
cprintf(" color_primaries=%d\n",color_primaries); |
cprintf(" transfer_characteristics=%d\n",transfer_characteristics); |
cprintf(" matrix_coefficients=%d\n",matrix_coefficients); |
} |
cprintf(" display_horizontal_size=%d\n",display_horizontal_size); |
cprintf(" display_vertical_size=%d\n",display_vertical_size); |
} |
} |
#endif /* VERBOSE */ |
#ifdef VERIFY |
verify_sequence_display_extension++; |
#endif /* VERIFY */ |
} |
/* decode quant matrix entension */ |
/* ISO/IEC 13818-2 section 6.2.3.2 */ |
static void quant_matrix_extension() |
{ |
int i; |
int pos; |
pos = ld->Bitcnt; |
if((ld->load_intra_quantizer_matrix = Get_Bits(1))) |
{ |
for (i=0; i<64; i++) |
{ |
ld->chroma_intra_quantizer_matrix[scan[ZIG_ZAG][i]] |
= ld->intra_quantizer_matrix[scan[ZIG_ZAG][i]] |
= Get_Bits(8); |
} |
} |
if((ld->load_non_intra_quantizer_matrix = Get_Bits(1))) |
{ |
for (i=0; i<64; i++) |
{ |
ld->chroma_non_intra_quantizer_matrix[scan[ZIG_ZAG][i]] |
= ld->non_intra_quantizer_matrix[scan[ZIG_ZAG][i]] |
= Get_Bits(8); |
} |
} |
if((ld->load_chroma_intra_quantizer_matrix = Get_Bits(1))) |
{ |
for (i=0; i<64; i++) |
ld->chroma_intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8); |
} |
if((ld->load_chroma_non_intra_quantizer_matrix = Get_Bits(1))) |
{ |
for (i=0; i<64; i++) |
ld->chroma_non_intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8); |
} |
#ifdef VERBOSE |
if (Verbose_Flag>NO_LAYER) |
{ |
cprintf("quant matrix extension (byte %d)\n",(pos>>3)-4); |
cprintf(" load_intra_quantizer_matrix=%d\n", |
ld->load_intra_quantizer_matrix); |
cprintf(" load_non_intra_quantizer_matrix=%d\n", |
ld->load_non_intra_quantizer_matrix); |
cprintf(" load_chroma_intra_quantizer_matrix=%d\n", |
ld->load_chroma_intra_quantizer_matrix); |
cprintf(" load_chroma_non_intra_quantizer_matrix=%d\n", |
ld->load_chroma_non_intra_quantizer_matrix); |
} |
#endif /* VERBOSE */ |
#ifdef VERIFY |
verify_quant_matrix_extension++; |
#endif /* VERIFY */ |
} |
/* decode sequence scalable extension */ |
/* ISO/IEC 13818-2 section 6.2.2.5 */ |
static void sequence_scalable_extension() |
{ |
int pos; |
pos = ld->Bitcnt; |
/* values (without the +1 offset) of scalable_mode are defined in |
Table 6-10 of ISO/IEC 13818-2 */ |
ld->scalable_mode = Get_Bits(2) + 1; /* add 1 to make SC_DP != SC_NONE */ |
layer_id = Get_Bits(4); |
if (ld->scalable_mode==SC_SPAT) |
{ |
lower_layer_prediction_horizontal_size = Get_Bits(14); |
marker_bit("sequence_scalable_extension()"); |
lower_layer_prediction_vertical_size = Get_Bits(14); |
horizontal_subsampling_factor_m = Get_Bits(5); |
horizontal_subsampling_factor_n = Get_Bits(5); |
vertical_subsampling_factor_m = Get_Bits(5); |
vertical_subsampling_factor_n = Get_Bits(5); |
} |
if (ld->scalable_mode==SC_TEMP) |
Error("temporal scalability not implemented\n"); |
#ifdef VERBOSE |
if (Verbose_Flag>NO_LAYER) |
{ |
cprintf("sequence scalable extension (byte %d)\n",(pos>>3)-4); |
if (Verbose_Flag>SEQUENCE_LAYER) |
{ |
cprintf(" scalable_mode=%d\n",ld->scalable_mode-1); |
cprintf(" layer_id=%d\n",layer_id); |
if (ld->scalable_mode==SC_SPAT) |
{ |
cprintf(" lower_layer_prediction_horiontal_size=%d\n", |
lower_layer_prediction_horizontal_size); |
cprintf(" lower_layer_prediction_vertical_size=%d\n", |
lower_layer_prediction_vertical_size); |
cprintf(" horizontal_subsampling_factor_m=%d\n", |
horizontal_subsampling_factor_m); |
cprintf(" horizontal_subsampling_factor_n=%d\n", |
horizontal_subsampling_factor_n); |
cprintf(" vertical_subsampling_factor_m=%d\n", |
vertical_subsampling_factor_m); |
cprintf(" vertical_subsampling_factor_n=%d\n", |
vertical_subsampling_factor_n); |
} |
} |
} |
#endif /* VERBOSE */ |
#ifdef VERIFY |
verify_sequence_scalable_extension++; |
#endif /* VERIFY */ |
} |
/* decode picture display extension */ |
/* ISO/IEC 13818-2 section 6.2.3.3. */ |
static void picture_display_extension() |
{ |
int i; |
int number_of_frame_center_offsets; |
int pos; |
pos = ld->Bitcnt; |
/* based on ISO/IEC 13818-2 section 6.3.12 |
(November 1994) Picture display extensions */ |
/* derive number_of_frame_center_offsets */ |
if(progressive_sequence) |
{ |
if(repeat_first_field) |
{ |
if(top_field_first) |
number_of_frame_center_offsets = 3; |
else |
number_of_frame_center_offsets = 2; |
} |
else |
{ |
number_of_frame_center_offsets = 1; |
} |
} |
else |
{ |
if(picture_structure!=FRAME_PICTURE) |
{ |
number_of_frame_center_offsets = 1; |
} |
else |
{ |
if(repeat_first_field) |
number_of_frame_center_offsets = 3; |
else |
number_of_frame_center_offsets = 2; |
} |
} |
/* now parse */ |
for (i=0; i<number_of_frame_center_offsets; i++) |
{ |
frame_center_horizontal_offset[i] = Get_Bits(16); |
marker_bit("picture_display_extension, first marker bit"); |
frame_center_vertical_offset[i] = Get_Bits(16); |
marker_bit("picture_display_extension, second marker bit"); |
} |
#ifdef VERBOSE |
if (Verbose_Flag>NO_LAYER) |
{ |
cprintf("picture display extension (byte %d)\n",(pos>>3)-4); |
if (Verbose_Flag>SEQUENCE_LAYER) |
{ |
for (i=0; i<number_of_frame_center_offsets; i++) |
{ |
cprintf(" frame_center_horizontal_offset[%d]=%d\n",i, |
frame_center_horizontal_offset[i]); |
cprintf(" frame_center_vertical_offset[%d]=%d\n",i, |
frame_center_vertical_offset[i]); |
} |
} |
} |
#endif /* VERBOSE */ |
#ifdef VERIFY |
verify_picture_display_extension++; |
#endif /* VERIFY */ |
} |
/* decode picture coding extension */ |
static void picture_coding_extension() |
{ |
int pos; |
pos = ld->Bitcnt; |
f_code[0][0] = Get_Bits(4); |
f_code[0][1] = Get_Bits(4); |
f_code[1][0] = Get_Bits(4); |
f_code[1][1] = Get_Bits(4); |
intra_dc_precision = Get_Bits(2); |
picture_structure = Get_Bits(2); |
top_field_first = Get_Bits(1); |
frame_pred_frame_dct = Get_Bits(1); |
concealment_motion_vectors = Get_Bits(1); |
ld->q_scale_type = Get_Bits(1); |
intra_vlc_format = Get_Bits(1); |
ld->alternate_scan = Get_Bits(1); |
repeat_first_field = Get_Bits(1); |
chroma_420_type = Get_Bits(1); |
progressive_frame = Get_Bits(1); |
composite_display_flag = Get_Bits(1); |
if (composite_display_flag) |
{ |
v_axis = Get_Bits(1); |
field_sequence = Get_Bits(3); |
sub_carrier = Get_Bits(1); |
burst_amplitude = Get_Bits(7); |
sub_carrier_phase = Get_Bits(8); |
} |
#ifdef VERBOSE |
if (Verbose_Flag>NO_LAYER) |
{ |
cprintf("picture coding extension (byte %d)\n",(pos>>3)-4); |
if (Verbose_Flag>SEQUENCE_LAYER) |
{ |
cprintf(" forward horizontal f_code=%d\n", f_code[0][0]); |
cprintf(" forward vertical f_code=%d\n", f_code[0][1]); |
cprintf(" backward horizontal f_code=%d\n", f_code[1][0]); |
cprintf(" backward_vertical f_code=%d\n", f_code[1][1]); |
cprintf(" intra_dc_precision=%d\n",intra_dc_precision); |
cprintf(" picture_structure=%d\n",picture_structure); |
cprintf(" top_field_first=%d\n",top_field_first); |
cprintf(" frame_pred_frame_dct=%d\n",frame_pred_frame_dct); |
cprintf(" concealment_motion_vectors=%d\n",concealment_motion_vectors); |
cprintf(" q_scale_type=%d\n",ld->q_scale_type); |
cprintf(" intra_vlc_format=%d\n",intra_vlc_format); |
cprintf(" alternate_scan=%d\n",ld->alternate_scan); |
cprintf(" repeat_first_field=%d\n",repeat_first_field); |
cprintf(" chroma_420_type=%d\n",chroma_420_type); |
cprintf(" progressive_frame=%d\n",progressive_frame); |
cprintf(" composite_display_flag=%d\n",composite_display_flag); |
if (composite_display_flag) |
{ |
cprintf(" v_axis=%d\n",v_axis); |
cprintf(" field_sequence=%d\n",field_sequence); |
cprintf(" sub_carrier=%d\n",sub_carrier); |
cprintf(" burst_amplitude=%d\n",burst_amplitude); |
cprintf(" sub_carrier_phase=%d\n",sub_carrier_phase); |
} |
} |
} |
#endif /* VERBOSE */ |
#ifdef VERIFY |
verify_picture_coding_extension++; |
#endif /* VERIFY */ |
} |
/* decode picture spatial scalable extension */ |
/* ISO/IEC 13818-2 section 6.2.3.5. */ |
static void picture_spatial_scalable_extension() |
{ |
int pos; |
pos = ld->Bitcnt; |
ld->pict_scal = 1; /* use spatial scalability in this picture */ |
lower_layer_temporal_reference = Get_Bits(10); |
marker_bit("picture_spatial_scalable_extension(), first marker bit"); |
lower_layer_horizontal_offset = Get_Bits(15); |
if (lower_layer_horizontal_offset>=16384) |
lower_layer_horizontal_offset-= 32768; |
marker_bit("picture_spatial_scalable_extension(), second marker bit"); |
lower_layer_vertical_offset = Get_Bits(15); |
if (lower_layer_vertical_offset>=16384) |
lower_layer_vertical_offset-= 32768; |
spatial_temporal_weight_code_table_index = Get_Bits(2); |
lower_layer_progressive_frame = Get_Bits(1); |
lower_layer_deinterlaced_field_select = Get_Bits(1); |
#ifdef VERBOSE |
if (Verbose_Flag>NO_LAYER) |
{ |
cprintf("picture spatial scalable extension (byte %d)\n",(pos>>3)-4); |
if (Verbose_Flag>SEQUENCE_LAYER) |
{ |
cprintf(" lower_layer_temporal_reference=%d\n",lower_layer_temporal_reference); |
cprintf(" lower_layer_horizontal_offset=%d\n",lower_layer_horizontal_offset); |
cprintf(" lower_layer_vertical_offset=%d\n",lower_layer_vertical_offset); |
cprintf(" spatial_temporal_weight_code_table_index=%d\n", |
spatial_temporal_weight_code_table_index); |
cprintf(" lower_layer_progressive_frame=%d\n",lower_layer_progressive_frame); |
cprintf(" lower_layer_deinterlaced_field_select=%d\n",lower_layer_deinterlaced_field_select); |
} |
} |
#endif /* VERBOSE */ |
#ifdef VERIFY |
verify_picture_spatial_scalable_extension++; |
#endif /* VERIFY */ |
} |
/* decode picture temporal scalable extension |
* |
* not implemented |
*/ |
/* ISO/IEC 13818-2 section 6.2.3.4. */ |
static void picture_temporal_scalable_extension() |
{ |
Error("temporal scalability not supported\n"); |
#ifdef VERIFY |
verify_picture_temporal_scalable_extension++; |
#endif /* VERIFY */ |
} |
/* decode extra bit information */ |
/* ISO/IEC 13818-2 section 6.2.3.4. */ |
static int extra_bit_information() |
{ |
int Byte_Count = 0; |
while (Get_Bits1()) |
{ |
Flush_Buffer(8); |
Byte_Count++; |
} |
return(Byte_Count); |
} |
/* ISO/IEC 13818-2 section 5.3 */ |
/* Purpose: this function is mainly designed to aid in bitstream conformance |
testing. A simple Flush_Buffer(1) would do */ |
void marker_bit(text) |
char *text; |
{ |
int marker; |
marker = Get_Bits(1); |
#ifdef VERIFY |
if(!marker) |
cprintf("ERROR: %s--marker_bit set to 0",text); |
#endif |
} |
/* ISO/IEC 13818-2 sections 6.3.4.1 and 6.2.2.2.2 */ |
static void user_data() |
{ |
/* skip ahead to the next start code */ |
next_start_code(); |
} |
/* Copyright extension */ |
/* ISO/IEC 13818-2 section 6.2.3.6. */ |
/* (header added in November, 1994 to the IS document) */ |
static void copyright_extension() |
{ |
int pos; |
int reserved_data; |
pos = ld->Bitcnt; |
copyright_flag = Get_Bits(1); |
copyright_identifier = Get_Bits(8); |
original_or_copy = Get_Bits(1); |
/* reserved */ |
reserved_data = Get_Bits(7); |
marker_bit("copyright_extension(), first marker bit"); |
copyright_number_1 = Get_Bits(20); |
marker_bit("copyright_extension(), second marker bit"); |
copyright_number_2 = Get_Bits(22); |
marker_bit("copyright_extension(), third marker bit"); |
copyright_number_3 = Get_Bits(22); |
if(Verbose_Flag>NO_LAYER) |
{ |
cprintf("copyright_extension (byte %d)\n",(pos>>3)-4); |
if (Verbose_Flag>SEQUENCE_LAYER) |
{ |
cprintf(" copyright_flag =%d\n",copyright_flag); |
cprintf(" copyright_identifier=%d\n",copyright_identifier); |
cprintf(" original_or_copy = %d (original=1, copy=0)\n", |
original_or_copy); |
cprintf(" copyright_number_1=%d\n",copyright_number_1); |
cprintf(" copyright_number_2=%d\n",copyright_number_2); |
cprintf(" copyright_number_3=%d\n",copyright_number_3); |
} |
} |
#ifdef VERIFY |
verify_copyright_extension++; |
#endif /* VERIFY */ |
} |
/* introduced in September 1995 to assist Spatial Scalability */ |
static void Update_Temporal_Reference_Tacking_Data() |
{ |
static int temporal_reference_wrap = 0; |
static int temporal_reference_old = 0; |
if (ld == &base) /* *CH* */ |
{ |
if (picture_coding_type!=B_TYPE && temporal_reference!=temporal_reference_old) |
/* check first field of */ |
{ |
/* non-B-frame */ |
if (temporal_reference_wrap) |
{/* wrap occured at previous I- or P-frame */ |
/* now all intervening B-frames which could |
still have high temporal_reference values are done */ |
Temporal_Reference_Base += 1024; |
temporal_reference_wrap = 0; |
} |
/* distinguish from a reset */ |
if (temporal_reference<temporal_reference_old && !Temporal_Reference_GOP_Reset) |
temporal_reference_wrap = 1; /* we must have just passed a GOP-Header! */ |
temporal_reference_old = temporal_reference; |
Temporal_Reference_GOP_Reset = 0; |
} |
True_Framenum = Temporal_Reference_Base + temporal_reference; |
/* temporary wrap of TR at 1024 for M frames */ |
if (temporal_reference_wrap && temporal_reference <= temporal_reference_old) |
True_Framenum += 1024; |
True_Framenum_max = (True_Framenum > True_Framenum_max) ? |
True_Framenum : True_Framenum_max; |
} |
} |
/demos/tags/rel_1_5_beta1/first/mpeg2/idctref.c |
---|
0,0 → 1,108 |
/* Reference_IDCT.c, Inverse Discrete Fourier Transform, double precision */ |
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */ |
/* |
* Disclaimer of Warranty |
* |
* These software programs are available to the user without any license fee or |
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims |
* any and all warranties, whether express, implied, or statuary, including any |
* implied warranties or merchantability or of fitness for a particular |
* purpose. In no event shall the copyright-holder be liable for any |
* incidental, punitive, or consequential damages of any kind whatsoever |
* arising from the use of these programs. |
* |
* This disclaimer of warranty extends to the user of these programs and user's |
* customers, employees, agents, transferees, successors, and assigns. |
* |
* The MPEG Software Simulation Group does not represent or warrant that the |
* programs furnished hereunder are free of infringement of any third-party |
* patents. |
* |
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware, |
* are subject to royalty fees to patent holders. Many of these patents are |
* general enough such that they are unavoidable regardless of implementation |
* design. |
* |
*/ |
/* Perform IEEE 1180 reference (64-bit floating point, separable 8x1 |
* direct matrix multiply) Inverse Discrete Cosine Transform |
*/ |
/* Here we use math.h to generate constants. Compiler results may |
vary a little */ |
#include <math.h> |
#include "config.h" |
#ifndef PI |
# ifdef M_PI |
# define PI M_PI |
# else |
# define PI 3.14159265358979323846 |
# endif |
#endif |
/* global declarations */ |
void Initialize_Fast_IDCTref _ANSI_ARGS_((void)); |
void Reference_IDCT _ANSI_ARGS_((short *block)); |
/* private data */ |
/* cosine transform matrix for 8x1 IDCT */ |
static double c[8][8]; |
/* initialize DCT coefficient matrix */ |
void Initialize_Reference_IDCT() |
{ |
int freq, time; |
double scale; |
for (freq=0; freq < 8; freq++) |
{ |
scale = (freq == 0) ? sqrt(0.125) : 0.5; |
for (time=0; time<8; time++) |
c[freq][time] = scale*cos((PI/8.0)*freq*(time + 0.5)); |
} |
} |
/* perform IDCT matrix multiply for 8x8 coefficient block */ |
void Reference_IDCT(block) |
short *block; |
{ |
int i, j, k, v; |
double partial_product; |
double tmp[64]; |
for (i=0; i<8; i++) |
for (j=0; j<8; j++) |
{ |
partial_product = 0.0; |
for (k=0; k<8; k++) |
partial_product+= c[k][j]*block[8*i+k]; |
tmp[8*i+j] = partial_product; |
} |
/* Transpose operation is integrated into address mapping by switching |
loop order of i and j */ |
for (j=0; j<8; j++) |
for (i=0; i<8; i++) |
{ |
partial_product = 0.0; |
for (k=0; k<8; k++) |
partial_product+= c[k][i]*tmp[8*k+j]; |
v = (int) floor(partial_product+0.5); |
block[8*i+j] = (v<-256) ? -256 : ((v>255) ? 255 : v); |
} |
} |
/demos/tags/rel_1_5_beta1/first/mpeg2/idct.c |
---|
0,0 → 1,211 |
/* idct.c, inverse fast discrete cosine transform */ |
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */ |
/* |
* Disclaimer of Warranty |
* |
* These software programs are available to the user without any license fee or |
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims |
* any and all warranties, whether express, implied, or statuary, including any |
* implied warranties or merchantability or of fitness for a particular |
* purpose. In no event shall the copyright-holder be liable for any |
* incidental, punitive, or consequential damages of any kind whatsoever |
* arising from the use of these programs. |
* |
* This disclaimer of warranty extends to the user of these programs and user's |
* customers, employees, agents, transferees, successors, and assigns. |
* |
* The MPEG Software Simulation Group does not represent or warrant that the |
* programs furnished hereunder are free of infringement of any third-party |
* patents. |
* |
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware, |
* are subject to royalty fees to patent holders. Many of these patents are |
* general enough such that they are unavoidable regardless of implementation |
* design. |
* |
*/ |
/**********************************************************/ |
/* inverse two dimensional DCT, Chen-Wang algorithm */ |
/* (cf. IEEE ASSP-32, pp. 803-816, Aug. 1984) */ |
/* 32-bit integer arithmetic (8 bit coefficients) */ |
/* 11 mults, 29 adds per DCT */ |
/* sE, 18.8.91 */ |
/**********************************************************/ |
/* coefficients extended to 12 bit for IEEE1180-1990 */ |
/* compliance sE, 2.1.94 */ |
/**********************************************************/ |
/* this code assumes >> to be a two's-complement arithmetic */ |
/* right shift: (-2)>>1 == -1 , (-3)>>1 == -2 */ |
#include "config.h" |
#define W1 2841 /* 2048*sqrt(2)*cos(1*pi/16) */ |
#define W2 2676 /* 2048*sqrt(2)*cos(2*pi/16) */ |
#define W3 2408 /* 2048*sqrt(2)*cos(3*pi/16) */ |
#define W5 1609 /* 2048*sqrt(2)*cos(5*pi/16) */ |
#define W6 1108 /* 2048*sqrt(2)*cos(6*pi/16) */ |
#define W7 565 /* 2048*sqrt(2)*cos(7*pi/16) */ |
/* global declarations */ |
void Initialize_Fast_IDCT _ANSI_ARGS_((void)); |
void Fast_IDCT _ANSI_ARGS_((short *block)); |
/* private data */ |
static short iclip[1024]; /* clipping table */ |
static short *iclp; |
/* private prototypes */ |
static void idctrow _ANSI_ARGS_((short *blk)); |
static void idctcol _ANSI_ARGS_((short *blk)); |
/* row (horizontal) IDCT |
* |
* 7 pi 1 |
* dst[k] = sum c[l] * src[l] * cos( -- * ( k + - ) * l ) |
* l=0 8 2 |
* |
* where: c[0] = 128 |
* c[1..7] = 128*sqrt(2) |
*/ |
static void idctrow(blk) |
short *blk; |
{ |
int x0, x1, x2, x3, x4, x5, x6, x7, x8; |
/* shortcut */ |
if (!((x1 = blk[4]<<11) | (x2 = blk[6]) | (x3 = blk[2]) | |
(x4 = blk[1]) | (x5 = blk[7]) | (x6 = blk[5]) | (x7 = blk[3]))) |
{ |
blk[0]=blk[1]=blk[2]=blk[3]=blk[4]=blk[5]=blk[6]=blk[7]=blk[0]<<3; |
return; |
} |
x0 = (blk[0]<<11) + 128; /* for proper rounding in the fourth stage */ |
/* first stage */ |
x8 = W7*(x4+x5); |
x4 = x8 + (W1-W7)*x4; |
x5 = x8 - (W1+W7)*x5; |
x8 = W3*(x6+x7); |
x6 = x8 - (W3-W5)*x6; |
x7 = x8 - (W3+W5)*x7; |
/* second stage */ |
x8 = x0 + x1; |
x0 -= x1; |
x1 = W6*(x3+x2); |
x2 = x1 - (W2+W6)*x2; |
x3 = x1 + (W2-W6)*x3; |
x1 = x4 + x6; |
x4 -= x6; |
x6 = x5 + x7; |
x5 -= x7; |
/* third stage */ |
x7 = x8 + x3; |
x8 -= x3; |
x3 = x0 + x2; |
x0 -= x2; |
x2 = (181*(x4+x5)+128)>>8; |
x4 = (181*(x4-x5)+128)>>8; |
/* fourth stage */ |
blk[0] = (x7+x1)>>8; |
blk[1] = (x3+x2)>>8; |
blk[2] = (x0+x4)>>8; |
blk[3] = (x8+x6)>>8; |
blk[4] = (x8-x6)>>8; |
blk[5] = (x0-x4)>>8; |
blk[6] = (x3-x2)>>8; |
blk[7] = (x7-x1)>>8; |
} |
/* column (vertical) IDCT |
* |
* 7 pi 1 |
* dst[8*k] = sum c[l] * src[8*l] * cos( -- * ( k + - ) * l ) |
* l=0 8 2 |
* |
* where: c[0] = 1/1024 |
* c[1..7] = (1/1024)*sqrt(2) |
*/ |
static void idctcol(blk) |
short *blk; |
{ |
int x0, x1, x2, x3, x4, x5, x6, x7, x8; |
/* shortcut */ |
if (!((x1 = (blk[8*4]<<8)) | (x2 = blk[8*6]) | (x3 = blk[8*2]) | |
(x4 = blk[8*1]) | (x5 = blk[8*7]) | (x6 = blk[8*5]) | (x7 = blk[8*3]))) |
{ |
blk[8*0]=blk[8*1]=blk[8*2]=blk[8*3]=blk[8*4]=blk[8*5]=blk[8*6]=blk[8*7]= |
iclp[(blk[8*0]+32)>>6]; |
return; |
} |
x0 = (blk[8*0]<<8) + 8192; |
/* first stage */ |
x8 = W7*(x4+x5) + 4; |
x4 = (x8+(W1-W7)*x4)>>3; |
x5 = (x8-(W1+W7)*x5)>>3; |
x8 = W3*(x6+x7) + 4; |
x6 = (x8-(W3-W5)*x6)>>3; |
x7 = (x8-(W3+W5)*x7)>>3; |
/* second stage */ |
x8 = x0 + x1; |
x0 -= x1; |
x1 = W6*(x3+x2) + 4; |
x2 = (x1-(W2+W6)*x2)>>3; |
x3 = (x1+(W2-W6)*x3)>>3; |
x1 = x4 + x6; |
x4 -= x6; |
x6 = x5 + x7; |
x5 -= x7; |
/* third stage */ |
x7 = x8 + x3; |
x8 -= x3; |
x3 = x0 + x2; |
x0 -= x2; |
x2 = (181*(x4+x5)+128)>>8; |
x4 = (181*(x4-x5)+128)>>8; |
/* fourth stage */ |
blk[8*0] = iclp[(x7+x1)>>14]; |
blk[8*1] = iclp[(x3+x2)>>14]; |
blk[8*2] = iclp[(x0+x4)>>14]; |
blk[8*3] = iclp[(x8+x6)>>14]; |
blk[8*4] = iclp[(x8-x6)>>14]; |
blk[8*5] = iclp[(x0-x4)>>14]; |
blk[8*6] = iclp[(x3-x2)>>14]; |
blk[8*7] = iclp[(x7-x1)>>14]; |
} |
/* two dimensional inverse discrete cosine transform */ |
void Fast_IDCT(block) |
short *block; |
{ |
int i; |
for (i=0; i<8; i++) |
idctrow(block+8*i); |
for (i=0; i<8; i++) |
idctcol(block+i); |
} |
void Initialize_Fast_IDCT() |
{ |
int i; |
iclp = iclip+512; |
for (i= -512; i<512; i++) |
iclp[i] = (i<-256) ? -256 : ((i>255) ? 255 : i); |
} |
/demos/tags/rel_1_5_beta1/first/mpeg2/getvlc.c |
---|
0,0 → 1,797 |
/* getvlc.c, variable length decoding */ |
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */ |
/* |
* Disclaimer of Warranty |
* |
* These software programs are available to the user without any license fee or |
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims |
* any and all warranties, whether express, implied, or statuary, including any |
* implied warranties or merchantability or of fitness for a particular |
* purpose. In no event shall the copyright-holder be liable for any |
* incidental, punitive, or consequential damages of any kind whatsoever |
* arising from the use of these programs. |
* |
* This disclaimer of warranty extends to the user of these programs and user's |
* customers, employees, agents, transferees, successors, and assigns. |
* |
* The MPEG Software Simulation Group does not represent or warrant that the |
* programs furnished hereunder are free of infringement of any third-party |
* patents. |
* |
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware, |
* are subject to royalty fees to patent holders. Many of these patents are |
* general enough such that they are unavoidable regardless of implementation |
* design. |
* |
*/ |
#include "config.h" |
#include "global.h" |
#include "getvlc.h" |
/* private prototypes */ |
/* generic picture macroblock type processing functions */ |
static int Get_I_macroblock_type _ANSI_ARGS_((void)); |
static int Get_P_macroblock_type _ANSI_ARGS_((void)); |
static int Get_B_macroblock_type _ANSI_ARGS_((void)); |
static int Get_D_macroblock_type _ANSI_ARGS_((void)); |
/* spatial picture macroblock type processing functions */ |
static int Get_I_Spatial_macroblock_type _ANSI_ARGS_((void)); |
static int Get_P_Spatial_macroblock_type _ANSI_ARGS_((void)); |
static int Get_B_Spatial_macroblock_type _ANSI_ARGS_((void)); |
static int Get_SNR_macroblock_type _ANSI_ARGS_((void)); |
int Get_macroblock_type() |
{ |
int macroblock_type = 0; |
if (ld->scalable_mode==SC_SNR) |
macroblock_type = Get_SNR_macroblock_type(); |
else |
{ |
switch (picture_coding_type) |
{ |
case I_TYPE: |
macroblock_type = ld->pict_scal ? Get_I_Spatial_macroblock_type() : Get_I_macroblock_type(); |
break; |
case P_TYPE: |
macroblock_type = ld->pict_scal ? Get_P_Spatial_macroblock_type() : Get_P_macroblock_type(); |
break; |
case B_TYPE: |
macroblock_type = ld->pict_scal ? Get_B_Spatial_macroblock_type() : Get_B_macroblock_type(); |
break; |
case D_TYPE: |
macroblock_type = Get_D_macroblock_type(); |
break; |
default: |
cprintf("Get_macroblock_type(): unrecognized picture coding type\n"); |
break; |
} |
} |
return macroblock_type; |
} |
static int Get_I_macroblock_type() |
{ |
#ifdef TRACE |
if (Trace_Flag) |
cprintf("macroblock_type(I) "); |
#endif /* TRACE */ |
if (Get_Bits1()) |
{ |
#ifdef TRACE |
if (Trace_Flag) |
cprintf("(1): Intra (1)\n"); |
#endif /* TRACE */ |
return 1; |
} |
if (!Get_Bits1()) |
{ |
if (!Quiet_Flag) |
cprintf("Invalid macroblock_type code\n"); |
Fault_Flag = 1; |
} |
#ifdef TRACE |
if (Trace_Flag) |
cprintf("(01): Intra, Quant (17)\n"); |
#endif /* TRACE */ |
return 17; |
} |
static char *MBdescr[]={ |
"", "Intra", "No MC, Coded", "", |
"Bwd, Not Coded", "", "Bwd, Coded", "", |
"Fwd, Not Coded", "", "Fwd, Coded", "", |
"Interp, Not Coded", "", "Interp, Coded", "", |
"", "Intra, Quant", "No MC, Coded, Quant", "", |
"", "", "Bwd, Coded, Quant", "", |
"", "", "Fwd, Coded, Quant", "", |
"", "", "Interp, Coded, Quant", "" |
}; |
static int Get_P_macroblock_type() |
{ |
int code; |
#ifdef TRACE |
if (Trace_Flag) |
cprintf("macroblock_type(P) ("); |
#endif /* TRACE */ |
if ((code = Show_Bits(6))>=8) |
{ |
code >>= 3; |
Flush_Buffer(PMBtab0[code].len); |
#ifdef TRACE |
if (Trace_Flag) |
{ |
Print_Bits(code,3,PMBtab0[code].len); |
cprintf("): %s (%d)\n",MBdescr[(int)PMBtab0[code].val],PMBtab0[code].val); |
} |
#endif /* TRACE */ |
return PMBtab0[code].val; |
} |
if (code==0) |
{ |
if (!Quiet_Flag) |
cprintf("Invalid macroblock_type code\n"); |
Fault_Flag = 1; |
return 0; |
} |
Flush_Buffer(PMBtab1[code].len); |
#ifdef TRACE |
if (Trace_Flag) |
{ |
Print_Bits(code,6,PMBtab1[code].len); |
cprintf("): %s (%d)\n",MBdescr[(int)PMBtab1[code].val],PMBtab1[code].val); |
} |
#endif /* TRACE */ |
return PMBtab1[code].val; |
} |
static int Get_B_macroblock_type() |
{ |
int code; |
#ifdef TRACE |
if (Trace_Flag) |
cprintf("macroblock_type(B) ("); |
#endif /* TRACE */ |
if ((code = Show_Bits(6))>=8) |
{ |
code >>= 2; |
Flush_Buffer(BMBtab0[code].len); |
#ifdef TRACE |
if (Trace_Flag) |
{ |
Print_Bits(code,4,BMBtab0[code].len); |
cprintf("): %s (%d)\n",MBdescr[(int)BMBtab0[code].val],BMBtab0[code].val); |
} |
#endif /* TRACE */ |
return BMBtab0[code].val; |
} |
if (code==0) |
{ |
if (!Quiet_Flag) |
cprintf("Invalid macroblock_type code\n"); |
Fault_Flag = 1; |
return 0; |
} |
Flush_Buffer(BMBtab1[code].len); |
#ifdef TRACE |
if (Trace_Flag) |
{ |
Print_Bits(code,6,BMBtab1[code].len); |
cprintf("): %s (%d)\n",MBdescr[(int)BMBtab1[code].val],BMBtab1[code].val); |
} |
#endif /* TRACE */ |
return BMBtab1[code].val; |
} |
static int Get_D_macroblock_type() |
{ |
if (!Get_Bits1()) |
{ |
if (!Quiet_Flag) |
cprintf("Invalid macroblock_type code\n"); |
Fault_Flag=1; |
} |
return 1; |
} |
/* macroblock_type for pictures with spatial scalability */ |
static int Get_I_Spatial_macroblock_type() |
{ |
int code; |
#ifdef TRACE |
if (Trace_Flag) |
cprintf("macroblock_type(I,spat) ("); |
#endif /* TRACE */ |
code = Show_Bits(4); |
if (code==0) |
{ |
if (!Quiet_Flag) |
cprintf("Invalid macroblock_type code\n"); |
Fault_Flag = 1; |
return 0; |
} |
#ifdef TRACE |
if (Trace_Flag) |
{ |
Print_Bits(code,4,spIMBtab[code].len); |
cprintf("): %02x\n",spIMBtab[code].val); |
} |
#endif /* TRACE */ |
Flush_Buffer(spIMBtab[code].len); |
return spIMBtab[code].val; |
} |
static int Get_P_Spatial_macroblock_type() |
{ |
int code; |
#ifdef TRACE |
if (Trace_Flag) |
cprintf("macroblock_type(P,spat) ("); |
#endif /* TRACE */ |
code = Show_Bits(7); |
if (code<2) |
{ |
if (!Quiet_Flag) |
cprintf("Invalid macroblock_type code\n"); |
Fault_Flag = 1; |
return 0; |
} |
if (code>=16) |
{ |
code >>= 3; |
Flush_Buffer(spPMBtab0[code].len); |
#ifdef TRACE |
if (Trace_Flag) |
{ |
Print_Bits(code,4,spPMBtab0[code].len); |
cprintf("): %02x\n",spPMBtab0[code].val); |
} |
#endif /* TRACE */ |
return spPMBtab0[code].val; |
} |
Flush_Buffer(spPMBtab1[code].len); |
#ifdef TRACE |
if (Trace_Flag) |
{ |
Print_Bits(code,7,spPMBtab1[code].len); |
cprintf("): %02x\n",spPMBtab1[code].val); |
} |
#endif /* TRACE */ |
return spPMBtab1[code].val; |
} |
static int Get_B_Spatial_macroblock_type() |
{ |
int code; |
VLCtab *p; |
#ifdef TRACE |
if (Trace_Flag) |
cprintf("macroblock_type(B,spat) ("); |
#endif /* TRACE */ |
code = Show_Bits(9); |
if (code>=64) |
p = &spBMBtab0[(code>>5)-2]; |
else if (code>=16) |
p = &spBMBtab1[(code>>2)-4]; |
else if (code>=8) |
p = &spBMBtab2[code-8]; |
else |
{ |
if (!Quiet_Flag) |
cprintf("Invalid macroblock_type code\n"); |
Fault_Flag = 1; |
return 0; |
} |
Flush_Buffer(p->len); |
#ifdef TRACE |
if (Trace_Flag) |
{ |
Print_Bits(code,9,p->len); |
printf("): %02x\n",p->val); |
} |
#endif /* TRACE */ |
return p->val; |
} |
static int Get_SNR_macroblock_type() |
{ |
int code; |
#ifdef TRACE /* *CH* */ |
if (Trace_Flag) |
cprintf("macroblock_type(SNR) ("); |
#endif |
code = Show_Bits(3); |
if (code==0) |
{ |
if (!Quiet_Flag) |
cprintf("Invalid macroblock_type code\n"); |
Fault_Flag = 1; |
return 0; |
} |
Flush_Buffer(SNRMBtab[code].len); |
#ifdef TRACE /* *CH* */ |
if (Trace_Flag) |
{ |
Print_Bits(code,3,SNRMBtab[code].len); |
cprintf("): %s (%d)\n",MBdescr[(int)SNRMBtab[code].val],SNRMBtab[code].val); |
} |
#endif |
return SNRMBtab[code].val; |
} |
int Get_motion_code() |
{ |
int code; |
#ifdef TRACE |
if (Trace_Flag) |
cprintf("motion_code ("); |
#endif /* TRACE */ |
if (Get_Bits1()) |
{ |
#ifdef TRACE |
if (Trace_Flag) |
cprintf("0): 0\n"); |
#endif /* TRACE */ |
return 0; |
} |
if ((code = Show_Bits(9))>=64) |
{ |
code >>= 6; |
Flush_Buffer(MVtab0[code].len); |
#ifdef TRACE |
if (Trace_Flag) |
{ |
Print_Bits(code,3,MVtab0[code].len); |
cprintf("%d): %d\n", |
Show_Bits(1),Show_Bits(1)?-MVtab0[code].val:MVtab0[code].val); |
} |
#endif /* TRACE */ |
return Get_Bits1()?-MVtab0[code].val:MVtab0[code].val; |
} |
if (code>=24) |
{ |
code >>= 3; |
Flush_Buffer(MVtab1[code].len); |
#ifdef TRACE |
if (Trace_Flag) |
{ |
Print_Bits(code,6,MVtab1[code].len); |
cprintf("%d): %d\n", |
Show_Bits(1),Show_Bits(1)?-MVtab1[code].val:MVtab1[code].val); |
} |
#endif /* TRACE */ |
return Get_Bits1()?-MVtab1[code].val:MVtab1[code].val; |
} |
if ((code-=12)<0) |
{ |
if (!Quiet_Flag) |
/* HACK */ |
cprintf("Invalid motion_vector code (MBA %d, pic %d)\n", global_MBA, global_pic); |
Fault_Flag=1; |
return 0; |
} |
Flush_Buffer(MVtab2[code].len); |
#ifdef TRACE |
if (Trace_Flag) |
{ |
Print_Bits(code+12,9,MVtab2[code].len); |
cprintf("%d): %d\n", |
Show_Bits(1),Show_Bits(1)?-MVtab2[code].val:MVtab2[code].val); |
} |
#endif /* TRACE */ |
return Get_Bits1() ? -MVtab2[code].val : MVtab2[code].val; |
} |
/* get differential motion vector (for dual prime prediction) */ |
int Get_dmvector() |
{ |
#ifdef TRACE |
if (Trace_Flag) |
cprintf("dmvector ("); |
#endif /* TRACE */ |
if (Get_Bits(1)) |
{ |
#ifdef TRACE |
if (Trace_Flag) |
cprintf(Show_Bits(1) ? "11): -1\n" : "10): 1\n"); |
#endif /* TRACE */ |
return Get_Bits(1) ? -1 : 1; |
} |
else |
{ |
#ifdef TRACE |
if (Trace_Flag) |
cprintf("0): 0\n"); |
#endif /* TRACE */ |
return 0; |
} |
} |
int Get_coded_block_pattern() |
{ |
int code; |
#ifdef TRACE |
if (Trace_Flag) |
cprintf("coded_block_pattern_420 ("); |
#endif /* TRACE */ |
if ((code = Show_Bits(9))>=128) |
{ |
code >>= 4; |
Flush_Buffer(CBPtab0[code].len); |
#ifdef TRACE |
if (Trace_Flag) |
{ |
Print_Bits(code,5,CBPtab0[code].len); |
cprintf("): "); |
Print_Bits(CBPtab0[code].val,6,6); |
cprintf(" (%d)\n",CBPtab0[code].val); |
} |
#endif /* TRACE */ |
return CBPtab0[code].val; |
} |
if (code>=8) |
{ |
code >>= 1; |
Flush_Buffer(CBPtab1[code].len); |
#ifdef TRACE |
if (Trace_Flag) |
{ |
Print_Bits(code,8,CBPtab1[code].len); |
cprintf("): "); |
Print_Bits(CBPtab1[code].val,6,6); |
cprintf(" (%d)\n",CBPtab1[code].val); |
} |
#endif /* TRACE */ |
return CBPtab1[code].val; |
} |
if (code<1) |
{ |
if (!Quiet_Flag) |
cprintf("Invalid coded_block_pattern code\n"); |
Fault_Flag = 1; |
return 0; |
} |
Flush_Buffer(CBPtab2[code].len); |
#ifdef TRACE |
if (Trace_Flag) |
{ |
Print_Bits(code,9,CBPtab2[code].len); |
cprintf("): "); |
Print_Bits(CBPtab2[code].val,6,6); |
cprintf(" (%d)\n",CBPtab2[code].val); |
} |
#endif /* TRACE */ |
return CBPtab2[code].val; |
} |
int Get_macroblock_address_increment() |
{ |
int code, val; |
#ifdef TRACE |
if (Trace_Flag) |
cprintf("macroblock_address_increment ("); |
#endif /* TRACE */ |
val = 0; |
while ((code = Show_Bits(11))<24) |
{ |
if (code!=15) /* if not macroblock_stuffing */ |
{ |
if (code==8) /* if macroblock_escape */ |
{ |
#ifdef TRACE |
if (Trace_Flag) |
cprintf("00000001000 "); |
#endif /* TRACE */ |
val+= 33; |
} |
else |
{ |
if (!Quiet_Flag) |
cprintf("Invalid macroblock_address_increment code\n"); |
Fault_Flag = 1; |
return 1; |
} |
} |
else /* macroblock suffing */ |
{ |
#ifdef TRACE |
if (Trace_Flag) |
cprintf("00000001111 "); |
#endif /* TRACE */ |
} |
Flush_Buffer(11); |
} |
/* macroblock_address_increment == 1 */ |
/* ('1' is in the MSB position of the lookahead) */ |
if (code>=1024) |
{ |
Flush_Buffer(1); |
#ifdef TRACE |
if (Trace_Flag) |
cprintf("1): %d\n",val+1); |
#endif /* TRACE */ |
return val + 1; |
} |
/* codes 00010 ... 011xx */ |
if (code>=128) |
{ |
/* remove leading zeros */ |
code >>= 6; |
Flush_Buffer(MBAtab1[code].len); |
#ifdef TRACE |
if (Trace_Flag) |
{ |
Print_Bits(code,5,MBAtab1[code].len); |
printf("): %d\n",val+MBAtab1[code].val); |
} |
#endif /* TRACE */ |
return val + MBAtab1[code].val; |
} |
/* codes 00000011000 ... 0000111xxxx */ |
code-= 24; /* remove common base */ |
Flush_Buffer(MBAtab2[code].len); |
#ifdef TRACE |
if (Trace_Flag) |
{ |
Print_Bits(code+24,11,MBAtab2[code].len); |
cprintf("): %d\n",val+MBAtab2[code].val); |
} |
#endif /* TRACE */ |
return val + MBAtab2[code].val; |
} |
/* combined MPEG-1 and MPEG-2 stage. parse VLC and |
perform dct_diff arithmetic. |
MPEG-1: ISO/IEC 11172-2 section |
MPEG-2: ISO/IEC 13818-2 section 7.2.1 |
Note: the arithmetic here is presented more elegantly than |
the spec, yet the results, dct_diff, are the same. |
*/ |
int Get_Luma_DC_dct_diff() |
{ |
int code, size, dct_diff; |
#ifdef TRACE |
/* |
if (Trace_Flag) |
printf("dct_dc_size_luminance: ("); |
*/ |
#endif /* TRACE */ |
/* decode length */ |
code = Show_Bits(5); |
if (code<31) |
{ |
size = DClumtab0[code].val; |
Flush_Buffer(DClumtab0[code].len); |
#ifdef TRACE |
/* |
if (Trace_Flag) |
{ |
Print_Bits(code,5,DClumtab0[code].len); |
printf("): %d",size); |
} |
*/ |
#endif /* TRACE */ |
} |
else |
{ |
code = Show_Bits(9) - 0x1f0; |
size = DClumtab1[code].val; |
Flush_Buffer(DClumtab1[code].len); |
#ifdef TRACE |
/* |
if (Trace_Flag) |
{ |
Print_Bits(code+0x1f0,9,DClumtab1[code].len); |
printf("): %d",size); |
} |
*/ |
#endif /* TRACE */ |
} |
#ifdef TRACE |
/* |
if (Trace_Flag) |
printf(", dct_dc_differential ("); |
*/ |
#endif /* TRACE */ |
if (size==0) |
dct_diff = 0; |
else |
{ |
dct_diff = Get_Bits(size); |
#ifdef TRACE |
/* |
if (Trace_Flag) |
Print_Bits(dct_diff,size,size); |
*/ |
#endif /* TRACE */ |
if ((dct_diff & (1<<(size-1)))==0) |
dct_diff-= (1<<size) - 1; |
} |
#ifdef TRACE |
/* |
if (Trace_Flag) |
printf("): %d\n",dct_diff); |
*/ |
#endif /* TRACE */ |
return dct_diff; |
} |
int Get_Chroma_DC_dct_diff() |
{ |
int code, size, dct_diff; |
#ifdef TRACE |
/* |
if (Trace_Flag) |
printf("dct_dc_size_chrominance: ("); |
*/ |
#endif /* TRACE */ |
/* decode length */ |
code = Show_Bits(5); |
if (code<31) |
{ |
size = DCchromtab0[code].val; |
Flush_Buffer(DCchromtab0[code].len); |
#ifdef TRACE |
/* |
if (Trace_Flag) |
{ |
Print_Bits(code,5,DCchromtab0[code].len); |
printf("): %d",size); |
} |
*/ |
#endif /* TRACE */ |
} |
else |
{ |
code = Show_Bits(10) - 0x3e0; |
size = DCchromtab1[code].val; |
Flush_Buffer(DCchromtab1[code].len); |
#ifdef TRACE |
/* |
if (Trace_Flag) |
{ |
Print_Bits(code+0x3e0,10,DCchromtab1[code].len); |
printf("): %d",size); |
} |
*/ |
#endif /* TRACE */ |
} |
#ifdef TRACE |
/* |
if (Trace_Flag) |
printf(", dct_dc_differential ("); |
*/ |
#endif /* TRACE */ |
if (size==0) |
dct_diff = 0; |
else |
{ |
dct_diff = Get_Bits(size); |
#ifdef TRACE |
/* |
if (Trace_Flag) |
Print_Bits(dct_diff,size,size); |
*/ |
#endif /* TRACE */ |
if ((dct_diff & (1<<(size-1)))==0) |
dct_diff-= (1<<size) - 1; |
} |
#ifdef TRACE |
/* |
if (Trace_Flag) |
printf("): %d\n",dct_diff); |
*/ |
#endif /* TRACE */ |
return dct_diff; |
} |
/demos/tags/rel_1_5_beta1/first/mpeg2/getvlc.h |
---|
0,0 → 1,491 |
/* getvlc.h, variable length code tables */ |
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */ |
/* |
* Disclaimer of Warranty |
* |
* These software programs are available to the user without any license fee or |
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims |
* any and all warranties, whether express, implied, or statuary, including any |
* implied warranties or merchantability or of fitness for a particular |
* purpose. In no event shall the copyright-holder be liable for any |
* incidental, punitive, or consequential damages of any kind whatsoever |
* arising from the use of these programs. |
* |
* This disclaimer of warranty extends to the user of these programs and user's |
* customers, employees, agents, transferees, successors, and assigns. |
* |
* The MPEG Software Simulation Group does not represent or warrant that the |
* programs furnished hereunder are free of infringement of any third-party |
* patents. |
* |
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware, |
* are subject to royalty fees to patent holders. Many of these patents are |
* general enough such that they are unavoidable regardless of implementation |
* design. |
* |
*/ |
/* NOTE: #define constants such as MACROBLOCK_QUANT are upper case |
as per C programming convention. However, the MPEG document |
(ISO/IEC 13818-2) lists them in all lower case (e.g. Annex B) */ |
/* NOTE: the VLC tables are in a flash format---a transformation |
of the tables in Annex B to a form more convenient towards |
parallel (more than one-bit-at-a-time) decoding */ |
typedef struct { |
char val, len; |
} VLCtab; |
typedef struct { |
char run, level, len; |
} DCTtab; |
/* Table B-3, macroblock_type in P-pictures, codes 001..1xx */ |
static VLCtab PMBtab0[8] = { |
{ERROR,0}, |
{MACROBLOCK_MOTION_FORWARD,3}, |
{MACROBLOCK_PATTERN,2}, {MACROBLOCK_PATTERN,2}, |
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,1}, |
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,1}, |
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,1}, |
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,1} |
}; |
/* Table B-3, macroblock_type in P-pictures, codes 000001..00011x */ |
static VLCtab PMBtab1[8] = { |
{ERROR,0}, |
{MACROBLOCK_QUANT|MACROBLOCK_INTRA,6}, |
{MACROBLOCK_QUANT|MACROBLOCK_PATTERN,5}, {MACROBLOCK_QUANT|MACROBLOCK_PATTERN,5}, |
{MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,5}, {MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,5}, |
{MACROBLOCK_INTRA,5}, {MACROBLOCK_INTRA,5} |
}; |
/* Table B-4, macroblock_type in B-pictures, codes 0010..11xx */ |
static VLCtab BMBtab0[16] = { |
{ERROR,0}, |
{ERROR,0}, |
{MACROBLOCK_MOTION_FORWARD,4}, |
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,4}, |
{MACROBLOCK_MOTION_BACKWARD,3}, |
{MACROBLOCK_MOTION_BACKWARD,3}, |
{MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,3}, |
{MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,3}, |
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2}, |
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2}, |
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2}, |
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2}, |
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2}, |
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2}, |
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2}, |
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2} |
}; |
/* Table B-4, macroblock_type in B-pictures, codes 000001..00011x */ |
static VLCtab BMBtab1[8] = { |
{ERROR,0}, |
{MACROBLOCK_QUANT|MACROBLOCK_INTRA,6}, |
{MACROBLOCK_QUANT|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,6}, |
{MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,6}, |
{MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,5}, |
{MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,5}, |
{MACROBLOCK_INTRA,5}, |
{MACROBLOCK_INTRA,5} |
}; |
/* Table B-5, macroblock_type in spat. scal. I-pictures, codes 0001..1xxx */ |
static VLCtab spIMBtab[16] = { |
{ERROR,0}, |
{PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS,4}, |
{MACROBLOCK_QUANT|MACROBLOCK_INTRA,4}, |
{MACROBLOCK_INTRA,4}, |
{PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,2}, {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,2}, |
{PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,2}, {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,2}, |
{PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1}, {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1}, |
{PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1}, {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1}, |
{PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1}, {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1}, |
{PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1}, {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1} |
}; |
/* Table B-6, macroblock_type in spat. scal. P-pictures, codes 0010..11xx */ |
static VLCtab spPMBtab0[16] = |
{ |
{ERROR,0}, |
{ERROR,0}, |
{MACROBLOCK_MOTION_FORWARD,4}, |
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD,4}, |
{MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,3}, {MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,3}, |
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,3}, {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,3}, |
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2}, |
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2}, |
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2}, |
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2}, |
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2}, |
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2}, |
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2}, |
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2} |
}; |
/* Table B-6, macroblock_type in spat. scal. P-pictures, codes 0000010..000111x */ |
static VLCtab spPMBtab1[16] = { |
{ERROR,0}, |
{ERROR,0}, |
{PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,7}, |
{PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS,7}, |
{MACROBLOCK_PATTERN,7}, |
{PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,7}, |
{MACROBLOCK_QUANT|MACROBLOCK_INTRA,7}, |
{MACROBLOCK_INTRA,7}, |
{MACROBLOCK_QUANT|MACROBLOCK_PATTERN,6}, |
{MACROBLOCK_QUANT|MACROBLOCK_PATTERN,6}, |
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,6}, |
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,6}, |
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG,6}, |
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG,6}, |
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_PATTERN,6}, |
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_PATTERN,6} |
}; |
/* Table B-7, macroblock_type in spat. scal. B-pictures, codes 0010..11xx */ |
static VLCtab spBMBtab0[14] = { |
{MACROBLOCK_MOTION_FORWARD,4}, |
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,4}, |
{MACROBLOCK_MOTION_BACKWARD,3}, |
{MACROBLOCK_MOTION_BACKWARD,3}, |
{MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,3}, |
{MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,3}, |
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2}, |
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2}, |
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2}, |
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2}, |
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2}, |
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2}, |
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2}, |
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2} |
}; |
/* Table B-7, macroblock_type in spat. scal. B-pictures, codes 0000100..000111x */ |
static VLCtab spBMBtab1[12] = { |
{MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,7}, |
{MACROBLOCK_QUANT|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,7}, |
{MACROBLOCK_INTRA,7}, |
{MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,7}, |
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD,6}, |
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD,6}, |
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,6}, |
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,6}, |
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_BACKWARD,6}, |
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_BACKWARD,6}, |
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,6}, |
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,6} |
}; |
/* Table B-7, macroblock_type in spat. scal. B-pictures, codes 00000100x..000001111 */ |
static VLCtab spBMBtab2[8] = { |
{MACROBLOCK_QUANT|MACROBLOCK_INTRA,8}, |
{MACROBLOCK_QUANT|MACROBLOCK_INTRA,8}, |
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,8}, |
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,8}, |
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,9}, |
{PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,9}, |
{PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS,9}, |
{PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,9} |
}; |
/* Table B-8, macroblock_type in spat. scal. B-pictures, codes 001..1xx */ |
static VLCtab SNRMBtab[8] = { |
{ERROR,0}, |
{0,3}, |
{MACROBLOCK_QUANT|MACROBLOCK_PATTERN,2}, |
{MACROBLOCK_QUANT|MACROBLOCK_PATTERN,2}, |
{MACROBLOCK_PATTERN,1}, |
{MACROBLOCK_PATTERN,1}, |
{MACROBLOCK_PATTERN,1}, |
{MACROBLOCK_PATTERN,1} |
}; |
/* Table B-10, motion_code, codes 0001 ... 01xx */ |
static VLCtab MVtab0[8] = |
{ {ERROR,0}, {3,3}, {2,2}, {2,2}, {1,1}, {1,1}, {1,1}, {1,1} |
}; |
/* Table B-10, motion_code, codes 0000011 ... 000011x */ |
static VLCtab MVtab1[8] = |
{ {ERROR,0}, {ERROR,0}, {ERROR,0}, {7,6}, {6,6}, {5,6}, {4,5}, {4,5} |
}; |
/* Table B-10, motion_code, codes 0000001100 ... 000001011x */ |
static VLCtab MVtab2[12] = |
{ {16,9}, {15,9}, {14,9}, {13,9}, |
{12,9}, {11,9}, {10,8}, {10,8}, |
{9,8}, {9,8}, {8,8}, {8,8} |
}; |
/* Table B-9, coded_block_pattern, codes 01000 ... 111xx */ |
static VLCtab CBPtab0[32] = |
{ {ERROR,0}, {ERROR,0}, {ERROR,0}, {ERROR,0}, |
{ERROR,0}, {ERROR,0}, {ERROR,0}, {ERROR,0}, |
{62,5}, {2,5}, {61,5}, {1,5}, {56,5}, {52,5}, {44,5}, {28,5}, |
{40,5}, {20,5}, {48,5}, {12,5}, {32,4}, {32,4}, {16,4}, {16,4}, |
{8,4}, {8,4}, {4,4}, {4,4}, {60,3}, {60,3}, {60,3}, {60,3} |
}; |
/* Table B-9, coded_block_pattern, codes 00000100 ... 001111xx */ |
static VLCtab CBPtab1[64] = |
{ {ERROR,0}, {ERROR,0}, {ERROR,0}, {ERROR,0}, |
{58,8}, {54,8}, {46,8}, {30,8}, |
{57,8}, {53,8}, {45,8}, {29,8}, {38,8}, {26,8}, {37,8}, {25,8}, |
{43,8}, {23,8}, {51,8}, {15,8}, {42,8}, {22,8}, {50,8}, {14,8}, |
{41,8}, {21,8}, {49,8}, {13,8}, {35,8}, {19,8}, {11,8}, {7,8}, |
{34,7}, {34,7}, {18,7}, {18,7}, {10,7}, {10,7}, {6,7}, {6,7}, |
{33,7}, {33,7}, {17,7}, {17,7}, {9,7}, {9,7}, {5,7}, {5,7}, |
{63,6}, {63,6}, {63,6}, {63,6}, {3,6}, {3,6}, {3,6}, {3,6}, |
{36,6}, {36,6}, {36,6}, {36,6}, {24,6}, {24,6}, {24,6}, {24,6} |
}; |
/* Table B-9, coded_block_pattern, codes 000000001 ... 000000111 */ |
static VLCtab CBPtab2[8] = |
{ {ERROR,0}, {0,9}, {39,9}, {27,9}, {59,9}, {55,9}, {47,9}, {31,9} |
}; |
/* Table B-1, macroblock_address_increment, codes 00010 ... 011xx */ |
static VLCtab MBAtab1[16] = |
{ {ERROR,0}, {ERROR,0}, {7,5}, {6,5}, {5,4}, {5,4}, {4,4}, {4,4}, |
{3,3}, {3,3}, {3,3}, {3,3}, {2,3}, {2,3}, {2,3}, {2,3} |
}; |
/* Table B-1, macroblock_address_increment, codes 00000011000 ... 0000111xxxx */ |
static VLCtab MBAtab2[104] = |
{ |
{33,11}, {32,11}, {31,11}, {30,11}, {29,11}, {28,11}, {27,11}, {26,11}, |
{25,11}, {24,11}, {23,11}, {22,11}, {21,10}, {21,10}, {20,10}, {20,10}, |
{19,10}, {19,10}, {18,10}, {18,10}, {17,10}, {17,10}, {16,10}, {16,10}, |
{15,8}, {15,8}, {15,8}, {15,8}, {15,8}, {15,8}, {15,8}, {15,8}, |
{14,8}, {14,8}, {14,8}, {14,8}, {14,8}, {14,8}, {14,8}, {14,8}, |
{13,8}, {13,8}, {13,8}, {13,8}, {13,8}, {13,8}, {13,8}, {13,8}, |
{12,8}, {12,8}, {12,8}, {12,8}, {12,8}, {12,8}, {12,8}, {12,8}, |
{11,8}, {11,8}, {11,8}, {11,8}, {11,8}, {11,8}, {11,8}, {11,8}, |
{10,8}, {10,8}, {10,8}, {10,8}, {10,8}, {10,8}, {10,8}, {10,8}, |
{9,7}, {9,7}, {9,7}, {9,7}, {9,7}, {9,7}, {9,7}, {9,7}, |
{9,7}, {9,7}, {9,7}, {9,7}, {9,7}, {9,7}, {9,7}, {9,7}, |
{8,7}, {8,7}, {8,7}, {8,7}, {8,7}, {8,7}, {8,7}, {8,7}, |
{8,7}, {8,7}, {8,7}, {8,7}, {8,7}, {8,7}, {8,7}, {8,7} |
}; |
/* Table B-12, dct_dc_size_luminance, codes 00xxx ... 11110 */ |
static VLCtab DClumtab0[32] = |
{ {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, |
{2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, |
{0, 3}, {0, 3}, {0, 3}, {0, 3}, {3, 3}, {3, 3}, {3, 3}, {3, 3}, |
{4, 3}, {4, 3}, {4, 3}, {4, 3}, {5, 4}, {5, 4}, {6, 5}, {ERROR, 0} |
}; |
/* Table B-12, dct_dc_size_luminance, codes 111110xxx ... 111111111 */ |
static VLCtab DClumtab1[16] = |
{ {7, 6}, {7, 6}, {7, 6}, {7, 6}, {7, 6}, {7, 6}, {7, 6}, {7, 6}, |
{8, 7}, {8, 7}, {8, 7}, {8, 7}, {9, 8}, {9, 8}, {10,9}, {11,9} |
}; |
/* Table B-13, dct_dc_size_chrominance, codes 00xxx ... 11110 */ |
static VLCtab DCchromtab0[32] = |
{ {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, |
{1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, |
{2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, |
{3, 3}, {3, 3}, {3, 3}, {3, 3}, {4, 4}, {4, 4}, {5, 5}, {ERROR, 0} |
}; |
/* Table B-13, dct_dc_size_chrominance, codes 111110xxxx ... 1111111111 */ |
static VLCtab DCchromtab1[32] = |
{ {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, |
{6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, |
{7, 7}, {7, 7}, {7, 7}, {7, 7}, {7, 7}, {7, 7}, {7, 7}, {7, 7}, |
{8, 8}, {8, 8}, {8, 8}, {8, 8}, {9, 9}, {9, 9}, {10,10}, {11,10} |
}; |
/* Table B-14, DCT coefficients table zero, |
* codes 0100 ... 1xxx (used for first (DC) coefficient) |
*/ |
DCTtab DCTtabfirst[12] = |
{ |
{0,2,4}, {2,1,4}, {1,1,3}, {1,1,3}, |
{0,1,1}, {0,1,1}, {0,1,1}, {0,1,1}, |
{0,1,1}, {0,1,1}, {0,1,1}, {0,1,1} |
}; |
/* Table B-14, DCT coefficients table zero, |
* codes 0100 ... 1xxx (used for all other coefficients) |
*/ |
DCTtab DCTtabnext[12] = |
{ |
{0,2,4}, {2,1,4}, {1,1,3}, {1,1,3}, |
{64,0,2}, {64,0,2}, {64,0,2}, {64,0,2}, /* EOB */ |
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2} |
}; |
/* Table B-14, DCT coefficients table zero, |
* codes 000001xx ... 00111xxx |
*/ |
DCTtab DCTtab0[60] = |
{ |
{65,0,6}, {65,0,6}, {65,0,6}, {65,0,6}, /* Escape */ |
{2,2,7}, {2,2,7}, {9,1,7}, {9,1,7}, |
{0,4,7}, {0,4,7}, {8,1,7}, {8,1,7}, |
{7,1,6}, {7,1,6}, {7,1,6}, {7,1,6}, |
{6,1,6}, {6,1,6}, {6,1,6}, {6,1,6}, |
{1,2,6}, {1,2,6}, {1,2,6}, {1,2,6}, |
{5,1,6}, {5,1,6}, {5,1,6}, {5,1,6}, |
{13,1,8}, {0,6,8}, {12,1,8}, {11,1,8}, |
{3,2,8}, {1,3,8}, {0,5,8}, {10,1,8}, |
{0,3,5}, {0,3,5}, {0,3,5}, {0,3,5}, |
{0,3,5}, {0,3,5}, {0,3,5}, {0,3,5}, |
{4,1,5}, {4,1,5}, {4,1,5}, {4,1,5}, |
{4,1,5}, {4,1,5}, {4,1,5}, {4,1,5}, |
{3,1,5}, {3,1,5}, {3,1,5}, {3,1,5}, |
{3,1,5}, {3,1,5}, {3,1,5}, {3,1,5} |
}; |
/* Table B-15, DCT coefficients table one, |
* codes 000001xx ... 11111111 |
*/ |
DCTtab DCTtab0a[252] = |
{ |
{65,0,6}, {65,0,6}, {65,0,6}, {65,0,6}, /* Escape */ |
{7,1,7}, {7,1,7}, {8,1,7}, {8,1,7}, |
{6,1,7}, {6,1,7}, {2,2,7}, {2,2,7}, |
{0,7,6}, {0,7,6}, {0,7,6}, {0,7,6}, |
{0,6,6}, {0,6,6}, {0,6,6}, {0,6,6}, |
{4,1,6}, {4,1,6}, {4,1,6}, {4,1,6}, |
{5,1,6}, {5,1,6}, {5,1,6}, {5,1,6}, |
{1,5,8}, {11,1,8}, {0,11,8}, {0,10,8}, |
{13,1,8}, {12,1,8}, {3,2,8}, {1,4,8}, |
{2,1,5}, {2,1,5}, {2,1,5}, {2,1,5}, |
{2,1,5}, {2,1,5}, {2,1,5}, {2,1,5}, |
{1,2,5}, {1,2,5}, {1,2,5}, {1,2,5}, |
{1,2,5}, {1,2,5}, {1,2,5}, {1,2,5}, |
{3,1,5}, {3,1,5}, {3,1,5}, {3,1,5}, |
{3,1,5}, {3,1,5}, {3,1,5}, {3,1,5}, |
{1,1,3}, {1,1,3}, {1,1,3}, {1,1,3}, |
{1,1,3}, {1,1,3}, {1,1,3}, {1,1,3}, |
{1,1,3}, {1,1,3}, {1,1,3}, {1,1,3}, |
{1,1,3}, {1,1,3}, {1,1,3}, {1,1,3}, |
{1,1,3}, {1,1,3}, {1,1,3}, {1,1,3}, |
{1,1,3}, {1,1,3}, {1,1,3}, {1,1,3}, |
{1,1,3}, {1,1,3}, {1,1,3}, {1,1,3}, |
{1,1,3}, {1,1,3}, {1,1,3}, {1,1,3}, |
{64,0,4}, {64,0,4}, {64,0,4}, {64,0,4}, /* EOB */ |
{64,0,4}, {64,0,4}, {64,0,4}, {64,0,4}, |
{64,0,4}, {64,0,4}, {64,0,4}, {64,0,4}, |
{64,0,4}, {64,0,4}, {64,0,4}, {64,0,4}, |
{0,3,4}, {0,3,4}, {0,3,4}, {0,3,4}, |
{0,3,4}, {0,3,4}, {0,3,4}, {0,3,4}, |
{0,3,4}, {0,3,4}, {0,3,4}, {0,3,4}, |
{0,3,4}, {0,3,4}, {0,3,4}, {0,3,4}, |
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2}, |
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2}, |
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2}, |
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2}, |
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2}, |
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2}, |
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2}, |
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2}, |
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2}, |
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2}, |
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2}, |
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2}, |
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2}, |
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2}, |
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2}, |
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2}, |
{0,2,3}, {0,2,3}, {0,2,3}, {0,2,3}, |
{0,2,3}, {0,2,3}, {0,2,3}, {0,2,3}, |
{0,2,3}, {0,2,3}, {0,2,3}, {0,2,3}, |
{0,2,3}, {0,2,3}, {0,2,3}, {0,2,3}, |
{0,2,3}, {0,2,3}, {0,2,3}, {0,2,3}, |
{0,2,3}, {0,2,3}, {0,2,3}, {0,2,3}, |
{0,2,3}, {0,2,3}, {0,2,3}, {0,2,3}, |
{0,2,3}, {0,2,3}, {0,2,3}, {0,2,3}, |
{0,4,5}, {0,4,5}, {0,4,5}, {0,4,5}, |
{0,4,5}, {0,4,5}, {0,4,5}, {0,4,5}, |
{0,5,5}, {0,5,5}, {0,5,5}, {0,5,5}, |
{0,5,5}, {0,5,5}, {0,5,5}, {0,5,5}, |
{9,1,7}, {9,1,7}, {1,3,7}, {1,3,7}, |
{10,1,7}, {10,1,7}, {0,8,7}, {0,8,7}, |
{0,9,7}, {0,9,7}, {0,12,8}, {0,13,8}, |
{2,3,8}, {4,2,8}, {0,14,8}, {0,15,8} |
}; |
/* Table B-14, DCT coefficients table zero, |
* codes 0000001000 ... 0000001111 |
*/ |
DCTtab DCTtab1[8] = |
{ |
{16,1,10}, {5,2,10}, {0,7,10}, {2,3,10}, |
{1,4,10}, {15,1,10}, {14,1,10}, {4,2,10} |
}; |
/* Table B-15, DCT coefficients table one, |
* codes 000000100x ... 000000111x |
*/ |
DCTtab DCTtab1a[8] = |
{ |
{5,2,9}, {5,2,9}, {14,1,9}, {14,1,9}, |
{2,4,10}, {16,1,10}, {15,1,9}, {15,1,9} |
}; |
/* Table B-14/15, DCT coefficients table zero / one, |
* codes 000000010000 ... 000000011111 |
*/ |
DCTtab DCTtab2[16] = |
{ |
{0,11,12}, {8,2,12}, {4,3,12}, {0,10,12}, |
{2,4,12}, {7,2,12}, {21,1,12}, {20,1,12}, |
{0,9,12}, {19,1,12}, {18,1,12}, {1,5,12}, |
{3,3,12}, {0,8,12}, {6,2,12}, {17,1,12} |
}; |
/* Table B-14/15, DCT coefficients table zero / one, |
* codes 0000000010000 ... 0000000011111 |
*/ |
DCTtab DCTtab3[16] = |
{ |
{10,2,13}, {9,2,13}, {5,3,13}, {3,4,13}, |
{2,5,13}, {1,7,13}, {1,6,13}, {0,15,13}, |
{0,14,13}, {0,13,13}, {0,12,13}, {26,1,13}, |
{25,1,13}, {24,1,13}, {23,1,13}, {22,1,13} |
}; |
/* Table B-14/15, DCT coefficients table zero / one, |
* codes 00000000010000 ... 00000000011111 |
*/ |
DCTtab DCTtab4[16] = |
{ |
{0,31,14}, {0,30,14}, {0,29,14}, {0,28,14}, |
{0,27,14}, {0,26,14}, {0,25,14}, {0,24,14}, |
{0,23,14}, {0,22,14}, {0,21,14}, {0,20,14}, |
{0,19,14}, {0,18,14}, {0,17,14}, {0,16,14} |
}; |
/* Table B-14/15, DCT coefficients table zero / one, |
* codes 000000000010000 ... 000000000011111 |
*/ |
DCTtab DCTtab5[16] = |
{ |
{0,40,15}, {0,39,15}, {0,38,15}, {0,37,15}, |
{0,36,15}, {0,35,15}, {0,34,15}, {0,33,15}, |
{0,32,15}, {1,14,15}, {1,13,15}, {1,12,15}, |
{1,11,15}, {1,10,15}, {1,9,15}, {1,8,15} |
}; |
/* Table B-14/15, DCT coefficients table zero / one, |
* codes 0000000000010000 ... 0000000000011111 |
*/ |
DCTtab DCTtab6[16] = |
{ |
{1,18,16}, {1,17,16}, {1,16,16}, {1,15,16}, |
{6,3,16}, {16,2,16}, {15,2,16}, {14,2,16}, |
{13,2,16}, {12,2,16}, {11,2,16}, {31,1,16}, |
{30,1,16}, {29,1,16}, {28,1,16}, {27,1,16} |
}; |
/demos/tags/rel_1_5_beta1/first/mpeg2/mpeg2dec.h |
---|
0,0 → 1,129 |
/* mpeg2dec.h, MPEG specific defines */ |
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */ |
/* |
* Disclaimer of Warranty |
* |
* These software programs are available to the user without any license fee or |
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims |
* any and all warranties, whether express, implied, or statuary, including any |
* implied warranties or merchantability or of fitness for a particular |
* purpose. In no event shall the copyright-holder be liable for any |
* incidental, punitive, or consequential damages of any kind whatsoever |
* arising from the use of these programs. |
* |
* This disclaimer of warranty extends to the user of these programs and user's |
* customers, employees, agents, transferees, successors, and assigns. |
* |
* The MPEG Software Simulation Group does not represent or warrant that the |
* programs furnished hereunder are free of infringement of any third-party |
* patents. |
* |
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware, |
* are subject to royalty fees to patent holders. Many of these patents are |
* general enough such that they are unavoidable regardless of implementation |
* design. |
* |
*/ |
#define ERROR (-1) |
#define PICTURE_START_CODE 0x100 |
#define SLICE_START_CODE_MIN 0x101 |
#define SLICE_START_CODE_MAX 0x1AF |
#define USER_DATA_START_CODE 0x1B2 |
#define SEQUENCE_HEADER_CODE 0x1B3 |
#define SEQUENCE_ERROR_CODE 0x1B4 |
#define EXTENSION_START_CODE 0x1B5 |
#define SEQUENCE_END_CODE 0x1B7 |
#define GROUP_START_CODE 0x1B8 |
#define SYSTEM_START_CODE_MIN 0x1B9 |
#define SYSTEM_START_CODE_MAX 0x1FF |
#define ISO_END_CODE 0x1B9 |
#define PACK_START_CODE 0x1BA |
#define SYSTEM_START_CODE 0x1BB |
#define VIDEO_ELEMENTARY_STREAM 0x1e0 |
/* scalable_mode */ |
#define SC_NONE 0 |
#define SC_DP 1 |
#define SC_SPAT 2 |
#define SC_SNR 3 |
#define SC_TEMP 4 |
/* picture coding type */ |
#define I_TYPE 1 |
#define P_TYPE 2 |
#define B_TYPE 3 |
#define D_TYPE 4 |
/* picture structure */ |
#define TOP_FIELD 1 |
#define BOTTOM_FIELD 2 |
#define FRAME_PICTURE 3 |
/* macroblock type */ |
#define MACROBLOCK_INTRA 1 |
#define MACROBLOCK_PATTERN 2 |
#define MACROBLOCK_MOTION_BACKWARD 4 |
#define MACROBLOCK_MOTION_FORWARD 8 |
#define MACROBLOCK_QUANT 16 |
#define SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG 32 |
#define PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS 64 |
/* motion_type */ |
#define MC_FIELD 1 |
#define MC_FRAME 2 |
#define MC_16X8 2 |
#define MC_DMV 3 |
/* mv_format */ |
#define MV_FIELD 0 |
#define MV_FRAME 1 |
/* chroma_format */ |
#define CHROMA420 1 |
#define CHROMA422 2 |
#define CHROMA444 3 |
/* extension start code IDs */ |
#define SEQUENCE_EXTENSION_ID 1 |
#define SEQUENCE_DISPLAY_EXTENSION_ID 2 |
#define QUANT_MATRIX_EXTENSION_ID 3 |
#define COPYRIGHT_EXTENSION_ID 4 |
#define SEQUENCE_SCALABLE_EXTENSION_ID 5 |
#define PICTURE_DISPLAY_EXTENSION_ID 7 |
#define PICTURE_CODING_EXTENSION_ID 8 |
#define PICTURE_SPATIAL_SCALABLE_EXTENSION_ID 9 |
#define PICTURE_TEMPORAL_SCALABLE_EXTENSION_ID 10 |
#define ZIG_ZAG 0 |
#define PROFILE_422 (128+5) |
#define MAIN_LEVEL 8 |
/* Layers: used by Verbose_Flag, Verifier_Flag, Stats_Flag, and Trace_Flag */ |
#define NO_LAYER 0 |
#define SEQUENCE_LAYER 1 |
#define PICTURE_LAYER 2 |
#define SLICE_LAYER 3 |
#define MACROBLOCK_LAYER 4 |
#define BLOCK_LAYER 5 |
#define EVENT_LAYER 6 |
#define ALL_LAYERS 7 |
#define FILENAME_LENGTH 256 |
#define MB_WEIGHT 32 |
#define MB_CLASS4 64 |
/demos/tags/rel_1_5_beta1/first/mpeg2/const.h |
---|
0,0 → 1,141 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Paolo Gai <pj@gandalf.sssup.it> |
* Massimiliano Giorgi <massy@gandalf.sssup.it> |
* Luca Abeni <luca@gandalf.sssup.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/** |
------------ |
CVS : $Id: const.h,v 1.1 2004-11-08 20:23:22 trimarchi Exp $ |
File: $File$ |
Revision: $Revision: 1.1 $ |
Last update: $Date: 2004-11-08 20:23:22 $ |
------------ |
**/ |
/* |
* Copyright (C) 2000 Marco Dallera and Marco Fiocca |
* |
* 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 |
* |
*/ |
/* |
* AUTO |
* |
* Another Unuseful Track simulatOr |
* |
* Authors: Marco Dallera |
* Marco Fiocca |
* |
*/ |
/* ------------------ */ |
/* Useful constants */ |
/* ------------------ */ |
#ifndef __CONST_H_ |
#define __CONST_H_ |
/* Screen dimensions */ |
#define SCREEN_WIDTH 800 |
#define SCREEN_HEIGHT 600 |
#define SCREEN_BIT_COLORS 8 |
/* Visible area */ |
#define TEL_WIDTH 50 |
#define TEL_HEIGHT 50 |
/* Car dimensions */ |
#define CAR_WIDTH 12 |
#define CAR_HEIGHT 12 |
#define CAR_W 8 |
#define CAR_H 10 |
/* Track dimensions */ |
#define TRACK_WIDTH 500 |
#define TRACK_HEIGHT 500 |
/* Track position */ |
#define TRACK_X1 0 |
#define TRACK_Y1 0 |
#define TRACK_X2 TRACK_X1+TRACK_WIDTH-1 |
#define TRACK_Y2 TRACK_Y1+TRACK_HEIGHT-1 |
/* Max number of car on track */ |
#define MAX_CAR_NUMBER 10 |
#define DRIVERS_NUMBER 20 |
#define MAX_DRIVER_NAME_LENGTH 20 |
#define MAX_TRACK_NAME_LENGTH 20 |
#define TRACK_NUMBER 4 |
/* Lap direction */ |
#define CLOCK 0 |
#define ANTICLOCK 1 |
/* Information display coords */ |
#define CMD_WIDTH TRACK_WIDTH |
#define CMD_HEIGHT (SCREEN_HEIGHT-TRACK_HEIGHT-3) |
/* Car position limits */ |
#define MIN_CAR_X (TRACK_X1 + CAR_WIDTH/2 + 4) |
#define MIN_CAR_Y (TRACK_Y1 + CAR_HEIGHT/2 + 4) |
#define MAX_CAR_X (TRACK_X2 - CAR_WIDTH/2 - 4) |
#define MAX_CAR_Y (TRACK_Y2 - CAR_HEIGHT/2 - 4) |
/* Road constants */ |
#define LEFT_ONLY 10 |
#define RIGHT_ONLY 11 |
#define ROAD_OK 12 |
#define NO_ROAD 13 |
/* Collision constants */ |
#define COLLISION_LEFT 20 |
#define COLLISION_RIGHT 21 |
#define COLLISION_BACK 22 |
#define NO_COLL 0 |
/* CAB constants */ |
#define ROAD_MSG_DIM sizeof(road_info) |
#define ROAD_MSG_READER 4 |
#define CAR_MSG_DIM sizeof(car_status) |
#define CAR_MSG_READER 5 |
/* Tasks parameters */ |
#define SENSOR_WCET 3000 |
#define SENSOR_PERIOD 40000 |
#define CONTROL_WCET 1000 |
#define CONTROL_PERIOD 40000 |
#endif |
/demos/tags/rel_1_5_beta1/first/mpeg2/store.c |
---|
0,0 → 1,319 |
/* store.c, picture output routines */ |
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */ |
/* |
* Disclaimer of Warranty |
* |
* These software programs are available to the user without any license fee or |
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims |
* any and all warranties, whether express, implied, or statuary, including any |
* implied warranties or merchantability or of fitness for a particular |
* purpose. In no event shall the copyright-holder be liable for any |
* incidental, punitive, or consequential damages of any kind whatsoever |
* arising from the use of these programs. |
* |
* This disclaimer of warranty extends to the user of these programs and user's |
* customers, employees, agents, transferees, successors, and assigns. |
* |
* The MPEG Software Simulation Group does not represent or warrant that the |
* programs furnished hereunder are free of infringement of any third-party |
* patents. |
* |
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware, |
* are subject to royalty fees to patent holders. Many of these patents are |
* general enough such that they are unavoidable regardless of implementation |
* design. |
* |
*/ |
#include <stdlib.h> |
#include "drivers/glib.h" |
#include "config.h" |
#include "global.h" |
extern DWORD flbaddr; |
static void conv422to444 _ANSI_ARGS_((unsigned char *src, unsigned char *dst)); |
static void conv420to422 _ANSI_ARGS_((unsigned char *src, unsigned char *dst)); |
__inline__ WORD down32to16(unsigned char r, unsigned char g, unsigned char b) |
{ |
return ((b&0xf8)>>3)|((g&0xfc)<<3)|((r&0xf8)<<8); |
} |
void Write_Frame _ANSI_ARGS_((unsigned char *src[], int frame)) |
{ |
int i, j; |
int y, u, v, r, g, b; |
// int rm=0,gm=0,bm=0; |
int crv, cbu, cgu, cgv; |
unsigned char *py, *pu, *pv; |
int height, width, incr; |
static unsigned char *u422, *v422, *u444, *v444; |
incr = width = Coded_Picture_Width ; |
height = Coded_Picture_Height; |
if (chroma_format==CHROMA444) |
{ |
u444 = src[1]; |
v444 = src[2]; |
} |
else |
{ |
if (!u444) |
{ |
if (chroma_format==CHROMA420) |
{ |
if (!(u422 = (unsigned char *)malloc((Coded_Picture_Width>>1) |
*Coded_Picture_Height))) |
Error("malloc failed"); |
if (!(v422 = (unsigned char *)malloc((Coded_Picture_Width>>1) |
*Coded_Picture_Height))) |
Error("malloc failed"); |
} |
if (!(u444 = (unsigned char *)malloc(Coded_Picture_Width |
*Coded_Picture_Height))) |
Error("malloc failed"); |
if (!(v444 = (unsigned char *)malloc(Coded_Picture_Width |
*Coded_Picture_Height))) |
Error("malloc failed"); |
} |
if (chroma_format==CHROMA420) |
{ |
conv420to422(src[1],u422); |
conv420to422(src[2],v422); |
conv422to444(u422,u444); |
conv422to444(v422,v444); |
} |
else |
{ |
conv422to444(src[1],u444); |
conv422to444(src[2],v444); |
} |
} |
/* matrix coefficients */ |
crv = Inverse_Table_6_9[matrix_coefficients][0]; |
cbu = Inverse_Table_6_9[matrix_coefficients][1]; |
cgu = Inverse_Table_6_9[matrix_coefficients][2]; |
cgv = Inverse_Table_6_9[matrix_coefficients][3]; |
for (i=0; i<height; i++) |
{ |
py = src[0] + incr*i; |
pu = u444 + incr*i; |
pv = v444 + incr*i; |
for (j=0; j<width; j++) |
{ |
u = *pu++ - 128; |
v = *pv++ - 128; |
y = 76309 * (*py++ - 16); /* (255/219)*65536 */ |
r = Clip[(y + crv*v + 32768)>>16]; |
g = Clip[(y - cgu*u - cgv*v + 32768)>>16]; |
b = Clip[(y + cbu*u + 32786)>>16]; |
*(WORD *)(flbaddr+((i+ld->py)*800+(j+ld->px))*2) = down32to16(r,g,b); |
} |
} |
} |
/* |
void Display_Image(Dithered_Image) |
unsigned char *Dithered_Image; |
{ |
/ * display dithered image */ |
//} |
/* horizontal 1:2 interpolation filter */ |
static void conv422to444(src,dst) |
unsigned char *src,*dst; |
{ |
int i, i2, w, j, im3, im2, im1, ip1, ip2, ip3; |
w = Coded_Picture_Width>>1; |
if (base.MPEG2_Flag) |
{ |
for (j=0; j<Coded_Picture_Height; j++) |
{ |
for (i=0; i<w; i++) |
{ |
i2 = i<<1; |
im2 = (i<2) ? 0 : i-2; |
im1 = (i<1) ? 0 : i-1; |
ip1 = (i<w-1) ? i+1 : w-1; |
ip2 = (i<w-2) ? i+2 : w-1; |
ip3 = (i<w-3) ? i+3 : w-1; |
/* FIR filter coefficients (*256): 21 0 -52 0 159 256 159 0 -52 0 21 */ |
/* even samples (0 0 256 0 0) */ |
dst[i2] = src[i]; |
/* odd samples (21 -52 159 159 -52 21) */ |
dst[i2+1] = Clip[(int)(21*(src[im2]+src[ip3]) |
-52*(src[im1]+src[ip2]) |
+159*(src[i]+src[ip1])+128)>>8]; |
} |
src+= w; |
dst+= Coded_Picture_Width; |
} |
} |
else |
{ |
for (j=0; j<Coded_Picture_Height; j++) |
{ |
for (i=0; i<w; i++) |
{ |
i2 = i<<1; |
im3 = (i<3) ? 0 : i-3; |
im2 = (i<2) ? 0 : i-2; |
im1 = (i<1) ? 0 : i-1; |
ip1 = (i<w-1) ? i+1 : w-1; |
ip2 = (i<w-2) ? i+2 : w-1; |
ip3 = (i<w-3) ? i+3 : w-1; |
/* FIR filter coefficients (*256): 5 -21 70 228 -37 11 */ |
dst[i2] = Clip[(int)( 5*src[im3] |
-21*src[im2] |
+70*src[im1] |
+228*src[i] |
-37*src[ip1] |
+11*src[ip2]+128)>>8]; |
dst[i2+1] = Clip[(int)( 5*src[ip3] |
-21*src[ip2] |
+70*src[ip1] |
+228*src[i] |
-37*src[im1] |
+11*src[im2]+128)>>8]; |
} |
src+= w; |
dst+= Coded_Picture_Width; |
} |
} |
} |
/* vertical 1:2 interpolation filter */ |
static void conv420to422(src,dst) |
unsigned char *src,*dst; |
{ |
int w, h, i, j, j2; |
int jm6, jm5, jm4, jm3, jm2, jm1, jp1, jp2, jp3, jp4, jp5, jp6, jp7; |
w = Coded_Picture_Width>>1; |
h = Coded_Picture_Height>>1; |
if (progressive_frame) |
{ |
/* intra frame */ |
for (i=0; i<w; i++) |
{ |
for (j=0; j<h; j++) |
{ |
j2 = j<<1; |
jm3 = (j<3) ? 0 : j-3; |
jm2 = (j<2) ? 0 : j-2; |
jm1 = (j<1) ? 0 : j-1; |
jp1 = (j<h-1) ? j+1 : h-1; |
jp2 = (j<h-2) ? j+2 : h-1; |
jp3 = (j<h-3) ? j+3 : h-1; |
/* FIR filter coefficients (*256): 5 -21 70 228 -37 11 */ |
/* New FIR filter coefficients (*256): 3 -16 67 227 -32 7 */ |
dst[w*j2] = Clip[(int)( 3*src[w*jm3] |
-16*src[w*jm2] |
+67*src[w*jm1] |
+227*src[w*j] |
-32*src[w*jp1] |
+7*src[w*jp2]+128)>>8]; |
dst[w*(j2+1)] = Clip[(int)( 3*src[w*jp3] |
-16*src[w*jp2] |
+67*src[w*jp1] |
+227*src[w*j] |
-32*src[w*jm1] |
+7*src[w*jm2]+128)>>8]; |
} |
src++; |
dst++; |
} |
} |
else |
{ |
/* intra field */ |
for (i=0; i<w; i++) |
{ |
for (j=0; j<h; j+=2) |
{ |
j2 = j<<1; |
/* top field */ |
jm6 = (j<6) ? 0 : j-6; |
jm4 = (j<4) ? 0 : j-4; |
jm2 = (j<2) ? 0 : j-2; |
jp2 = (j<h-2) ? j+2 : h-2; |
jp4 = (j<h-4) ? j+4 : h-2; |
jp6 = (j<h-6) ? j+6 : h-2; |
/* Polyphase FIR filter coefficients (*256): 2 -10 35 242 -18 5 */ |
/* New polyphase FIR filter coefficients (*256): 1 -7 30 248 -21 5 */ |
dst[w*j2] = Clip[(int)( 1*src[w*jm6] |
-7*src[w*jm4] |
+30*src[w*jm2] |
+248*src[w*j] |
-21*src[w*jp2] |
+5*src[w*jp4]+128)>>8]; |
/* Polyphase FIR filter coefficients (*256): 11 -38 192 113 -30 8 */ |
/* New polyphase FIR filter coefficients (*256):7 -35 194 110 -24 4 */ |
dst[w*(j2+2)] = Clip[(int)( 7*src[w*jm4] |
-35*src[w*jm2] |
+194*src[w*j] |
+110*src[w*jp2] |
-24*src[w*jp4] |
+4*src[w*jp6]+128)>>8]; |
/* bottom field */ |
jm5 = (j<5) ? 1 : j-5; |
jm3 = (j<3) ? 1 : j-3; |
jm1 = (j<1) ? 1 : j-1; |
jp1 = (j<h-1) ? j+1 : h-1; |
jp3 = (j<h-3) ? j+3 : h-1; |
jp5 = (j<h-5) ? j+5 : h-1; |
jp7 = (j<h-7) ? j+7 : h-1; |
/* Polyphase FIR filter coefficients (*256): 11 -38 192 113 -30 8 */ |
/* New polyphase FIR filter coefficients (*256):7 -35 194 110 -24 4 */ |
dst[w*(j2+1)] = Clip[(int)( 7*src[w*jp5] |
-35*src[w*jp3] |
+194*src[w*jp1] |
+110*src[w*jm1] |
-24*src[w*jm3] |
+4*src[w*jm5]+128)>>8]; |
dst[w*(j2+3)] = Clip[(int)( 1*src[w*jp7] |
-7*src[w*jp5] |
+30*src[w*jp3] |
+248*src[w*jp1] |
-21*src[w*jm1] |
+5*src[w*jm3]+128)>>8]; |
} |
src++; |
dst++; |
} |
} |
} |
/demos/tags/rel_1_5_beta1/first/demos.txt |
---|
0,0 → 1,48 |
FSF demo for S.Ha.R.K |
test1.c: |
This demo shows the main feature of service contract implementation. |
A set of 4 threads is created using the pthread standard functions. |
At the beginning, these threads run without temporal restrictions |
and they don't respect any deadline. |
Two service contracts are initialized and set |
fsf_initialize_contract(&contract1); |
fsf_initialize_contract(&contract2); |
fsf_set_contract_basic_parameters(&contract1,&budget1,&period1,NULL,NULL,FSF_DEFAULT_WORKLOAD); |
fsf_set_contract_basic_parameters(&contract2,&budget2,&period2,NULL,NULL,FSF_DEFAULT_WORKLOAD); |
whit the button 'q','w','e' you can respectively |
negotiate contract for a server |
[err = fsf_negotiate_contract(&contractX,&serverY);] |
'q' -> negotiate contract1 for server1 |
'w' -> negotiate contract2 for server2 |
'e' -> negotiate contract1 for server3 |
now with button '1','2','3','4' you can bind the thread to a server |
[err = fsf_bind_thread_to_server(serverY,jZ);] |
'1' -> bind thread1 to server1 |
'2' -> bind thread2 to server2 |
'3' -> bind thread3 to server3 |
'4' -> bind thread4 to server2 |
threads will start to respect the assigned budget. It's possible |
to bind more threads to one server. The local scheduler specified in the |
contract define how the threads will get the server resources. |
With '5','6','7','8' the thread is unbind from the server |
[err = fsf_unbind_thread_from_server(jZ);] |
With 'r','t','y' a server is removed |
[err = fsf_cancel_contract(&server2);] |
/demos/tags/rel_1_5_beta1/loader/shark/initfile.c |
---|
0,0 → 1,179 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: Giorgio Buttazzo <giorgio@sssup.it> |
* |
* Authors : Mauro Marinoni <mauro.marinoni@unipv.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 |
*/ |
/* |
* 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 "edf/edf/edf.h" |
#include "cbs/cbs/cbs.h" |
#include "rr/rr/rr.h" |
#include "dummy/dummy/dummy.h" |
#include "intdrive/intdrive/intdrive.h" |
#include "posix/posix/posix.h" |
#include "grubstar.h" |
#include "fsf_basic_types.h" |
#include "fsf_core.h" |
#include "pi/pi/pi.h" |
#include "pc/pc/pc.h" |
#include "pthread.h" |
#include "sem/sem/sem.h" |
#include "hartport/hartport/hartport.h" |
#include "nop/nop/nop.h" |
#include <drivers/shark_linuxc26.h> |
#include <drivers/shark_pci26.h> |
/*+ sysyem tick in us +*/ |
#define TICK 0 |
/*+ RR tick in us +*/ |
#define RRTICK 10000 |
/*+ Interrupt Server +*/ |
#define INTDRIVE_Q 1000 |
#define INTDRIVE_T 10000 |
#define INTDRIVE_FLAG 0 |
void call_shutdown_task(void *arg); |
int device_drivers_init(); |
int device_drivers_close(); |
void set_shutdown_task(); |
TASK shutdown_task_body(void *arg); |
PID shutdown_task_PID = 1; |
TIME __kernel_register_levels__(void *arg) |
{ |
struct multiboot_info *mb = (struct multiboot_info *)arg; |
int grubstar_level; |
int posix_level; |
int pi_level; |
int pc_level; |
INTDRIVE_register_level(INTDRIVE_Q, INTDRIVE_T, INTDRIVE_FLAG); |
EDF_register_level(EDF_ENABLE_ALL); |
posix_level=POSIX_register_level(RRTICK, 1, mb, 32); |
grubstar_level = GRUBSTAR_register_level(FSF_MAX_N_SERVERS, 1); |
FSF_register_module(posix_level,grubstar_level, (int)(MAX_BANDWIDTH * 0.8)); |
dummy_register_level(); |
//posix_level=POSIX_register_level(RRTICK, 1, mb, 32); |
CBS_register_level(CBS_ENABLE_ALL,1); |
SEM_register_module(); |
pi_level=PI_register_module(); |
pc_level=PC_register_module(); |
NOP_register_module(); |
PTHREAD_register_module(2, pi_level, pc_level); |
return TICK; |
} |
int device_drivers_close() { |
return 0; |
} |
int device_drivers_init() { |
LINUXC26_register_module(); |
PCI26_init(); |
return 0; |
} |
TASK shutdown_task_body(void *arg) { |
device_drivers_close(); |
sys_shutdown_message("-- S.Ha.R.K. Closed --\n"); |
return NULL; |
} |
#define SHUTDOWN_TIMEOUT_SEC 3 |
void set_shutdown_task() { |
NRT_TASK_MODEL nrt; |
nrt_task_default_model(nrt); |
nrt_task_def_system(nrt); |
shutdown_task_PID = task_create("Shutdown Task", shutdown_task_body, &nrt, NULL); |
if (shutdown_task_PID == NIL) { |
sys_shutdown_message("Error: Cannot create shutdown task\n"); |
exit(0); |
} |
} |
void call_shutdown_task(void *arg) { |
struct timespec t; |
sys_gettime(&t); |
t.tv_sec += SHUTDOWN_TIMEOUT_SEC; |
/* Emergency timeout to exit from RUNLEVEL_SHUTDOWN */ |
kern_event_post(&t,(void *)((void *)sys_abort_shutdown),(void *)0); |
task_activate(shutdown_task_PID); |
} |
TASK __init__(void *arg) |
{ |
struct multiboot_info *mb = (struct multiboot_info *)arg; |
HARTPORT_init(); |
set_shutdown_task(); |
device_drivers_init(); |
sys_atrunlevel(call_shutdown_task, NULL, RUNLEVEL_SHUTDOWN); |
__call_main__(mb); |
return (void *)0; |
} |
int main() { |
return start_environment(); |
} |
/demos/tags/rel_1_5_beta1/loader/shark/fsfinit.c |
---|
0,0 → 1,56 |
#include "kernel/kern.h" |
#include "fsf.h" |
#include "fsf_server.h" |
#include "func.h" |
extern struct loader_contract loader_contract_list[]; |
extern int total_loader_contract; |
void fsfinit() |
{ |
struct loader_contract *c; |
fsf_contract_parameters_t contract; |
fsf_server_id_t server; |
union sigval no_sigval = {0}; |
int i; |
FSF_start_service_task(); |
for (i=0;i<total_loader_contract;i++) { |
c = &loader_contract_list[i]; |
fsf_initialize_contract(&contract); |
fsf_set_contract_basic_parameters(&contract,&c->cmin,&c->tmax,c->workload); |
fsf_set_contract_reclamation_parameters(&contract,&c->cmax,&c->tmin,FSF_DEFAULT_GRANULARITY, NULL, 1,1); |
if (TIMESPEC2USEC(&c->deadline) != 0) |
fsf_set_contract_timing_requirements(&contract,false,&c->deadline,0,no_sigval,0,no_sigval); |
else |
fsf_set_contract_timing_requirements(&contract,true,NULL,0,no_sigval,0,no_sigval); |
switch (c->local_scheduler) { |
case PAR_EDF: |
fsf_set_contract_scheduling_policy(&contract,FSF_EDF); |
break; |
case PAR_RM: |
fsf_set_contract_scheduling_policy(&contract,FSF_FP); |
break; |
case PAR_POSIX: |
fsf_set_contract_scheduling_policy(&contract,FSF_RR); |
break; |
} |
fsf_negotiate_contract(&contract,&server); |
c->server = server; |
} |
print_server_list(); |
} |
/demos/tags/rel_1_5_beta1/loader/shark/shark.c |
---|
0,0 → 1,258 |
#include "func.h" |
#include "calibrate.h" |
#include <tracer.h> |
#include "FTrace_udp.h" |
#include "FTrace_chunk.h" |
extern int cal_cycles; |
extern struct timespec zero_time; |
extern struct loader_task loader_task_list[]; |
extern struct loader_contract loader_contract_list[]; |
extern int total_loader_task; |
extern int total_loader_contract; |
mutex_t mutex_table[MAX_MUTEX]; |
int main_chunk; |
/* Runtime Calibration */ |
int calibrate_cycle() |
{ |
long long i; |
struct timespec start,end,diff; |
if (cal_cycles != 0) return 0; |
kern_cli(); |
__asm__ __volatile__ ("xorl %%eax,%%eax\n\t" |
"cpuid\n\t" |
:::"eax","ebx","ecx","edx"); |
kern_gettime(&start); |
for (i=0;i<CALIBRATION_DELTA;i++) |
__asm__ __volatile__ ("xorl %%eax,%%eax\n\t" |
"cpuid\n\t" |
:::"eax","ebx","ecx","edx"); |
__asm__ __volatile__ ("xorl %%eax,%%eax\n\t" |
"cpuid\n\t" |
:::"eax","ebx","ecx","edx"); |
kern_gettime(&end); |
kern_sti(); |
SUBTIMESPEC(&end,&start,&diff); |
cal_cycles = TIMESPEC2USEC(&diff); |
cprintf("Calibration usec/[%d cycles] = %d\n",CALIBRATION_DELTA,cal_cycles); |
return 0; |
} |
int get_server_from_contract(int contract) |
{ |
int i; |
for(i=0;i<total_loader_contract;i++) |
if (loader_contract_list[i].number == contract) |
return loader_contract_list[i].server; |
return -1; |
} |
void *get_task_model(struct loader_task *current) { |
if (current->local_scheduler == PAR_POSIX) { |
static NRT_TASK_MODEL nrt; |
static fsf_sched_params_t pr; |
pr.policy=FSF_RR; |
pr.params=&nrt; |
nrt_task_default_model(nrt); |
nrt_task_def_save_arrivals(nrt); |
nrt_task_def_ctrl_jet(nrt); |
nrt_task_def_group(nrt,current->group); |
nrt_task_def_usemath(nrt); |
return ≺ |
} |
if (current->local_scheduler == PAR_EDF) { |
static HARD_TASK_MODEL ht; |
static fsf_sched_params_t pr; |
pr.policy=FSF_EDF; |
pr.params=&ht; |
hard_task_default_model(ht); |
hard_task_def_ctrl_jet(ht); |
hard_task_def_mit(ht,TIMESPEC2USEC(¤t->deadline)); |
hard_task_def_wcet(ht,TIMESPEC2USEC(¤t->wcet)); |
hard_task_def_group(ht,current->group); |
hard_task_def_aperiodic(ht); |
hard_task_def_usemath(ht); |
return ≺ |
} |
if (current->local_scheduler == PAR_NONE) { |
static DUMMY_TASK_MODEL d; |
static fsf_sched_params_t pr; |
pr.policy=FSF_NONE; |
pr.params=&d; |
dummy_task_default_model(d); |
dummy_task_def_group(d,current->group); |
return ≺ |
} |
if (current->local_scheduler == PAR_RM) { |
static HARD_TASK_MODEL ht; |
static fsf_sched_params_t pr; |
pr.policy=FSF_FP; |
pr.params=&ht; |
hard_task_default_model(ht); |
hard_task_def_mit(ht,TIMESPEC2USEC(¤t->deadline)); |
hard_task_def_wcet(ht,TIMESPEC2USEC(¤t->wcet)); |
hard_task_def_ctrl_jet(ht); |
hard_task_def_group(ht,current->group); |
hard_task_def_usemath(ht); |
return ≺ |
} |
return NULL; |
} |
TASK finish_task() { |
#ifdef __NEW_TRACER__ |
FTrace_OSD_init_udp(1,"192.168.82.43","192.168.82.41"); |
FTrace_send_chunk(main_chunk, 0, FTRACE_CHUNK_FLAG_FREE | FTRACE_CHUNK_FLAG_CYC); |
exit(0); |
#else |
exit(0); |
#endif |
return NULL; |
} |
void end_simulation() { |
#ifdef __NEW_TRACER__ |
int i; |
struct loader_task *l = loader_task_list; |
NRT_TASK_MODEL nrt; |
TRACER_LOGEVENT(FTrace_EVT_trace_stop,0,0); |
FTrace_disable(); |
i = 0; |
while (i < total_loader_task) { |
group_kill(l->group); |
i++; |
l=&loader_task_list[i]; |
} |
nrt_task_default_model(nrt); |
task_activate(task_create("Finish",finish_task,&nrt,NULL)); |
#else |
exit(0); |
#endif |
} |
void set_simulation_time (struct timespec *total) { |
struct timespec end_time; |
ADDTIMESPEC(&zero_time,total,&end_time); |
kern_event_post(&end_time,(void *)((void *)(end_simulation)),NULL); |
} |
/* Set the zero_time and post the first activation event */ |
void start_simulation() { |
int i; |
struct loader_task *l = loader_task_list; |
struct timespec end_time; |
PISTAR_mutexattr_t a; |
PISTAR_mutexattr_default(a); |
i = 0; |
#ifdef __NEW_TRACER__ |
main_chunk = FTrace_chunk_create(10000000, 1000, FTRACE_CHUNK_FLAG_FREE | FTRACE_CHUNK_FLAG_CYC); |
FTrace_actual_chunk_select(main_chunk); |
FTrace_enable(); |
#endif |
TRACER_LOGEVENT(FTrace_EVT_trace_start,0,0); |
kern_gettime(&zero_time); |
while (i < total_loader_task) { |
if (l->muxstatus == 1) { |
mutex_init(&mutex_table[l->resource],&a); |
l->muxstatus = 2; |
} |
if (l->act_number > 0) { |
ADDTIMESPEC(&zero_time, &l->act[0], &end_time); |
l->act_current++; |
kern_event_post(&end_time,(void *)((void *)(loader_task_activate)),l); |
} |
i++; |
l=&loader_task_list[i]; |
} |
} |
/* Activate task and post the new activation event */ |
void loader_task_activate(struct loader_task *l) { |
struct timespec actual_time,end_time; |
kern_gettime(&actual_time); |
group_activate(l->group); |
if (l->act_number > l->act_current) { |
ADDTIMESPEC(&actual_time, &l->act[l->act_current], &end_time); |
l->act_current++; |
kern_event_post(&end_time,(void *)((void *)(loader_task_activate)),l); |
} |
} |
/demos/tags/rel_1_5_beta1/loader/shark/func.h |
---|
0,0 → 1,112 |
#ifndef __FUNC_H__ |
#define __FUNC_H__ |
#include "kernel/kern.h" |
#include "fsf_basic_types.h" |
#include "fsf_core.h" |
#include "fsf_server.h" |
#include "shark.h" |
#define OS_SHARK |
#define get_current_exec_task() exec_shadow |
/* Return the PID/pthread_t of calling task */ |
#define generic_get_server_from_contract get_server_from_contract |
/* Return the server_id from the contract number used |
* inside .fsf file to define contract parameters |
* |
* generic_get_server_from_contract(int contract_number) */ |
#define generic_calibrate_cycle calibrate_cycle |
/* Set the calibration parameter "cal_cycle" |
* only if it's initialized to 0. The calibration routine |
* calculates cal_cycle from CALIBRATION_DELTA. |
* This step can also be performed outside the demo. |
* Inside calibrate.h you can set the calibration parameters |
* for calibration step performed outside. |
* |
* cal_cycle is the number of cycles that are needed to |
* make CALIBRATION_DELTA number of iteration. |
* |
* kern_cli(); |
* kern_gettime(&start); |
* for (i=0;i<CALIBRATION_DELTA;i++) |
* __asm__ __volatile__ ("xorl %%eax,%%eax\n\t" |
* "cpuid\n\t" |
* :::"eax","ebx","ecx","edx"); |
* kern_gettime(&end); |
* kern_sti(); |
* |
* SUBTIMESPEC(&end,&start,&diff); |
* cal_cycles = TIMESPEC2USEC(&diff); |
* |
*/ |
#define generic_set_next_activation set_next_activation |
/* Set the next activation time. It's like fsf_schedule_next_timed_job |
* but it don't return nothing |
*/ |
#define generic_set_simulation_time set_simulation_time |
/* Set the end time of simulation */ |
#define generic_get_task_model get_task_model |
/* Return a pointer to the struct that contains the |
* local shceduler parameter */ |
#define generic_start_simulation start_simulation |
/* Start the simulation */ |
#define generic_fsfinit() fsfinit() |
/* Create the fsf_server */ |
#define generic_task_endcycle() task_endcycle() |
/* The job is finished */ |
#define generic_end_simulation() exit(0) |
/* Exit from simulation */ |
#define printf cprintf |
/* Printf standard function */ |
/* Mutex */ |
extern __inline__ void generic_lock_mutex(int res) { |
extern mutex_t mutex_table[MAX_MUTEX]; |
mutex_lock(&mutex_table[res]); |
} |
extern __inline__ void generic_unlock_mutex(int res) { |
extern mutex_t mutex_table[MAX_MUTEX]; |
mutex_unlock(&mutex_table[res]); |
} |
/* TASK RUNTIME FUNCTIONS */ |
extern __inline__ void start_oneshot_task(void) {} |
extern __inline__ void end_oneshot_task(void) {} |
extern __inline__ void start_periodic_task(void) {} |
extern __inline__ void start_job_periodic_task(void) { |
task_testcancel(); |
} |
extern __inline__ void end_job_periodic_task(void) { |
task_testcancel(); |
} |
extern __inline__ void end_periodic_task(void) {} |
extern __inline__ void start_back_task(void) {} |
extern __inline__ void start_job_back_task(void) { |
task_testcancel(); |
} |
extern __inline__ void end_job_back_task(void) { |
task_testcancel(); |
} |
extern __inline__ void end_back_task(void) {} |
#endif |
/demos/tags/rel_1_5_beta1/loader/shark/shark.mak |
---|
0,0 → 1,13 |
ifndef BASE |
BASE=../../.. |
endif |
include $(BASE)/config/config.mk |
PROGS = TEST |
include $(BASE)/config/example.mk |
TEST: |
make -f $(SUBMAKE) APP="nload" BASE=../../.. INIT= OTHEROBJS="event.o initfile.o shark.o fsfinit.o" OTHERINCL="-I." SHARKOPT="__LINUXC26__ __PCI__ __NET__ __FIRST__" |
cp nload TEST |
/demos/tags/rel_1_5_beta1/loader/shark/shark.h |
---|
0,0 → 1,19 |
#ifndef __SHARK_H__ |
#define __SHARK_H__ |
#include "nload.h" |
#include "lconst.h" |
#define MAX_MUTEX 20 |
int calibrate_cycle(); |
void start_simulation(); |
void *get_task_model(struct loader_task *current); |
void set_simulation_time (struct timespec *total); |
void set_next_activation(struct timespec *next); |
void loader_task_activate(struct loader_task *l); |
int get_server_from_contract(int contract); |
void fsfinit(); |
#endif |
/demos/tags/rel_1_5_beta1/loader/shark/makefile.in |
---|
0,0 → 1,14 |
# |
# Shark dependecies |
# |
os_specific_dep: out/shark.done out/makefile |
out/shark.done: |
cd out; cp -sf ../shark/*.c . |
cd out; cp -sf ../shark/*.h . |
touch out/shark.done |
out/makefile: shark/shark.mak |
sed -e "s/TEST/$(TEST)/" shark/shark.mak > out/makefile |
/demos/tags/rel_1_5_beta1/loader/common/nload.c |
---|
0,0 → 1,315 |
/* FSF Loader |
* |
* Load and run a specific set of tasks/contracts |
* |
* This is the system indipendent part |
* |
* Giacomo Guidi <giacomo@gandalf.sssup.it> |
* Michael Timarchi <trimarchi@gandalf.sssup.it> |
* |
*/ |
#include "fsf.h" |
#include "calibrate.h" |
#include "func.h" //Generic function definitions |
#include "lconst.h" |
/* Activate task output debug */ |
#define TASK_OUTPUT |
int cal_cycles = CALIBRATION_RESULT; //Calibration const, it converts usec to cycles |
struct timespec zero_time; //Zero time of the simulation |
extern struct loader_task loader_task_list[]; //Loader task array |
extern int total_loader_task; //Loader task number |
/* OS: Oneshot Task: |
begin |
- execution |
end |
*/ |
void *oneshot_task(void *arg) |
{ |
long long i,exec_cycles = 0; |
struct loader_task *l = (struct loader_task *)(arg); |
#ifdef TASK_OUTPUT |
#ifdef OS_SHARK |
char tmp[20]; |
#endif |
#endif |
start_oneshot_task(); |
/* to avoid problem if the task start inside the create function */ |
if (l->act_current == 0) l->act_current = 1; |
#ifdef TASK_OUTPUT |
#ifdef OS_SHARK |
sprintf(tmp,"[ONESHOT]"); |
printf_xy((get_current_exec_task() % 5) * 9 + 34,get_current_exec_task() / 5 + 5, GREEN, tmp); |
#endif |
#endif |
exec_cycles = (long long)(TIMESPEC2USEC(&l->exec[l->act_current-1])) * CALIBRATION_DELTA / cal_cycles; |
/* Execution delay */ |
for (i=0;i<exec_cycles;i++) |
__asm__ __volatile__ ("xorl %%eax,%%eax\n\t" |
"cpuid\n\t" |
:::"eax","ebx","ecx","edx"); |
end_oneshot_task(); |
#ifdef TASK_OUTPUT |
#ifdef OS_SHARK |
sprintf(tmp,"[--END--]"); |
printf_xy((get_current_exec_task() % 5) * 9 + 34,get_current_exec_task() / 5 + 5, GREEN, tmp); |
#endif |
#endif |
return NULL; |
} |
/* CT: Cyclical Task: |
begin |
while (1) { |
- execution |
- end_cycle |
} |
end (never end) |
*/ |
void *periodic_task(void *arg) |
{ |
long long i,exec_cycles = 0,block_cycles = 0; |
int act = 0; |
struct loader_task *l = (struct loader_task *)(arg); |
#ifdef TASK_OUTPUT |
#ifdef OS_SHARK |
char tmp[20]; |
#endif |
#endif |
start_periodic_task(); |
if (l->act_current == 0) l->act_current = 1; |
while(1) { |
start_job_periodic_task(); |
#ifdef TASK_OUTPUT |
#ifdef OS_SHARK |
sprintf(tmp,"C[%06d]",act); |
printf_xy((get_current_exec_task() % 5) * 9 + 34,get_current_exec_task() / 5 + 5, GREEN, tmp); |
#endif |
#endif |
exec_cycles = (long long)(TIMESPEC2USEC(&l->exec[l->act_current-1])) * CALIBRATION_DELTA / cal_cycles; |
block_cycles = (long long)(TIMESPEC2USEC(&l->block[l->act_current-1])) * CALIBRATION_DELTA / cal_cycles; |
/* Execution delay */ |
for (i=0;i<exec_cycles;i++) |
__asm__ __volatile__ ("xorl %%eax,%%eax\n\t" |
"cpuid\n\t" |
:::"eax","ebx","ecx","edx"); |
if (l->muxstatus == 2) { |
#ifdef TASK_OUTPUT |
#ifdef OS_SHARK |
sprintf(tmp,"C[LOCK%02d]",l->resource); |
printf_xy((get_current_exec_task() % 5) * 9 + 34,get_current_exec_task() / 5 + 5, RED, tmp); |
#endif |
#endif |
generic_lock_mutex(l->resource); |
for (i=0;i<block_cycles;i++) |
__asm__ __volatile__ ("xorl %%eax,%%eax\n\t" |
"cpuid\n\t" |
:::"eax","ebx","ecx","edx"); |
generic_unlock_mutex(l->resource); |
#ifdef TASK_OUTPUT |
#ifdef OS_SHARK |
sprintf(tmp,"C[FREE%02d]",l->resource); |
printf_xy((get_current_exec_task() % 5) * 9 + 34,get_current_exec_task() / 5 + 5, GREEN, tmp); |
#endif |
#endif |
} |
end_job_periodic_task(); |
generic_task_endcycle(); |
act++; |
} |
end_periodic_task(); |
#ifdef TASK_OUTPUT |
#ifdef OS_SHARK |
sprintf(tmp,"[--END--]"); |
printf_xy((get_current_exec_task() % 5) * 9 + 34,get_current_exec_task() / 5 + 5, GREEN, tmp); |
#endif |
#endif |
return NULL; |
} |
/* BT: Background Task: |
begin |
while (1) { |
- execution |
} |
end (never end) |
*/ |
void *back_task(void *arg) |
{ |
long long i,exec_cycles = 0,block_cycles = 0; |
int act = 0; |
struct loader_task *l = (struct loader_task *)(arg); |
#ifdef TASK_OUTPUT |
#ifdef OS_SHARK |
char tmp[20]; |
#endif |
#endif |
start_back_task(); |
if (l->act_current == 0) l->act_current = 1; |
while(1) { |
start_job_back_task(); |
#ifdef TASK_OUTPUT |
#ifdef OS_SHARK |
sprintf(tmp,"B[%06d]",act); |
printf_xy((get_current_exec_task() % 5) * 9 + 34,get_current_exec_task() / 5 + 5, GREEN, tmp); |
#endif |
#endif |
exec_cycles = (long long)(TIMESPEC2USEC(&l->exec[l->act_current-1])) * CALIBRATION_DELTA / cal_cycles; |
block_cycles = (long long)(TIMESPEC2USEC(&l->block[l->act_current-1])) * CALIBRATION_DELTA / cal_cycles; |
/* Execution delay */ |
for (i=0;i<exec_cycles;i++) |
__asm__ __volatile__ ("xorl %%eax,%%eax\n\t" |
"cpuid\n\t" |
:::"eax","ebx","ecx","edx"); |
if (l->muxstatus == 2) { |
#ifdef TASK_OUTPUT |
#ifdef OS_SHARK |
sprintf(tmp,"B[LOCK%02d]",l->resource); |
printf_xy((get_current_exec_task() % 5) * 9 + 34,get_current_exec_task() / 5 + 5, RED, tmp); |
#endif |
#endif |
generic_lock_mutex(l->resource); |
for (i=0;i<block_cycles;i++) |
__asm__ __volatile__ ("xorl %%eax,%%eax\n\t" |
"cpuid\n\t" |
:::"eax","ebx","ecx","edx"); |
generic_unlock_mutex(l->resource); |
#ifdef TASK_OUTPUT |
#ifdef OS_SHARK |
sprintf(tmp,"C[FREE%02d]",l->resource); |
printf_xy((get_current_exec_task() % 5) * 9 + 34,get_current_exec_task() / 5 + 5, GREEN, tmp); |
#endif |
#endif |
} |
end_job_back_task(); |
act++; |
} |
end_back_task(); |
#ifdef TASK_OUTPUT |
#ifdef OS_SHARK |
sprintf(tmp,"[--END--]"); |
printf_xy((get_current_exec_task() % 5) * 9 + 34,get_current_exec_task() / 5 + 5, GREEN, tmp); |
#endif |
#endif |
return NULL; |
} |
/* Task create */ |
/* this function create the task struct in memory */ |
void loader_task_create() |
{ |
struct loader_task *current = loader_task_list; |
int i=0, k=0; |
while (k <total_loader_task) { |
k++; |
for (i=0; i < current->number; i++) { |
pthread_t j; |
int err = 0; |
switch(current->task_type) { |
case PAR_TASK_OS: |
err = fsf_create_local_thread(generic_get_server_from_contract(current->contract),generic_get_task_model(current), &j,NULL, |
oneshot_task,(void *)current); |
break; |
case PAR_TASK_BT: |
err = fsf_create_local_thread(generic_get_server_from_contract(current->contract),generic_get_task_model(current), &j,NULL, |
back_task,(void *)current); |
break; |
case PAR_TASK_CT: |
err = fsf_create_local_thread(generic_get_server_from_contract(current->contract),generic_get_task_model(current), &j,NULL, periodic_task,(void *)current); |
break; |
} |
if (err) { |
printf("Error fsf task creating %d\n", err); |
generic_end_simulation(); |
} |
} |
current = &loader_task_list[k]; |
} |
printf("Created %d loader tasks\n",k); |
} |
/* Main Function */ |
int start_environment() |
{ |
extern struct timespec total_time; |
/* Calibrate the exec time */ |
generic_calibrate_cycle(); |
/* Create the servers usign defined contracts */ |
generic_fsfinit(); |
/* Create the tasks */ |
loader_task_create(); |
/* Start the simulation */ |
generic_start_simulation(); |
/* Set the simulation end time */ |
generic_set_simulation_time(&total_time); |
return 0; |
} |
/demos/tags/rel_1_5_beta1/loader/common/lconst.h |
---|
0,0 → 1,37 |
#define PAR_TOTAL_EXEC_TIME 0 |
#define PAR_TIME 1 |
#define PAR_ACT_TYPE 2 |
#define PAR_TASK_NUMBER 3 |
#define PAR_EXEC_TYPE 4 |
#define PAR_TASK_TYPE 5 |
#define PAR_NOTHING 6 |
#define PAR_DEADLINE 7 |
#define PAR_ERROR 8 |
#define PAR_FOUND 9 |
#define PAR_CRIT_SESSION 10 |
#define PAR_END 11 |
#define PAR_EXEC_CONST 12 |
#define PAR_EXEC_MEAN 13 |
#define PAR_CONTRACT_SECTION 14 |
#define PAR_TASK_SECTION 15 |
#define PAR_ACT_SINGLE 16 |
#define PAR_ACT_PERIODIC 17 |
#define PAR_ACT_MEAN 18 |
#define PAR_TASK_OS 21 |
#define PAR_TASK_CT 22 |
#define PAR_TASK_BT 23 |
#define PAR_NO_CRIT 26 |
#define PAR_CRIT 27 |
#define PAR_LOCAL_SCHEDULER 29 |
#define PAR_POSIX 30 |
#define PAR_EDF 31 |
#define PAR_RM 32 |
#define PAR_NONE 33 |
#define PAR_FSF_SERVER 34 |
/demos/tags/rel_1_5_beta1/loader/common/nload.h |
---|
0,0 → 1,46 |
/* Generic Struct for loader task */ |
#ifndef __NLOAD_H__ |
#define __NLOAD_H__ |
#include "func.h" //Constant definition for loader and linux parser |
struct loader_task { |
char name[20]; //Task name |
int task_type; //Tast type (OS,CT,BT) |
int contract; //Contract number |
int local_scheduler; //Local scheduler for the task |
int number; //How many copies of this task |
int group; //Group number |
struct timespec deadline; //Task deadline |
struct timespec wcet; //Task wcet |
int act_number; //Number of activations precalcolated |
int act_current; //Actual activation number |
int resource; |
int muxstatus; |
struct timespec *act; //Activation list |
struct timespec *exec; //Execution time list |
struct timespec *block; //Blocking time |
}; |
struct loader_contract { |
int number; //Contract number |
struct timespec cmin; |
struct timespec tmax; |
struct timespec cmax; |
struct timespec tmin; |
int workload; |
struct timespec deadline; |
int local_scheduler; |
int server; //Server number linked to this contract |
}; |
#endif |
/demos/tags/rel_1_5_beta1/loader/common/time.h |
---|
0,0 → 1,65 |
#ifndef __TIME_H__ |
#define __TIME_H__ |
#define TIMESPEC2NANOSEC(t) ((t)->tv_sec * 1000000000 + (t)->tv_nsec) |
#define TIMESPEC2USEC(t) ((t)->tv_sec * 1000000 + (t)->tv_nsec / 1000) |
#define NULL_TIMESPEC(t) ((t)->tv_sec = (t)->tv_nsec = 0) |
#define ADDNANO2TIMESPEC(n, t) ((t)->tv_nsec += (n), \ |
(t)->tv_sec += (t)->tv_nsec / 1000000000, \ |
(t)->tv_nsec %= 1000000000) |
#define SUBTIMESPEC(s1, s2, d) \ |
((d)->tv_nsec = ((s1)->tv_nsec >= (s2)->tv_nsec) ? \ |
(((d)->tv_sec = (s1)->tv_sec - (s2)->tv_sec), \ |
(s1)->tv_nsec - (s2)->tv_nsec) \ |
: \ |
(((d)->tv_sec = (s1)->tv_sec - (s2)->tv_sec - 1), \ |
(1000000000 + (s1)->tv_nsec - (s2)->tv_nsec))) |
/* |
* ...and these not! |
*/ |
extern __inline__ void ADDTIMESPEC(const struct timespec *s1, |
const struct timespec *s2, |
struct timespec *d) |
{ |
d->tv_sec = s1->tv_sec + s2->tv_sec; |
d->tv_nsec = s1->tv_nsec + s2->tv_nsec; |
if (d->tv_nsec < 0) { |
d->tv_sec--; |
d->tv_nsec += 1000000000; |
} else if (d->tv_nsec >= 1000000000) { |
d->tv_sec++; |
d->tv_nsec -= 1000000000; |
} |
} |
#define ADDUSEC2TIMESPEC(m, t) ((t)->tv_nsec += (m%1000000)*1000, \ |
(t)->tv_sec += ((t)->tv_nsec / 1000000000) + (m/1000000), \ |
(t)->tv_nsec %= 1000000000) |
#define TIMESPEC_A_LT_B(a,b) \ |
( \ |
((a)->tv_sec < (b)->tv_sec) || \ |
((a)->tv_sec == (b)->tv_sec && (a)->tv_nsec < (b)->tv_nsec) \ |
) |
#define TIMESPEC_A_GT_B(a,b) \ |
( \ |
((a)->tv_sec > (b)->tv_sec) || \ |
((a)->tv_sec == (b)->tv_sec && (a)->tv_nsec > (b)->tv_nsec) \ |
) |
#define TIMESPEC_A_EQ_B(a,b) \ |
((a)->tv_sec == (b)->tv_sec && (a)->tv_nsec == (b)->tv_nsec) |
#define TIMESPEC_A_NEQ_B(a,b) \ |
((a)->tv_sec != (b)->tv_sec || (a)->tv_nsec != (b)->tv_nsec) |
#define TIMESPEC_ASSIGN(t1,t2) \ |
((t1)->tv_sec = (t2)->tv_sec, (t1)->tv_nsec = (t2)->tv_nsec) |
#endif |
/demos/tags/rel_1_5_beta1/loader/common/calibrate.h |
---|
0,0 → 1,8 |
/* Nunber of calibration iterations */ |
#define CALIBRATION_DELTA 100000 |
/* Usec of exec time for CALIBRATING_DELTA iterations |
Set to 0 if you calibrate during loader execution */ |
#define CALIBRATION_RESULT 0 |
/demos/tags/rel_1_5_beta1/loader/loadfile/loadm.fsf |
---|
0,0 → 1,72 |
# CONTRACT SECTION |
# |
# CONTRACT NUMBER:CMIN:TMAX:CMAX:TMIN:WORKLOAD:DEADLINE:LOCAL SCHEDULER |
# |
# YOU WILL HAVE A SERVER FOR EACH SPECIFIED CONTRACT, |
# SO IN THE TASK SECTION YOU CAN SPECIFY THE "CONTRACT NUMBER" |
# INSTEAD OF THE SERVER NUMBER, WHICH IS CALCULATED INSIDE THE |
# LOADER |
# |
# ALL THE TIME PARAMETERS INSIDE THIS FILE ARE ALWAYS EXPRESSED AS |
# "[SECONDS][MICROSECONDS]" TO AVOID FLOATING POINT CALCULATIONS |
# |
# WORKLOAD |
# 0 BOUNDED |
# 1 INDETERMINATED |
# |
# LOCAL SCHEDULER |
# NONE - DEFAULT FOR THE FRAMEWORK |
# POSIX |
# EDF |
# RM |
# |
# TASK SECTION |
# |
# TASK TYPE:CONTRACT NUMBER:LOCAL SCHEDULER:NUMBER OF TASK:DEADLINE:WCET:TASK ACT TYPE (PAR1,PAR2,...): |
# :TASK EXEC TYPE (PAR1,PAR2,...):CRITICAL SESSION (PAR1,PAR2,PAR3,PAR4); |
# |
# TASK TYPE |
# OS - ONE_SHOT |
# CT - CYCLICAL_TASK |
# BT - BACKGROUND_TASK |
# |
# TASK EXEC TYPE |
# EXEC_CONST(TIME) |
# - CONSTANT EXEC TIME |
# EXEC_MEAN(MEAN, DELTA) |
# - VARIABLE EXEC TIME WITH CONSTANT DISTRIBUTION |
# |
# TASK ACTIVATION TIME |
# ACT_SINGLE(START_TIME) |
# ACT_PERIODIC(START_TIME, PERIOD) |
# ACT_MEAN(START_TIME, MEAN, DELTA) |
# |
# CRITICAL SESSION |
# CRIT(RES NUMBER, BLOCKING_TIME) |
# NO_CRIT |
# |
TOTAL_EXEC_TIME:[20][0]; |
# SIMULATION TOTAL TIME |
CONTRACT SECTION |
[0]:[0][6000]:[0][30000]:[0][6000]:[0][30000]:[0]:[0][0]:EDF; |
[1]:[0][6000]:[0][60000]:[0][6000]:[0][60000]:[0]:[0][0]:EDF; |
[2]:[0][12000]:[0][60000]:[0][12000]:[0][60000]:[0]:[0][0]:POSIX; |
END |
TASK SECTION |
CT:[0]:EDF:[2]:[1][0]:[0][40000]:ACT_PERIODIC([1][0],[1][0]): |
:EXEC_CONST([0][16000]):CRIT([0],[0][2000]); |
CT:[1]:EDF:[2]:[1][0]:[0][40000]:ACT_PERIODIC([2][0],[1][0]): |
:EXEC_MEAN([0][16000],[0][10000]):CRIT([0],[0][2000]); |
BT:[2]:POSIX:[2]:[0][0]:[0][0]:ACT_SINGLE([3][0]): |
:EXEC_CONST([0][10000]):CRIT([0],[0][2000]); |
END |
/demos/tags/rel_1_5_beta1/loader/loadfile/load.fsf |
---|
0,0 → 1,76 |
# CONTRACT SECTION |
# |
# CONTRACT NUMBER:CMIN:TMAX:CMAX:TMIN:WORKLOAD:DEADLINE:LOCAL SCHEDULER |
# |
# YOU WILL HAVE A SERVER FOR EACH SPECIFIED CONTRACT, |
# SO IN THE TASK SECTION YOU CAN SPECIFY THE "CONTRACT NUMBER" |
# INSTEAD OF THE SERVER NUMBER, WHICH IS CALCULATED INSIDE THE |
# LOADER |
# |
# ALL THE TIME PARAMETERS INSIDE THIS FILE ARE ALWAYS EXPRESSED AS |
# "[SECONDS][MICROSECONDS]" TO AVOID FLOATING POINT CALCULATIONS |
# |
# WORKLOAD |
# 0 BOUNDED |
# 1 INDETERMINATED |
# |
# LOCAL SCHEDULER |
# POSIX |
# EDF |
# RM |
# NONE DEFAULT FROM THE FRAMEWORK |
# |
# TASK SECTION |
# |
# TASK TYPE:CONTRACT NUMBER:LOCAL SCHEDULER:NUMBER OF TASK:DEADLINE:WCET:TASK ACT TYPE (PAR1,PAR2,...): |
# :TASK EXEC TYPE (PAR1,PAR2,...):CRITICAL SESSION (PAR1,PAR2,PAR3,PAR4); |
# |
# TASK TYPE |
# OS - ONE_SHOT |
# CT - CYCLICAL_TASK |
# BT - BACKGROUND_TASK |
# |
# TASK EXEC TYPE |
# EXEC_CONST(TIME) |
# - CONSTANT EXEC TIME |
# EXEC_MEAN(MEAN, DELTA) |
# - VARIABLE EXEC TIME WITH CONSTANT DISTRIBUTION |
# |
# TASK ACTIVATION TIME |
# ACT_SINGLE(START_TIME) |
# ACT_PERIODIC(START_TIME, PERIOD) |
# ACT_MEAN(START_TIME, MEAN, DELTA) |
# |
# CRITICAL SESSION |
# CRIT(RES NUMBER, BLOCKING_TIME) |
# NO_CRIT |
# |
TOTAL_EXEC_TIME:[20][0]; |
# SIMULATION TOTAL TIME |
CONTRACT SECTION |
[0]:[0][3000]:[0][10000]:[0][3000]:[0][10000]:[0]:[0][9000]:POSIX; |
[1]:[0][6000]:[0][30000]:[0][6000]:[0][30000]:[0]:[0][0]:POSIX; |
[2]:[0][3000]:[0][30000]:[0][3000]:[0][30000]:[0]:[0][0]:POSIX; |
[3]:[0][3000]:[0][20000]:[0][3000]:[0][20000]:[0]:[0][0]:POSIX; |
END |
TASK SECTION |
BT:[0]:POSIX:[1]:[0][0]:[0][0]:ACT_SINGLE([1][0]): |
:EXEC_CONST([0][25000]):NO_CRIT; |
BT:[1]:POSIX:[1]:[0][0]:[0][0]:ACT_SINGLE([2][0]): |
:EXEC_CONST([0][16000]):NO_CRIT; |
OS:[2]:POSIX:[1]:[0][0]:[0][0]:ACT_SINGLE([3][0]): |
:EXEC_CONST([1][0]):NO_CRIT; |
BT:[3]:POSIX:[5]:[0][0]:[0][0]:ACT_SINGLE([4][0]): |
:EXEC_CONST([0][10000]):NO_CRIT; |
END |
/demos/tags/rel_1_5_beta1/loader/loadfile/loadxml.fsf2 |
---|
0,0 → 1,59 |
<?xml version="1.0" encoding="UTF-8"?> |
<fsf_framework xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../generators/java/fsf-schema.xsd"> |
<simulation> |
<time>20s 0u</time> |
</simulation> |
<contract> |
<cmin>0s 3000u</cmin> |
<tmax>0s 10000u</tmax> |
<cmax>0s 3000u</cmax> |
<tmin>0s 10000u</tmin> |
<workload>0</workload> |
<localscheduler type="POSIX"> |
<task_section type="BackTask"> |
<number>1</number> |
<act_section> |
<start_time>3s 0u</start_time> |
</act_section> |
<exec_section> |
<exec_time>3s 0u</exec_time> |
</exec_section> |
</task_section> |
<task_section type="OneShot"> |
<number>2</number> |
<dline>0s 0u</dline> |
<wcet>0s 0u</wcet> |
<act_section> |
<start_time>3s 0u</start_time> |
</act_section> |
<exec_section> |
<exec_time>3s 0u</exec_time> |
</exec_section> |
</task_section> |
</localscheduler> |
</contract> |
<contract> |
<cmin>0s 3000u</cmin> |
<tmax>0s 10000u</tmax> |
<cmax>0s 3000u</cmax> |
<tmin>0s 10000u</tmin> |
<workload>0</workload> |
<localscheduler type="EDF"> |
<task_section type="CyclicalTask"> |
<number>1</number> |
<dline>1s 0u</dline> |
<wcet>0s 100000u</wcet> |
<act_section> |
<start_time>3s 0u</start_time> |
<period_time>1s 0u</period_time> |
</act_section> |
<exec_section> |
<exec_time>0s 10000u</exec_time> |
<delta_time>0s 10000u</delta_time> |
</exec_section> |
</task_section> |
</localscheduler> |
</contract> |
</fsf_framework> |
/demos/tags/rel_1_5_beta1/loader/generators/lparser.c |
---|
0,0 → 1,486 |
#include <stdlib.h> |
#include <string.h> |
#include <stdio.h> |
#include "lparser.h" |
#include "common/time.h" |
#define PARSER_DEBUG |
static int find_break(char **buf, int find_type, struct timespec *time, int *val) |
{ |
int i; |
char str[20]; |
i = 0; |
while (((char *)(*buf))[i] == ' ' || ((char *)(*buf))[i] == ':' || |
((char *)(*buf))[i] == '\n' || ((char *)(*buf))[i] == '\r') i++; |
*buf += i; |
if (!strncmp(*buf,"END",3) && find_type == PAR_NOTHING) { |
*buf += 3; |
return PAR_END; |
} |
if (!strncmp(*buf,"CONTRACT SECTION",16) && find_type == PAR_NOTHING) { |
*buf += 16; |
return PAR_CONTRACT_SECTION; |
} |
if (!strncmp(*buf,"TASK SECTION",12) && find_type == PAR_NOTHING) { |
*buf += 12; |
return PAR_TASK_SECTION; |
} |
i = 0; |
if (((char *)(*buf))[0] == '#' && find_type == PAR_NOTHING) { |
while (((char *)(*buf))[i] != '\n' && ((char *)(*buf))[i] != '\r') i++; |
*buf += i; |
return PAR_FOUND; |
} |
switch (find_type) { |
case PAR_NOTHING: |
if (((char *)(*buf))[0] == ';' || |
((char *)(*buf))[0] < 32) { |
*buf += 1; |
return PAR_FOUND; |
} |
break; |
case PAR_TOTAL_EXEC_TIME: |
if (!strncmp(*buf, "TOTAL_EXEC_TIME:",16)) { |
*buf += 16; |
return PAR_FOUND; |
} |
break; |
case PAR_TIME: |
if (((char *)(*buf))[0] != '[') return PAR_ERROR; |
*buf += 1; |
i = 0; |
while (((char *)(*buf))[i] >= '0' && ((char *)(*buf))[i] <= '9') { |
str[i] = ((char *)(*buf))[i]; |
i++; |
} |
if (((char *)(*buf))[i] != ']') return PAR_ERROR; |
str[i] = 0; |
time->tv_sec = atoi(str); |
i += 2; |
*buf += i; |
i = 0; |
while (((char *)(*buf))[i] >= '0' && ((char *)(*buf))[i] <= '9') { |
str[i] = ((char *)(*buf))[i]; |
i++; |
} |
if (((char *)(*buf))[i] != ']') return PAR_ERROR; |
str[i] = 0; |
time->tv_nsec = atoi(str) * 1000; |
i += 2; |
*buf += i; |
return PAR_FOUND; |
break; |
case PAR_TASK_TYPE: |
if (!strncmp(*buf, "OS:",3)) { |
*val = PAR_TASK_OS; |
*buf += 3; |
return PAR_FOUND; |
} |
if (!strncmp(*buf, "CT:",3)) { |
*val = PAR_TASK_CT; |
*buf += 3; |
return PAR_FOUND; |
} |
if (!strncmp(*buf, "BT:",3)) { |
*val = PAR_TASK_BT; |
*buf += 3; |
return PAR_FOUND; |
} |
break; |
case PAR_TASK_NUMBER: |
if (((char *)(*buf))[0] != '[') return PAR_ERROR; |
*buf += 1; |
i = 0; |
while (((char *)(*buf))[i] >= '0' && ((char *)(*buf))[i] <= '9') { |
str[i] = ((char *)(*buf))[i]; |
i++; |
} |
if (((char *)(*buf))[i] != ']') return PAR_ERROR; |
str[i] = 0; |
*val = atoi(str); |
i += 2; |
*buf += i; |
return PAR_FOUND; |
break; |
case PAR_ACT_TYPE: |
if (!strncmp(*buf,"ACT_SINGLE(",11)) { |
*buf += 11; |
*val = PAR_ACT_SINGLE; |
return PAR_FOUND; |
} |
if (!strncmp(*buf,"ACT_PERIODIC(",13)) { |
*buf += 13; |
*val = PAR_ACT_PERIODIC; |
return PAR_FOUND; |
} |
if (!strncmp(*buf,"ACT_MEAN(",9)) { |
*buf += 9; |
*val = PAR_ACT_MEAN; |
return PAR_FOUND; |
} |
return PAR_ERROR; |
break; |
case PAR_LOCAL_SCHEDULER: |
if (!strncmp(*buf,"POSIX",5)) { |
*buf += 5; |
*val = PAR_POSIX; |
return PAR_FOUND; |
} |
if (!strncmp(*buf,"EDF",3)) { |
*buf += 3; |
*val = PAR_EDF; |
return PAR_FOUND; |
} |
if (!strncmp(*buf,"RM",2)) { |
*buf += 2; |
*val = PAR_RM; |
return PAR_FOUND; |
} |
if (!strncmp(*buf,"NONE",2)) { |
*buf += 4; |
*val = PAR_NONE; |
return PAR_FOUND; |
} |
return PAR_ERROR; |
break; |
case PAR_EXEC_TYPE: |
if (!strncmp(*buf,"EXEC_CONST(",11)) { |
*buf += 11; |
*val = PAR_EXEC_CONST; |
return PAR_FOUND; |
} |
if (!strncmp(*buf,"EXEC_MEAN(",10)) { |
*buf += 10; |
*val = PAR_EXEC_MEAN; |
return PAR_FOUND; |
} |
return PAR_ERROR; |
break; |
case PAR_CRIT_SESSION: |
if (!strncmp(*buf,"NO_CRIT",7)) { |
*buf += 7; |
*val = PAR_NO_CRIT; |
return PAR_FOUND; |
} |
if (!strncmp(*buf,"CRIT(",5)) { |
*buf += 5; |
*val = PAR_CRIT; |
return PAR_FOUND; |
} |
return PAR_ERROR; |
break; |
} |
return PAR_ERROR; |
} |
void par_error(int line_num) |
{ |
printf("\nParser error: line [%d]\n",line_num); |
exit(1); |
} |
/* result: |
* 0 -> nothing |
* 1 -> total |
* 2 -> new task-loader |
* 3 -> end file |
*/ |
int line_parser_task(char **pbuf, int line_num, struct loader_task **last) |
{ |
struct timespec time; |
struct loader_task *ld = NULL; |
int val, res; |
res = find_break(pbuf, PAR_NOTHING, &time, &val); |
if (res == PAR_FOUND) return 0; |
if (res == PAR_END) return 3; |
res = find_break(pbuf,PAR_TASK_TYPE, &time, &val); |
if (res == PAR_FOUND) { |
#ifdef PARSER_DEBUG |
printf("TASK TYPE = %d\n",val); |
#endif |
ld = malloc(sizeof(struct loader_task)); |
if (ld == NULL) par_error(line_num); |
ld->next = NULL; |
*last = ld; |
ld->task_type = val; |
} else par_error(line_num); |
res = find_break(pbuf,PAR_TASK_NUMBER, &time, &val); |
if (res == PAR_FOUND) { |
#ifdef PARSER_DEBUG |
printf("TASK SERVER = %d\n",val); |
#endif |
ld->server = val; |
} else par_error(line_num); |
res = find_break(pbuf,PAR_LOCAL_SCHEDULER, &time, &val); |
if (res == PAR_FOUND) { |
#ifdef PARSER_DEBUG |
printf("TASK LOCAL SCHEDULER = %d\n",val); |
#endif |
ld->local_scheduler = val; |
} else par_error(line_num); |
res = find_break(pbuf,PAR_TASK_NUMBER, &time, &val); |
if (res == PAR_FOUND) { |
#ifdef PARSER_DEBUG |
printf("TASK NUMBER = %d\n",val); |
#endif |
ld->number = val; |
} else par_error(line_num); |
res = find_break(pbuf,PAR_TIME, &time, &val); |
if (res == PAR_FOUND) { |
#ifdef PARSER_DEBUG |
printf("DEADLINE: [%ld][%ld]\n",time.tv_sec,time.tv_nsec/1000); |
#endif |
TIMESPEC_ASSIGN(&ld->deadline,&time); |
} else par_error(line_num); |
res = find_break(pbuf,PAR_TIME, &time, &val); |
if (res == PAR_FOUND) { |
#ifdef PARSER_DEBUG |
printf("WCET: [%ld][%ld]\n",time.tv_sec,time.tv_nsec/1000); |
#endif |
TIMESPEC_ASSIGN(&ld->wcet,&time); |
} else par_error(line_num); |
res = find_break(pbuf,PAR_ACT_TYPE, &time, &val); |
if (res == PAR_FOUND) { |
#ifdef PARSER_DEBUG |
printf("ACTIVATION TYPE: %d (",val); |
#endif |
ld->act_type = val; |
res = find_break(pbuf,PAR_TIME, &time, &val); |
if (res == PAR_FOUND) { |
#ifdef PARSER_DEBUG |
printf("[%ld][%ld]",time.tv_sec,time.tv_nsec/1000); |
#endif |
TIMESPEC_ASSIGN(&ld->act_par_1,&time); |
} else par_error(line_num); |
if (ld->act_type != PAR_ACT_SINGLE) { |
res = find_break(pbuf,PAR_TIME, &time, &val); |
if (res == PAR_FOUND) { |
#ifdef PARSER_DEBUG |
printf(",[%ld][%ld]",time.tv_sec,time.tv_nsec/1000); |
#endif |
TIMESPEC_ASSIGN(&ld->act_par_2,&time); |
} else par_error(line_num); |
} |
if (ld->act_type != PAR_ACT_SINGLE && ld->act_type != PAR_ACT_PERIODIC) { |
res = find_break(pbuf,PAR_TIME, &time, &val); |
if (res == PAR_FOUND) { |
#ifdef PARSER_DEBUG |
printf(",[%ld][%ld]",time.tv_sec,time.tv_nsec/1000); |
#endif |
TIMESPEC_ASSIGN(&ld->act_par_3,&time); |
} else par_error(line_num); |
} |
#ifdef PARSER_DEBUG |
printf(")\n"); |
#endif |
} else par_error(line_num); |
res = find_break(pbuf,PAR_EXEC_TYPE, &time, &val); |
if (res == PAR_FOUND) { |
#ifdef PARSER_DEBUG |
printf("EXEC TYPE: %d (",val); |
#endif |
ld->exec_type = val; |
res = find_break(pbuf,PAR_TIME, &time, &val); |
if (res == PAR_FOUND) { |
#ifdef PARSER_DEBUG |
printf("[%ld][%ld]",time.tv_sec,time.tv_nsec/1000); |
#endif |
TIMESPEC_ASSIGN(&ld->exec_par_1,&time); |
} else par_error(line_num); |
if (ld->exec_type != PAR_EXEC_CONST) { |
res = find_break(pbuf,PAR_TIME, &time, &val); |
if (res == PAR_FOUND) { |
#ifdef PARSER_DEBUG |
printf(",[%ld][%ld]",time.tv_sec,time.tv_nsec/1000); |
#endif |
TIMESPEC_ASSIGN(&ld->exec_par_2,&time); |
} else par_error(line_num); |
} |
#ifdef PARSER_DEBUG |
printf(")\n"); |
#endif |
} else par_error(line_num); |
res = find_break(pbuf,PAR_CRIT_SESSION, &time, &val); |
if (res == PAR_FOUND) { |
#ifdef PARSER_DEBUG |
printf("CRITITCAL SESSION: %d (",val); |
#endif |
ld->crit_type = val; |
if (ld->crit_type == PAR_CRIT) { |
res = find_break(pbuf,PAR_TASK_NUMBER, &time, &val); |
if (res == PAR_FOUND) { |
#ifdef PARSER_DEBUG |
printf("[%d]",val); |
#endif |
ld->resource = val; |
} else par_error(line_num); |
res = find_break(pbuf,PAR_TIME, &time, &val); |
if (res == PAR_FOUND) { |
#ifdef PARSER_DEBUG |
printf(",[%ld][%ld]",time.tv_sec,time.tv_nsec/1000); |
#endif |
TIMESPEC_ASSIGN(&ld->crit_par,&time); |
} else par_error(line_num); |
} |
#ifdef PARSER_DEBUG |
printf(")\n"); |
#endif |
} else par_error(line_num); |
return 2; |
} |
int line_parser_contract(char **pbuf, int line_num, struct timespec *total, struct loader_contract **last) |
{ |
struct timespec time; |
struct loader_contract *lc = NULL; |
int val, res; |
res = find_break(pbuf, PAR_NOTHING, &time, &val); |
if (res == PAR_FOUND) return 0; |
if (res == PAR_END) return 3; |
res = find_break(pbuf,PAR_TOTAL_EXEC_TIME, &time, &val); |
if (res == PAR_FOUND) { |
NULL_TIMESPEC(total); |
res = find_break(pbuf, PAR_TIME, &time, &val); |
if (res == PAR_FOUND) { |
TIMESPEC_ASSIGN(total,&time); |
#ifdef PARSER_DEBUG |
printf("TOTAL EXEC TIME SEC = %ld NSEC = %ld\n",total->tv_sec,total->tv_nsec); |
#endif |
return 1; |
} else par_error(line_num); |
} |
res = find_break(pbuf,PAR_TASK_NUMBER, &time, &val); |
if (res == PAR_FOUND) { |
#ifdef PARSER_DEBUG |
printf("CONTRACT [%d]",val); |
#endif |
lc = malloc(sizeof(struct loader_contract)); |
if (lc == NULL) par_error(line_num); |
lc->next = NULL; |
*last = lc; |
lc->number = val; |
} else par_error(line_num); |
res = find_break(pbuf,PAR_TIME, &time, &val); |
if (res == PAR_FOUND) { |
#ifdef PARSER_DEBUG |
printf(",[%ld][%ld]",time.tv_sec,time.tv_nsec/1000); |
#endif |
TIMESPEC_ASSIGN(&lc->cmin,&time); |
} else par_error(line_num); |
res = find_break(pbuf,PAR_TIME, &time, &val); |
if (res == PAR_FOUND) { |
#ifdef PARSER_DEBUG |
printf(",[%ld][%ld]",time.tv_sec,time.tv_nsec/1000); |
#endif |
TIMESPEC_ASSIGN(&lc->tmax,&time); |
} else par_error(line_num); |
res = find_break(pbuf,PAR_TIME, &time, &val); |
if (res == PAR_FOUND) { |
#ifdef PARSER_DEBUG |
printf(",[%ld][%ld]",time.tv_sec,time.tv_nsec/1000); |
#endif |
TIMESPEC_ASSIGN(&lc->cmax,&time); |
} else par_error(line_num); |
res = find_break(pbuf,PAR_TIME, &time, &val); |
if (res == PAR_FOUND) { |
#ifdef PARSER_DEBUG |
printf(",[%ld][%ld],",time.tv_sec,time.tv_nsec/1000); |
#endif |
TIMESPEC_ASSIGN(&lc->tmin,&time); |
} else par_error(line_num); |
res = find_break(pbuf,PAR_TASK_NUMBER, &time, &val); |
if (res == PAR_FOUND) { |
#ifdef PARSER_DEBUG |
printf(",[%d]\n",val); |
#endif |
lc->workload = val; |
} else par_error(line_num); |
res = find_break(pbuf,PAR_TIME, &time, &val); |
if (res == PAR_FOUND) { |
#ifdef PARSER_DEBUG |
printf(",[%ld][%ld],",time.tv_sec,time.tv_nsec/1000); |
#endif |
TIMESPEC_ASSIGN(&lc->deadline,&time); |
} else par_error(line_num); |
res = find_break(pbuf,PAR_LOCAL_SCHEDULER, &time, &val); |
if (res == PAR_FOUND) { |
#ifdef PARSER_DEBUG |
printf("LOCAL SCHEDULER = %d\n",val); |
#endif |
lc->local_scheduler = val; |
} else par_error(line_num); |
return 2; |
} |
/demos/tags/rel_1_5_beta1/loader/generators/event_gen.c |
---|
0,0 → 1,474 |
/* Event Generator |
* |
* Giacomo Guidi |
*/ |
#include <stdio.h> |
#include <stdlib.h> |
#include "lparser.h" |
#include "lread.h" |
#include "time.h" |
#include "common/time.h" |
#define LOADFILE_DIR "../loadfile/" |
#define EVENT_DEFINE "event.c" |
#define ACT_LIST "event.c" |
int write_struct(void) |
{ |
FILE *file_event_header; |
file_event_header = fopen(EVENT_DEFINE,"w"); |
if (file_event_header == NULL) return 1; |
fprintf(file_event_header, "\n#include \"func.h\"\n"); |
fclose(file_event_header); |
return 0; |
} |
int write_basic_par_start(void) |
{ |
FILE *file_event_header; |
file_event_header = fopen(EVENT_DEFINE,"a+"); |
if (file_event_header == NULL) return 1; |
fprintf(file_event_header, "struct loader_task loader_task_list[] = {\n"); |
fclose(file_event_header); |
return 0; |
} |
int write_contract_start(void) |
{ |
FILE *file_event_header; |
file_event_header = fopen(EVENT_DEFINE,"a+"); |
if (file_event_header == NULL) return 1; |
fprintf(file_event_header, "struct loader_contract loader_contract_list[] = {\n"); |
fclose(file_event_header); |
return 0; |
} |
int write_basic_par(struct loader_task *c) |
{ |
FILE *file_event_header; |
int muxpres; |
char muxtemp[30]; |
file_event_header = fopen(EVENT_DEFINE,"a+"); |
if (file_event_header == NULL) return 1; |
if (c->crit_type == PAR_CRIT) { |
muxpres = 1; |
sprintf(muxtemp,"block_%s",c->name); |
} else { |
muxpres = 0; |
sprintf(muxtemp,"NULL"); |
} |
fprintf(file_event_header, " {\"%s\",%d,%d,%d,%d,%d,{%d,%d},{%d,%d},%d,0,%d,%d,act_%s,exec_%s,%s},\n", |
c->name,(int)c->task_type,(int)c->server,(int)c->local_scheduler,(int)c->number,(int)c->group, |
(int)c->deadline.tv_sec, (int)c->deadline.tv_nsec, |
(int)c->wcet.tv_sec, (int)c->wcet.tv_nsec, |
(int)c->act_number, (int)c->resource, muxpres, c->name, c->name, muxtemp); |
fclose(file_event_header); |
return 0; |
} |
int write_contract(struct loader_contract *c) |
{ |
FILE *file_event_header; |
file_event_header = fopen(EVENT_DEFINE,"a+"); |
if (file_event_header == NULL) return 1; |
fprintf(file_event_header, " {%d,{%d,%d},{%d,%d},{%d,%d},{%d,%d},%d,{%d,%d},%d,-1},\n", |
(int)c->number,(int)c->cmin.tv_sec,(int)c->cmin.tv_nsec, |
(int)c->tmax.tv_sec,(int)c->tmax.tv_nsec, |
(int)c->cmax.tv_sec,(int)c->cmax.tv_nsec, |
(int)c->tmin.tv_sec,(int)c->tmin.tv_nsec, |
(int)c->workload, |
(int)c->deadline.tv_sec,(int)c->deadline.tv_nsec, |
(int)c->local_scheduler); |
fclose(file_event_header); |
return 0; |
} |
int close_loader_task(int total_task_number) |
{ |
FILE *file_event_header; |
file_event_header = fopen(EVENT_DEFINE,"a+"); |
if (file_event_header == NULL) return 1; |
fprintf(file_event_header,"};\n\n"); |
fprintf(file_event_header,"int total_loader_task = %d;\n\n",total_task_number); |
fclose(file_event_header); |
return 0; |
} |
int close_loader_contract(int total_contract_number) |
{ |
FILE *file_event_header; |
file_event_header = fopen(EVENT_DEFINE,"a+"); |
if (file_event_header == NULL) return 1; |
fprintf(file_event_header,"};\n\n"); |
fprintf(file_event_header,"int total_loader_contract = %d;\n\n",total_contract_number); |
fclose(file_event_header); |
return 0; |
} |
int write_simulation_time(struct timespec *total) |
{ |
FILE *file_event_header; |
file_event_header = fopen(EVENT_DEFINE,"a+"); |
if (file_event_header == NULL) return 1; |
fprintf(file_event_header,"struct timespec total_time = {%d,%d};\n\n",(int)total->tv_sec,(int)total->tv_nsec); |
fclose(file_event_header); |
return 0; |
} |
int write_single_act(struct timespec *t, struct loader_task *c) |
{ |
FILE *file_act_header; |
file_act_header = fopen(ACT_LIST,"a+"); |
if (file_act_header == NULL) return 1; |
if (TIMESPEC_A_GT_B(t,&c->act_par_1)) { |
fprintf(file_act_header,"struct timespec act_%s[] = {{%d,%d}};\n\n",c->name, |
(int)c->act_par_1.tv_sec,(int)c->act_par_1.tv_nsec); |
c->act_number = 1; |
} else { |
fprintf(file_act_header,"struct timespec act_%s[] = {{0,0}};\n\n",c->name); |
c->act_number = 0; |
} |
fclose(file_act_header); |
return 0; |
} |
int write_periodic_act(struct timespec *t, struct loader_task *c) |
{ |
FILE *file_act_header; |
struct timespec tot_time; |
int period; |
file_act_header = fopen(ACT_LIST,"a+"); |
if (file_act_header == NULL) return 1; |
fprintf(file_act_header,"struct timespec act_%s[] = {{%d,%d},\n",c->name, |
(int)c->act_par_1.tv_sec,(int)c->act_par_1.tv_nsec); |
c->act_number = 1; |
TIMESPEC_ASSIGN(&tot_time,&c->act_par_1); |
period = TIMESPEC2USEC(&c->act_par_2); |
while (TIMESPEC_A_GT_B(t, &tot_time)) { |
c->act_number++; |
ADDUSEC2TIMESPEC(period,&tot_time); |
fprintf(file_act_header," {%d,%d},\n", |
(int)c->act_par_2.tv_sec,(int)c->act_par_2.tv_nsec); |
} |
fprintf(file_act_header," };\n\n"); |
fclose(file_act_header); |
return 0; |
} |
int write_mean_act(struct timespec *t,struct loader_task *c) |
{ |
FILE *file_act_header; |
struct timespec tot_time; |
int next_act; |
file_act_header = fopen(ACT_LIST,"a+"); |
if (file_act_header == NULL) return 1; |
fprintf(file_act_header,"struct timespec act_%s[] = {{%d,%d},\n",c->name, |
(int)c->act_par_1.tv_sec,(int)c->act_par_1.tv_nsec); |
c->act_number = 1; |
TIMESPEC_ASSIGN(&tot_time,&c->act_par_1); |
while (TIMESPEC_A_GT_B(t, &tot_time)) { |
c->act_number++; |
next_act = TIMESPEC2USEC(&c->act_par_2) + random() % TIMESPEC2USEC(&c->act_par_3) - TIMESPEC2USEC(&c->act_par_3) / 2; |
ADDUSEC2TIMESPEC(next_act,&tot_time); |
fprintf(file_act_header," {%d,%d},\n", |
next_act / 1000000, next_act % 1000000 * 1000); |
} |
fprintf(file_act_header," };\n\n"); |
fclose(file_act_header); |
return 0; |
} |
int write_block_const(struct loader_task *c) |
{ |
FILE *file_block_header; |
int i; |
file_block_header = fopen(ACT_LIST,"a+"); |
if (file_block_header == NULL) return 1; |
fprintf(file_block_header,"struct timespec block_%s[] = {{%d,%d},\n",c->name, |
(int)c->crit_par.tv_sec,(int)c->crit_par.tv_nsec); |
for (i=0; i< c->act_number-1; i++) |
fprintf(file_block_header," {%d,%d},\n", |
(int)c->crit_par.tv_sec,(int)c->crit_par.tv_nsec); |
fprintf(file_block_header," };\n\n"); |
fclose(file_block_header); |
return 0; |
} |
int write_exec_const(struct loader_task *c) |
{ |
FILE *file_exec_header; |
int i; |
file_exec_header = fopen(ACT_LIST,"a+"); |
if (file_exec_header == NULL) return 1; |
fprintf(file_exec_header,"struct timespec exec_%s[] = {{%d,%d},\n",c->name, |
(int)c->exec_par_1.tv_sec,(int)c->exec_par_1.tv_nsec); |
for (i=0; i< c->act_number-1; i++) |
fprintf(file_exec_header," {%d,%d},\n", |
(int)c->exec_par_1.tv_sec,(int)c->exec_par_1.tv_nsec); |
fprintf(file_exec_header," };\n\n"); |
fclose(file_exec_header); |
return 0; |
} |
int write_exec_mean(struct loader_task *c) |
{ |
FILE *file_exec_header; |
int exec_time_usec; |
int i; |
file_exec_header = fopen(ACT_LIST,"a+"); |
if (file_exec_header == NULL) return 1; |
exec_time_usec = TIMESPEC2USEC(&c->exec_par_1) |
+ random() % TIMESPEC2USEC(&c->exec_par_2) - TIMESPEC2USEC(&c->exec_par_2) / 2; |
fprintf(file_exec_header,"struct timespec exec_%s[] = {{%d,%d},\n",c->name, |
exec_time_usec / 1000000, exec_time_usec % 1000000 * 1000); |
for (i=0; i< c->act_number-1; i++) { |
exec_time_usec = TIMESPEC2USEC(&c->exec_par_1) |
+ random() % TIMESPEC2USEC(&c->exec_par_2) - TIMESPEC2USEC(&c->exec_par_2) / 2; |
fprintf(file_exec_header," {%d,%d},\n", |
exec_time_usec / 1000000, exec_time_usec % 1000000 * 1000); |
} |
fprintf(file_exec_header," };\n\n"); |
fclose(file_exec_header); |
return 0; |
} |
void *start; |
void *end; |
int main(int argc, char **argv) { |
char loadfile[100]; |
struct timespec total_time; |
struct loader_task *start_loader_task = NULL, *current_t; |
struct loader_contract *start_loader_contract = NULL, *current_c; |
int err,ldnum; |
int total_task_number; |
int total_contract_number; |
printf("\nEvent Generator\n"); |
if (argc < 2) { |
printf("Error: event_gen loadfile.fsf\n"); |
exit(1); |
} |
printf("Read loader file %s\n",argv[1]); |
sprintf(loadfile,"%s%s",LOADFILE_DIR,argv[1]); |
err = dos_preload(loadfile,100000,&start,&end); |
if (err != 0) { |
printf("Error: File not found\n"); |
exit(1); |
} |
printf("Parsing file\n"); |
line_reader(start, end, &total_time, &start_loader_task, &start_loader_contract); |
srandom(time(NULL)); |
write_struct(); |
current_t = start_loader_task; |
ldnum = 1; |
while(current_t != NULL) { |
sprintf(current_t->name,"ltask%d",ldnum); |
current_t->group = ldnum; |
ldnum++; |
switch (current_t->act_type) { |
case PAR_ACT_SINGLE: |
err = write_single_act(&total_time,current_t); |
if (err != 0) { |
printf("Error writing activation header\n"); |
exit(1); |
} |
break; |
case PAR_ACT_PERIODIC: |
err = write_periodic_act(&total_time,current_t); |
if (err != 0) { |
printf("Error writing activation header\n"); |
exit(1); |
} |
break; |
case PAR_ACT_MEAN: |
err = write_mean_act(&total_time,current_t); |
if (err != 0) { |
printf("Error writing activation header\n"); |
exit(1); |
} |
break; |
} |
switch (current_t->exec_type) { |
case PAR_EXEC_CONST: |
err = write_exec_const(current_t); |
if (err != 0) { |
printf("Error writing exec header\n"); |
exit(1); |
} |
break; |
case PAR_EXEC_MEAN: |
err = write_exec_mean(current_t); |
if (err != 0) { |
printf("Error writing exec header\n"); |
exit(1); |
} |
break; |
} |
switch (current_t->crit_type) { |
case PAR_CRIT: |
err = write_block_const(current_t); |
if (err != 0) { |
printf("Error writing block header\n"); |
exit(1); |
} |
break; |
} |
current_t = current_t->next; |
} |
write_basic_par_start(); |
total_task_number = 0; |
current_t = start_loader_task; |
while(current_t != NULL) { |
write_basic_par(current_t); |
current_t = current_t->next; |
total_task_number++; |
} |
close_loader_task(total_task_number); |
write_contract_start(); |
total_contract_number = 0; |
current_c = start_loader_contract; |
while(current_c != NULL) { |
write_contract(current_c); |
current_c = current_c->next; |
total_contract_number++; |
} |
close_loader_contract(total_contract_number); |
write_simulation_time(&total_time); |
return 0; |
} |
/demos/tags/rel_1_5_beta1/loader/generators/lparser.h |
---|
0,0 → 1,58 |
#ifndef __LPARSER_H__ |
#define __LPARSER_H__ |
#include "common/lconst.h" |
struct loader_task { |
char name[20]; |
int number; |
int group; |
int server; |
int local_scheduler; |
int task_type; |
int act_type; |
struct timespec act_par_1; |
struct timespec act_par_2; |
struct timespec act_par_3; |
int exec_type; |
struct timespec exec_par_1; |
struct timespec exec_par_2; |
struct timespec deadline; |
struct timespec wcet; |
int act_number; |
struct timespec *act; |
struct timespec *exec; |
int crit_type; |
int resource; |
struct timespec crit_par; |
struct loader_task *next; |
}; |
struct loader_contract { |
int number; |
struct timespec cmin; |
struct timespec tmax; |
struct timespec cmax; |
struct timespec tmin; |
int workload; |
struct timespec deadline; |
int local_scheduler; |
struct loader_contract *next; |
}; |
int line_parser_contract(char **buf, int line_num, struct timespec *total_time, struct loader_contract **last); |
int line_parser_task(char **buf, int line_num, struct loader_task **last); |
#endif |
/demos/tags/rel_1_5_beta1/loader/generators/java/Application.java |
---|
0,0 → 1,856 |
//package first_filter; |
import java.io.*; |
import java.net.*; |
import java.util.List; |
import java.util.ArrayList; |
import java.util.Iterator; |
import org.jdom.*; |
import org.jdom.input.SAXBuilder; |
import org.jdom.output.XMLOutputter; |
import java.util.regex.*; |
import java.util.Random; |
/** |
* <p>Title: First XML filter</p> |
* <p>Description: </p> |
* <p>Copyright: Copyright (c) 2003</p> |
* <p>Company: Retis Lab</p> |
* @author not attributable |
* @version 1.0 |
*/ |
public class Application { |
private int numElements = 0; |
final String LOADFILE_DIR="../loadfile/"; |
final String EVENT_DEFINE="event.c"; |
final String ACT_LIST="event.c"; |
private int servernumber=0; |
private timespec simulation_time=new timespec(); |
ArrayList local_scheduler=new ArrayList(); |
ArrayList Task_Section=new ArrayList(); |
private int task_group=0; |
private int task_server=0; |
private int current_scheduler=0; |
//Construct the frame |
public Application() { |
try { |
jbInit(); |
} |
catch(Exception e) { |
e.printStackTrace(); |
} |
} |
//Component initialization |
private void jbInit() throws Exception { |
} |
public void process (String url) throws MalformedURLException { |
try { |
// Use SAXBuilder |
SAXBuilder builder = new SAXBuilder("org.apache.xerces.parsers.SAXParser", true); |
builder.setFeature("http://apache.org/xml/features/validation/schema", true); |
Document doc = builder.build(url); |
Element root = doc.getRootElement(); |
try { |
// Funzione per il salvataggio del file XML |
OutputStream fout = new FileOutputStream(EVENT_DEFINE); |
OutputStream bout = new BufferedOutputStream(fout); |
OutputStreamWriter out = new OutputStreamWriter(bout, "8859_1"); |
out.write("\n#include \"func.h\"\n"); |
processElement (root,out); |
out.flush(); |
out.close(); |
} catch (UnsupportedEncodingException e) { |
System.out.println("Non sono supportati i caratteri latini"); |
System.exit(1); |
} catch (IOException e){ |
System.out.println("Salvatagio fallito"); |
System.exit(1); |
} |
System.out.println ("Total Number of Elements Processed: " |
+numElements); |
} catch (JDOMException e) { |
System.out.println ("JDOM Exception: "+e.getMessage()); |
} catch (java.io.IOException e) { |
System.out.println ("File Exception: "+e.getMessage()); |
} |
} |
// Recursive Function to Process Elements |
// Prints the Element Name and keeps a running count |
// out total number of elements. |
private void processElement(Element element, OutputStreamWriter out) { |
numElements++; |
String elementName = element.getName(); |
System.out.println(elementName); |
List servers = element.getChildren(); |
Iterator iterator = servers.iterator(); |
/* get simulation parameter */ |
Element SimulationInfo = (Element) iterator.next(); |
Pattern pattern = Pattern.compile("[us\\s]+"); |
try { |
/*simulation time */ |
String[] stime = pattern.split(SimulationInfo.getChild("time").getText()); |
out.write("struct timespec total_time={" + stime[0] + "," + stime[1] + |
"};\n\n"); |
simulation_time.tv_sec = Long.valueOf(stime[0].trim()).longValue(); |
simulation_time.tv_nsec = Long.valueOf(stime[1].trim()).longValue() / |
1000; |
//float f = Float.valueOf(s.trim()).floatValue(); |
/* server section start */ |
out.write("struct loader_contract loader_contract_list[] = {\n"); |
int total_server=0; |
while (iterator.hasNext()) { |
/* get server */ |
Element server = (Element) iterator.next(); |
process_server_section(server, out); |
total_server++; |
} |
out.write("};\n\n"); |
out.write("int total_loader_contract="+total_server+";\n\n"); |
iterator = local_scheduler.iterator(); |
while (iterator.hasNext()) { |
/* get server */ |
Element loc_sched = (Element) iterator.next(); |
process_scheduler_section(loc_sched, out); |
task_server++; |
} |
iterator = Task_Section.iterator(); |
int total_task_section=0; |
out.write("\nstruct loader_task loader_task_list[] = {\n"); |
while (iterator.hasNext()) { |
/* get server */ |
task_class tsk_sec = (task_class) iterator.next(); |
out.write(" {\"" + tsk_sec.name + "\"," + tsk_sec.task_type + "," + |
tsk_sec.contract + |
"," + tsk_sec.localscheduler + "," + tsk_sec.number + "," |
+ tsk_sec.group + ",{" + tsk_sec.deadline.tv_sec + |
"," + |
tsk_sec.deadline.tv_nsec + "}," + "{" + |
tsk_sec.wcet.tv_sec + "," + |
tsk_sec.wcet.tv_nsec + "}," + tsk_sec.act_number + |
",0,act_" + tsk_sec.name + |
",exec_" + tsk_sec.name + "},\n"); |
total_task_section++; |
} |
out.write("};\n\n"); |
out.write("int total_loader_task="+total_task_section+";\n\n"); |
} |
catch (java.io.IOException e) { |
System.out.println("File Exception: " + e.getMessage()); |
} |
} |
void process_scheduler_section(Element e, OutputStreamWriter out) { |
Attribute t; |
t=e.getAttribute("type"); |
List localpars = e.getChildren(); |
Iterator iterator = localpars.iterator(); |
while (iterator.hasNext()) { |
/* get task section */ |
Element loc_task = (Element) iterator.next(); |
process_task_section(loc_task, out, t); |
} |
} |
void process_task_section(Element e, OutputStreamWriter out, Attribute loc) { |
Attribute t; |
int act; |
act=1; |
int task_type=0; |
int localscheduler=0; |
timespec time = new timespec(); |
Pattern pattern = Pattern.compile("[us\\s]+"); |
String scheduler=loc.getValue(); |
if (scheduler.equals("POSIX")) { |
localscheduler=30; |
} |
else if (scheduler.equals("EDF")) { |
localscheduler=31; |
} |
else if (scheduler.equals("RM")) { |
localscheduler=32; |
} |
/* get task section */ |
t=e.getAttribute("type"); |
if (t.getValue().equals("BackTask")) { |
process_back_task(e, out); |
task_type=23; |
} else if (t.getValue().equals("OneShot")) { |
process_oneshot_task(e, out); |
task_type=21; |
} else if (t.getValue().equals("CyclicalTask")) { |
task_type=22; |
act=process_cyclical_task(e, out); |
} |
task_class section=new task_class(); |
section.deadline=new timespec(); |
section.wcet=new timespec(); |
section.name="task"+task_group; |
section.contract=task_server; |
section.group=task_group; |
section.act_number=act; |
section.task_type=task_type; |
section.localscheduler=localscheduler; |
section.number=Integer.valueOf(e.getChild("number").getText()).intValue(); |
Element dl = e.getChild("dline"); |
if (dl != null) { |
String[] dline=pattern.split(dl.getText()); |
time.tv_sec = Long.valueOf(dline[0]).longValue(); |
time.tv_nsec = Long.valueOf(dline[1]).longValue() * 1000; |
section.deadline.tv_sec=time.tv_sec; |
section.deadline.tv_nsec=time.tv_nsec; |
} |
Element wc = e.getChild("wcet"); |
if (wc != null) { |
String[] wcet=pattern.split(e.getChild("wcet").getText()); |
time.tv_sec = Long.valueOf(wcet[0]).longValue(); |
time.tv_nsec = Long.valueOf(wcet[1]).longValue() * 1000; |
section.wcet.tv_sec=time.tv_sec; |
section.wcet.tv_nsec=time.tv_nsec; |
} |
Task_Section.add(section); |
task_group++; |
} |
void process_back_task(Element e, OutputStreamWriter out) { |
Pattern pattern = Pattern.compile("[us\\s]+"); |
Element act_section=e.getChild("act_section"); |
String[] start_time=pattern.split(act_section.getChild("start_time").getText()); |
Element exec_section=e.getChild("exec_section"); |
String[] exec_const=pattern.split(exec_section.getChild("exec_time").getText()); |
try { |
out.write("struct timespec act_task"+task_group+"[]={{"+start_time[0]+","+start_time[1]+"},};\n\n"); |
out.write("struct timespec exec_task"+task_group+"[]={{"+exec_const[0]+","+exec_const[1]+"},};\n\n"); |
} |
catch (java.io.IOException ex) { |
System.out.println("File Exception: " + ex.getMessage()); |
} |
} |
void process_oneshot_task(Element e, OutputStreamWriter out) { |
Pattern pattern = Pattern.compile("[us\\s]+"); |
Element act_section=e.getChild("act_section"); |
String[] start_time=pattern.split(act_section.getChild("start_time").getText()); |
Element exec_section=e.getChild("exec_section"); |
String[] exec_const=pattern.split(exec_section.getChild("exec_time").getText()); |
try { |
out.write("struct timespec act_task"+task_group+"[]={{"+start_time[0]+","+start_time[1]+"},};\n\n"); |
out.write("struct timespec exec_task"+task_group+"[]={{"+exec_const[0]+","+exec_const[1]+"},};\n\n"); |
} |
catch (java.io.IOException ex) { |
System.out.println("File Exception: " + ex.getMessage()); |
} |
} |
int process_cyclical_task(Element e, OutputStreamWriter out) { |
int activated=1; |
Pattern pattern = Pattern.compile("[us\\s]+"); |
Element act_section=e.getChild("act_section"); |
String[] start_time=pattern.split(act_section.getChild("start_time").getText()); |
String[] period=pattern.split(act_section.getChild("period_time").getText()); |
Element deltatime=act_section.getChild("delta_time"); |
String[] delta_time; |
long act_delta=0; |
timespec delta_act_ts = new timespec(); |
if (deltatime != null) { |
delta_time = pattern.split(deltatime.getText()); |
delta_act_ts.tv_sec = Long.valueOf(delta_time[0]).longValue(); |
delta_act_ts.tv_nsec = Long.valueOf(delta_time[1]).longValue() * 1000; |
act_delta = delta_act_ts.TIMESPEC2USEC(); |
} |
Element exec_section=e.getChild("exec_section"); |
String[] exec_const=pattern.split(exec_section.getChild("exec_time").getText()); |
Element execdelta=exec_section.getChild("delta_time"); |
String[] exec_delta; |
long exec_delta_long = 0; |
timespec exec_delta_ts = new timespec(); |
if (execdelta != null) { |
exec_delta=pattern.split(execdelta.getText()); |
exec_delta_ts.tv_sec = Long.valueOf(exec_delta[0]).longValue(); |
exec_delta_ts.tv_nsec = Long.valueOf(exec_delta[1]).longValue() * 1000; |
exec_delta_long = exec_delta_ts.TIMESPEC2USEC(); |
} |
try { |
out.write("struct timespec act_task"+task_group+"[]={{"+ |
start_time[0]+","+start_time[1]+"},\n"); |
timespec time = new timespec(); |
time.tv_sec = Long.valueOf(period[0]).longValue(); |
time.tv_nsec = Long.valueOf(period[1]).longValue() * 1000; |
long usecperiod = time.TIMESPEC2USEC(); |
timespec nextact = new timespec(); |
time.tv_sec = Long.valueOf(start_time[0]).longValue(); |
time.tv_nsec = Long.valueOf(start_time[1]).longValue() * 1000; |
Random rd = new Random(); |
while (simulation_time.TIMESPEC_A_GT_B(time)) { |
nextact.tv_sec = Long.valueOf(period[0]).longValue(); |
nextact.tv_nsec = Long.valueOf(period[1]).longValue() * 1000; |
if (act_delta != 0) { |
nextact.ADDUSEC2TIMESPEC((rd.nextInt() & Integer.MAX_VALUE) % act_delta - act_delta/2); |
} |
time.ADDUSEC2TIMESPEC(usecperiod); |
out.write(" {"+nextact.tv_sec+","+nextact.tv_nsec/1000+"},\n"); |
activated++; |
} |
out.write("};\n"); |
out.write("struct timespec exec_task"+task_group+"[]={\n"); |
timespec nextexec = new timespec(); |
for (int i=0; i<activated; i++) { |
nextexec.tv_sec = Long.valueOf(exec_const[0]).longValue(); |
nextexec.tv_nsec = Long.valueOf(exec_const[1]).longValue() * 1000; |
if (exec_delta_long != 0) { |
nextexec.ADDUSEC2TIMESPEC((rd.nextInt() & Integer.MAX_VALUE) % exec_delta_long - exec_delta_long/2); |
} |
out.write(" {"+nextexec.tv_sec+","+nextexec.tv_nsec/1000+"},\n"); |
} |
out.write("};\n"); |
} |
catch (java.io.IOException ex) { |
System.out.println("File Exception: " + ex.getMessage()); |
} |
return activated; |
} |
void process_server_section(Element e, OutputStreamWriter out) { |
List serverpars = e.getChildren(); |
Iterator iterator = serverpars.iterator(); |
Element serverpar = (Element) iterator.next(); |
String current_value; |
current_value=serverpar.getText(); |
try { |
out.write("{" + servernumber + ",{"); |
servernumber++; |
Pattern pattern = Pattern.compile("[us\\s]+"); |
/* cmin */ |
String[] cmin = pattern.split(current_value); |
out.write(cmin[0] + "," + Long.valueOf(cmin[1]).longValue()*1000+"},{"); |
/* tmax */ |
serverpar = (Element) iterator.next(); |
current_value=serverpar.getText(); |
String[] tmax = pattern.split(current_value); |
out.write(tmax[0] + "," + Long.valueOf(tmax[1]).longValue()*1000+"},{"); |
/* cmax */ |
serverpar = (Element) iterator.next(); |
current_value=serverpar.getText(); |
String[] cmax = pattern.split(current_value); |
out.write(cmax[0] + "," + Long.valueOf(cmax[1]).longValue()*1000+"},{"); |
/* tmin */ |
serverpar = (Element) iterator.next(); |
current_value=serverpar.getText(); |
String[] tmin = pattern.split(current_value); |
out.write(tmin[0] + "," + Long.valueOf(tmin[1]).longValue()*1000+"},"); |
/*work load */ |
serverpar = (Element) iterator.next(); |
current_value=serverpar.getText(); |
out.write(current_value+","); |
serverpar = (Element) iterator.next(); |
current_value=serverpar.getName(); |
Attribute loc_type=serverpar.getAttribute("type"); |
String scheduler=loc_type.getValue(); |
if (scheduler.equals("POSIX")) { |
out.write("30"); |
} |
else if (scheduler.equals("EDF")) { |
out.write("31"); |
} |
else if (scheduler.equals("RM")) { |
out.write("32"); |
} |
out.write(",-1},\n"); |
local_scheduler.add(servernumber-1,serverpar); |
} catch (java.io.IOException ex) { |
System.out.println ("File Exception: "+ex.getMessage()); |
} |
/* |
fprintf(file_event_header, " {%d,{%d,%d},{%d,%d},{%d,%d},{%d,%d},%d,%d,-1},\n", |
(int)c->number,(int)c->cmin.tv_sec,(int)c->cmin.tv_nsec, |
(int)c->tmax.tv_sec,(int)c->tmax.tv_nsec, |
(int)c->cmax.tv_sec,(int)c->cmax.tv_nsec, |
(int)c->tmin.tv_sec,(int)c->tmin.tv_nsec, |
(int)c->workload,(int)c->local_scheduler); |
*/ |
//processElement (kid); |
} |
public static void main(String[] args) throws Exception { |
System.out.println("Parser Versione 1.0"); |
Application app = new Application(); |
if (args.length > 0) |
app.process(args[0]); |
} |
/* Event Generator |
* |
* Giacomo Guidi |
*/ |
/* |
int write_basic_par_start(void) |
{ |
FILE *file_event_header; |
file_event_header = fopen(EVENT_DEFINE,"a+"); |
if (file_event_header == NULL) return 1; |
fprintf(file_event_header, "struct loader_task loader_task_list[] = {\n"); |
fclose(file_event_header); |
return 0; |
} |
int write_basic_par(struct loader_task *c) |
{ |
FILE *file_event_header; |
file_event_header = fopen(EVENT_DEFINE,"a+"); |
if (file_event_header == NULL) return 1; |
fprintf(file_event_header, " {\"%s\",%d,%d,%d,%d,%d,{%d,%d},{%d,%d},%d,0,act_%s,exec_%s},\n", |
c->name,(int)c->task_type,(int)c->server,(int)c->local_scheduler,(int)c->number,(int)c->group, |
(int)c->deadline.tv_sec, (int)c->deadline.tv_nsec, |
(int)c->wcet.tv_sec, (int)c->wcet.tv_nsec, |
(int)c->act_number, c->name, c->name); |
fclose(file_event_header); |
return 0; |
} |
int write_contract(struct loader_contract *c) |
{ |
FILE *file_event_header; |
file_event_header = fopen(EVENT_DEFINE,"a+"); |
if (file_event_header == NULL) return 1; |
fprintf(file_event_header, " {%d,{%d,%d},{%d,%d},{%d,%d},{%d,%d},%d,%d,-1},\n", |
(int)c->number,(int)c->cmin.tv_sec,(int)c->cmin.tv_nsec, |
(int)c->tmax.tv_sec,(int)c->tmax.tv_nsec, |
(int)c->cmax.tv_sec,(int)c->cmax.tv_nsec, |
(int)c->tmin.tv_sec,(int)c->tmin.tv_nsec, |
(int)c->workload,(int)c->local_scheduler); |
fclose(file_event_header); |
return 0; |
} |
int close_loader_task(int total_task_number) |
{ |
FILE *file_event_header; |
file_event_header = fopen(EVENT_DEFINE,"a+"); |
if (file_event_header == NULL) return 1; |
fprintf(file_event_header,"};\n\n"); |
fprintf(file_event_header,"int total_loader_task = %d;\n\n",total_task_number); |
fclose(file_event_header); |
return 0; |
} |
int close_loader_contract(int total_contract_number) |
{ |
FILE *file_event_header; |
file_event_header = fopen(EVENT_DEFINE,"a+"); |
if (file_event_header == NULL) return 1; |
fprintf(file_event_header,"};\n\n"); |
fprintf(file_event_header,"int total_loader_contract = %d;\n\n",total_contract_number); |
fclose(file_event_header); |
return 0; |
} |
int write_simulation_time(struct timespec *total) |
{ |
FILE *file_event_header; |
file_event_header = fopen(EVENT_DEFINE,"a+"); |
if (file_event_header == NULL) return 1; |
fprintf(file_event_header,"struct timespec total_time = {%d,%d};\n\n",(int)total->tv_sec,(int)total->tv_nsec); |
fclose(file_event_header); |
return 0; |
} |
int write_single_act(struct timespec *t, struct loader_task *c) |
{ |
FILE *file_act_header; |
file_act_header = fopen(ACT_LIST,"a+"); |
if (file_act_header == NULL) return 1; |
if (TIMESPEC_A_GT_B(t,&c->act_par_1)) { |
fprintf(file_act_header,"struct timespec act_%s[] = {{%d,%d}};\n\n",c->name, |
(int)c->act_par_1.tv_sec,(int)c->act_par_1.tv_nsec); |
c->act_number = 1; |
} else { |
fprintf(file_act_header,"struct timespec act_%s[] = {{0,0}};\n\n",c->name); |
c->act_number = 0; |
} |
fclose(file_act_header); |
return 0; |
} |
int write_periodic_act(struct timespec *t, struct loader_task *c) |
{ |
FILE *file_act_header; |
struct timespec tot_time; |
int period; |
file_act_header = fopen(ACT_LIST,"a+"); |
if (file_act_header == NULL) return 1; |
fprintf(file_act_header,"struct timespec act_%s[] = {{%d,%d},\n",c->name, |
(int)c->act_par_1.tv_sec,(int)c->act_par_1.tv_nsec); |
c->act_number = 1; |
TIMESPEC_ASSIGN(&tot_time,&c->act_par_1); |
period = TIMESPEC2USEC(&c->act_par_2); |
while (TIMESPEC_A_GT_B(t, &tot_time)) { |
c->act_number++; |
ADDUSEC2TIMESPEC(period,&tot_time); |
fprintf(file_act_header," {%d,%d},\n", |
(int)c->act_par_2.tv_sec,(int)c->act_par_2.tv_nsec); |
} |
fprintf(file_act_header," };\n\n"); |
fclose(file_act_header); |
return 0; |
} |
int write_mean_act(struct timespec *t,struct loader_task *c) |
{ |
FILE *file_act_header; |
struct timespec tot_time; |
int next_act; |
file_act_header = fopen(ACT_LIST,"a+"); |
if (file_act_header == NULL) return 1; |
fprintf(file_act_header,"struct timespec act_%s[] = {{%d,%d},\n",c->name, |
(int)c->act_par_1.tv_sec,(int)c->act_par_1.tv_nsec); |
c->act_number = 1; |
TIMESPEC_ASSIGN(&tot_time,&c->act_par_1); |
while (TIMESPEC_A_GT_B(t, &tot_time)) { |
c->act_number++; |
next_act = TIMESPEC2USEC(&c->act_par_2) + random() % TIMESPEC2USEC(&c->act_par_3) - TIMESPEC2USEC(&c->act_par_3) / 2; |
ADDUSEC2TIMESPEC(next_act,&tot_time); |
fprintf(file_act_header," {%d,%d},\n", |
next_act / 1000000, next_act % 1000000 * 1000); |
} |
fprintf(file_act_header," };\n\n"); |
fclose(file_act_header); |
return 0; |
} |
int write_exec_const(struct loader_task *c) |
{ |
FILE *file_exec_header; |
int i; |
file_exec_header = fopen(ACT_LIST,"a+"); |
if (file_exec_header == NULL) return 1; |
fprintf(file_exec_header,"struct timespec exec_%s[] = {{%d,%d},\n",c->name, |
(int)c->exec_par_1.tv_sec,(int)c->exec_par_1.tv_nsec); |
for (i=0; i< c->act_number-1; i++) |
fprintf(file_exec_header," {%d,%d},\n", |
(int)c->exec_par_1.tv_sec,(int)c->exec_par_1.tv_nsec); |
fprintf(file_exec_header," };\n\n"); |
fclose(file_exec_header); |
return 0; |
} |
int write_exec_mean(struct loader_task *c) |
{ |
FILE *file_exec_header; |
int exec_time_usec; |
int i; |
file_exec_header = fopen(ACT_LIST,"a+"); |
if (file_exec_header == NULL) return 1; |
exec_time_usec = TIMESPEC2USEC(&c->exec_par_1) |
+ random() % TIMESPEC2USEC(&c->exec_par_2) - TIMESPEC2USEC(&c->exec_par_2) / 2; |
fprintf(file_exec_header,"struct timespec exec_%s[] = {{%d,%d},\n",c->name, |
exec_time_usec / 1000000, exec_time_usec % 1000000 * 1000); |
for (i=0; i< c->act_number-1; i++) { |
exec_time_usec = TIMESPEC2USEC(&c->exec_par_1) |
+ random() % TIMESPEC2USEC(&c->exec_par_2) - TIMESPEC2USEC(&c->exec_par_2) / 2; |
fprintf(file_exec_header," {%d,%d},\n", |
exec_time_usec / 1000000, exec_time_usec % 1000000 * 1000); |
} |
fprintf(file_exec_header," };\n\n"); |
fclose(file_exec_header); |
return 0; |
} |
void *start; |
void *end; |
int main(int argc, char **argv) { |
char loadfile[100]; |
struct timespec total_time; |
struct loader_task *start_loader_task = NULL, *current_t; |
struct loader_contract *start_loader_contract = NULL, *current_c; |
int err,ldnum; |
int total_task_number; |
int total_contract_number; |
printf("\nEvent Generator\n"); |
if (argc < 2) { |
printf("Error: event_gen loadfile.fsf\n"); |
exit(1); |
} |
printf("Read loader file %s\n",argv[1]); |
sprintf(loadfile,"%s%s",LOADFILE_DIR,argv[1]); |
err = dos_preload(loadfile,100000,&start,&end); |
if (err != 0) { |
printf("Error: File not found\n"); |
exit(1); |
} |
printf("Parsing file\n"); |
line_reader(start, end, &total_time, &start_loader_task, &start_loader_contract); |
srandom(time(NULL)); |
write_struct(); |
current_t = start_loader_task; |
ldnum = 1; |
while(current_t != NULL) { |
sprintf(current_t->name,"ltask%d",ldnum); |
current_t->group = ldnum; |
ldnum++; |
switch (current_t->act_type) { |
case PAR_ACT_SINGLE: |
err = write_single_act(&total_time,current_t); |
if (err != 0) { |
printf("Error writing activation header\n"); |
exit(1); |
} |
break; |
case PAR_ACT_PERIODIC: |
err = write_periodic_act(&total_time,current_t); |
if (err != 0) { |
printf("Error writing activation header\n"); |
exit(1); |
} |
break; |
case PAR_ACT_MEAN: |
err = write_mean_act(&total_time,current_t); |
if (err != 0) { |
printf("Error writing activation header\n"); |
exit(1); |
} |
break; |
} |
switch (current_t->exec_type) { |
case PAR_EXEC_CONST: |
err = write_exec_const(current_t); |
if (err != 0) { |
printf("Error writing exec header\n"); |
exit(1); |
} |
break; |
case PAR_EXEC_MEAN: |
err = write_exec_mean(current_t); |
if (err != 0) { |
printf("Error writing exec header\n"); |
exit(1); |
} |
break; |
} |
current_t = current_t->next; |
} |
write_basic_par_start(); |
total_task_number = 0; |
current_t = start_loader_task; |
while(current_t != NULL) { |
write_basic_par(current_t); |
current_t = current_t->next; |
total_task_number++; |
} |
close_loader_task(total_task_number); |
write_contract_start(); |
total_contract_number = 0; |
current_c = start_loader_contract; |
while(current_c != NULL) { |
write_contract(current_c); |
current_c = current_c->next; |
total_contract_number++; |
} |
close_loader_contract(total_contract_number); |
write_simulation_time(&total_time); |
return 0; |
} |
*/ |
} |
/demos/tags/rel_1_5_beta1/loader/generators/java/java_gen |
---|
0,0 → 1,10 |
#!/bin/bash |
#if $CLASSPATH; then |
#echo Please define the CLASSPATH environment variable!!! |
#echo ...something like: export CLASSPATH=/usr/java/j2sdk1.4.2/jre/lib |
#exit 1; |
#fi |
java -classpath ".:$CLASSPATH/jdom.jar:$CLASSPATH/xercesImpl.jar:$CLASSPATH/xml-apis.jar" Application $1 |
Property changes: |
Added: svn:executable |
## -0,0 +1 ## |
+* |
\ No newline at end of property |
Index: rel_1_5_beta1/loader/generators/java/makefile |
=================================================================== |
--- rel_1_5_beta1/loader/generators/java/makefile (nonexistent) |
+++ rel_1_5_beta1/loader/generators/java/makefile (revision 1557) |
@@ -0,0 +1,17 @@ |
+ifdef CLASSPATH |
+all: |
+ javac Application.java timespec.java task_class.java -classpath "$(CLASSPATH)/jdom.jar" |
+else |
+all: |
+ @echo ---------------------------------------------------------------- |
+ @echo Please define the CLASSPATH environment variable!!! |
+ @echo ...something like: export CLASSPATH=/usr/java/j2sdk1.4.2/jre/lib |
+ @echo ---------------------------------------------------------------- |
+ @exit 1 |
+endif |
+ |
+ |
+clean: |
+ rm -f *.class |
+ rm -f event.c |
+ |
Index: rel_1_5_beta1/loader/generators/java/fsf-schema.xsd |
=================================================================== |
--- rel_1_5_beta1/loader/generators/java/fsf-schema.xsd (nonexistent) |
+++ rel_1_5_beta1/loader/generators/java/fsf-schema.xsd (revision 1557) |
@@ -0,0 +1,75 @@ |
+<?xml version="1.0" encoding="UTF-8"?> |
+<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'> |
+ |
+<xs:element name="fsf_framework"> |
+ <xs:complexType> |
+ <xs:sequence> |
+ <xs:element ref="simulation"/> |
+ <xs:element ref="contract" minOccurs='1' maxOccurs='unbounded'/> |
+ </xs:sequence> |
+ </xs:complexType> |
+</xs:element> |
+ |
+<xs:element name="simulation"> |
+ <xs:complexType> |
+ <xs:sequence> |
+ <xs:element name="time" type="xs:string"/> |
+ </xs:sequence> |
+ </xs:complexType> |
+</xs:element> |
+ |
+<xs:element name="contract"> |
+ <xs:complexType> |
+ <xs:sequence> |
+ <xs:element name="cmin" type="xs:string"/> |
+ <xs:element name="tmax" type="xs:string" /> |
+ <xs:element name="cmax" type="xs:string" /> |
+ <xs:element name="tmin" type="xs:string" /> |
+ <xs:element name="workload" type="xs:string" /> |
+ <xs:element ref="localscheduler"/> |
+ </xs:sequence> |
+ </xs:complexType> |
+</xs:element> |
+ |
+<xs:element name="localscheduler"> |
+ <xs:complexType> |
+ <xs:sequence> |
+ <xs:element ref="task_section" minOccurs='1' maxOccurs='unbounded'/> |
+ </xs:sequence> |
+ <xs:attribute name="type" type="xs:string" use='required'/> |
+ </xs:complexType> |
+</xs:element> |
+ |
+<xs:element name="task_section"> |
+ <xs:complexType> |
+ <xs:sequence> |
+ <xs:element name="number" type="xs:integer"/> |
+ <xs:element name="dline" type="xs:string" minOccurs="0" /> |
+ <xs:element name="wcet" type="xs:string" minOccurs="0"/> |
+ <xs:element ref="act_section"/> |
+ <xs:element ref="exec_section"/> |
+ </xs:sequence> |
+ <xs:attribute name="type" type="xs:string" use='required'/> |
+ </xs:complexType> |
+</xs:element> |
+ |
+<xs:element name="act_section"> |
+ <xs:complexType> |
+ <xs:sequence> |
+ <xs:element name="start_time" type="xs:string"/> |
+ <xs:element name="period_time" type="xs:string" minOccurs="0" /> |
+ <xs:element name="delta_time" type="xs:string" minOccurs="0" /> |
+ </xs:sequence> |
+ </xs:complexType> |
+</xs:element> |
+ |
+<xs:element name="exec_section"> |
+ <xs:complexType> |
+ <xs:sequence> |
+ <xs:element name="exec_time" type="xs:string"/> |
+ <xs:element name="delta_time" type="xs:string" minOccurs="0" /> |
+ </xs:sequence> |
+ </xs:complexType> |
+</xs:element> |
+ |
+</xs:schema> |
Index: rel_1_5_beta1/loader/generators/java/task_class.java |
=================================================================== |
--- rel_1_5_beta1/loader/generators/java/task_class.java (nonexistent) |
+++ rel_1_5_beta1/loader/generators/java/task_class.java (revision 1557) |
@@ -0,0 +1,26 @@ |
+//package first_filter; |
+ |
+/** |
+ * <p>Title: First XML filter</p> |
+ * <p>Description: </p> |
+ * <p>Copyright: Copyright (c) 2003</p> |
+ * <p>Company: Retis Lab</p> |
+ * @author not attributable |
+ * @version 1.0 |
+ */ |
+ |
+public class task_class { |
+ String name; |
+ int task_type; |
+ int contract; |
+ int localscheduler; |
+ int number; |
+ int group; |
+ timespec deadline; |
+ timespec wcet; |
+ int act_number; |
+ |
+ public task_class() { |
+ } |
+ |
+} |
Index: rel_1_5_beta1/loader/generators/java/timespec.java |
=================================================================== |
--- rel_1_5_beta1/loader/generators/java/timespec.java (nonexistent) |
+++ rel_1_5_beta1/loader/generators/java/timespec.java (revision 1557) |
@@ -0,0 +1,37 @@ |
+//package first_filter; |
+ |
+/** |
+ * <p>Title: First XML filter</p> |
+ * <p>Description: </p> |
+ * <p>Copyright: Copyright (c) 2003</p> |
+ * <p>Company: Retis Lab</p> |
+ * @author not attributable |
+ * @version 1.0 |
+ */ |
+ |
+public class timespec { |
+ long tv_sec; |
+ long tv_nsec; |
+ |
+ public timespec() { |
+ tv_sec=0; |
+ tv_nsec=0; |
+ } |
+ |
+ |
+ void ADDUSEC2TIMESPEC(long t1) { |
+ tv_nsec+=(t1%1000000)*1000; |
+ tv_sec+=(tv_nsec / 1000000000)+(t1/1000000); |
+ tv_nsec%=1000000000; |
+ } |
+ long TIMESPEC2USEC() { |
+ return (tv_sec*1000000+tv_nsec/1000); |
+ } |
+ boolean TIMESPEC_A_GT_B(timespec t1) { |
+ |
+ return (tv_sec>t1.tv_sec || |
+ (tv_sec==t1.tv_sec && tv_nsec>t1.tv_nsec)); |
+ |
+ } |
+ |
+} |
Index: rel_1_5_beta1/loader/generators/makefile |
=================================================================== |
--- rel_1_5_beta1/loader/generators/makefile (nonexistent) |
+++ rel_1_5_beta1/loader/generators/makefile (revision 1557) |
@@ -0,0 +1,9 @@ |
+event_gen: |
+ gcc -o lparser.o -c -Wall lparser.c -I. -I.. |
+ gcc -o lread.o -c -Wall lread.c -I. -I.. |
+ gcc -o event_gen -Wall lparser.o lread.o -I. -I.. -lc event_gen.c |
+ |
+clean: |
+ rm -f *.o |
+ rm -f event_gen |
+ |
Index: rel_1_5_beta1/loader/generators/lread.c |
=================================================================== |
--- rel_1_5_beta1/loader/generators/lread.c (nonexistent) |
+++ rel_1_5_beta1/loader/generators/lread.c (revision 1557) |
@@ -0,0 +1,95 @@ |
+#include <stdio.h> |
+#include <stdlib.h> |
+#include "lparser.h" |
+#include "common/time.h" |
+ |
+int dos_preload(char *file_name, long max_size, void **start_file, void **end_file) |
+{ |
+ FILE *file; |
+ void *buf; |
+ long rd; |
+ |
+ |
+ file = fopen(file_name,"r"); |
+ if (file == NULL) return -1; |
+ |
+ buf = malloc(max_size); |
+ *start_file = buf; |
+ |
+ while(((rd = fread(buf, 1, 2048, file)) == 2048) && |
+ ((buf - *start_file + rd) < (max_size-2048))) { |
+ buf += rd; |
+ } |
+ |
+ *end_file = buf + rd; |
+ |
+ fclose(file); |
+ return(0); |
+ |
+} |
+ |
+int line_reader(void *start_file, void *end_file, struct timespec *total, |
+ struct loader_task **start_loader_task, struct loader_contract **start_loader_contract) |
+{ |
+ |
+ char *pbuf = start_file; |
+ int res,line_num,total_loader_task,total_loader_contract; |
+ struct loader_task *current_t = NULL; |
+ struct loader_contract *current_c = NULL; |
+ |
+ NULL_TIMESPEC(total); |
+ |
+ line_num = 0; |
+ total_loader_task = 0; |
+ total_loader_contract = 0; |
+ |
+ while ((void *)(pbuf) < end_file) { |
+ |
+ line_num++; |
+ |
+ if (*start_loader_contract == NULL) |
+ res = line_parser_contract(&pbuf, line_num, total, ¤t_c); |
+ else |
+ res = line_parser_contract(&pbuf, line_num, total, ¤t_c->next); |
+ |
+ if (res == 2) { |
+ total_loader_contract++; |
+ if (*start_loader_contract == NULL) |
+ *start_loader_contract = current_c; |
+ else |
+ current_c = current_c->next; |
+ } |
+ |
+ if (res == 3) break; |
+ |
+ } |
+ |
+ while ((void *)(pbuf) < end_file) { |
+ |
+ line_num++; |
+ |
+ if (*start_loader_task == NULL) |
+ res = line_parser_task(&pbuf, line_num, ¤t_t); |
+ else |
+ res = line_parser_task(&pbuf, line_num, ¤t_t->next); |
+ |
+ if (res == 2) { |
+ total_loader_task++; |
+ if (*start_loader_task == NULL) |
+ *start_loader_task = current_t; |
+ else |
+ current_t = current_t->next; |
+ } |
+ |
+ if (res == 3) break; |
+ |
+ } |
+ |
+ printf("Total decoded lines %d\n",line_num); |
+ printf("Total loader contract %d\n",total_loader_contract); |
+ printf("Total loader task %d\n",total_loader_task); |
+ printf("Simulation time sec = %ld usec = %ld\n",total->tv_sec,total->tv_nsec/1000); |
+ |
+ return 0; |
+ |
+} |
Index: rel_1_5_beta1/loader/generators/lread.h |
=================================================================== |
--- rel_1_5_beta1/loader/generators/lread.h (nonexistent) |
+++ rel_1_5_beta1/loader/generators/lread.h (revision 1557) |
@@ -0,0 +1,11 @@ |
+#ifndef __LREAD_H__ |
+#define __LREAD_H__ |
+ |
+#include "lparser.h" |
+ |
+int dos_preload(char *file_name, long max_size, void **start, void **end); |
+ |
+int line_reader(void *start, void *end, struct timespec *total, |
+ struct loader_task **start_loader_task, struct loader_contract **start_loader_contract); |
+ |
+#endif |
Index: rel_1_5_beta1/loader/makefile |
=================================================================== |
--- rel_1_5_beta1/loader/makefile (nonexistent) |
+++ rel_1_5_beta1/loader/makefile (revision 1557) |
@@ -0,0 +1,88 @@ |
+# |
+# help can be found in readme.txt |
+# |
+ |
+# ----------------------------------------------------- |
+# |
+# OS dependent variables: |
+ |
+# all the OS dependent variables and dependencies are under $(OS)/makefile.in |
+ |
+# This makefile will execute the dependency os_specific_dep to "fill" |
+# the out directory with OS-specific stuffs; Then, the makefile |
+# generated in the out directory will be executed with $(TEST) as |
+# parameter. |
+ |
+ifndef $(BASE) |
+BASE=../.. |
+endif |
+ |
+include $(BASE)/config/config.mk |
+ |
+ifeq ($(OS),MARTE) |
+OSINCLUDE=marte/makefile.in |
+endif |
+ |
+ifeq ($(OS),SHARK) |
+OSINCLUDE=shark/makefile.in |
+endif |
+ |
+# ----------------------------------------------------- |
+ |
+.PHONY: all clean help |
+ |
+help: |
+ifeq ($(CAT),cat) |
+ cat readme.txt |
+endif |
+ |
+all: out out/common.done out/$(TEST).done os_specific_dep |
+ make -C out $(TEST) |
+ |
+clean: |
+ make -C generators clean |
+ make -C generators/java clean |
+ rm -rf out |
+ |
+out/common.done: |
+ cd out; cp -sf ../common/*.c . |
+ cd out; cp -sf ../common/*.h . |
+ touch out/common.done |
+ |
+# note: the out dependency is present only in the "all" dependency |
+# (there is some strange case with the updating of the out date that I |
+# do not know how to resolve... |
+out: |
+ mkdir out |
+ |
+# ----------------------------------------------------- |
+# |
+# Testcase generation |
+ |
+# .FSF Format |
+# ----------------------- |
+ |
+generators/event_gen: |
+ make -C generators event_gen |
+ |
+out/%.done: loadfile/%.fsf generators/event_gen |
+ cd out; ../generators/event_gen ../loadfile/$(TEST).fsf |
+ touch out/$*.done |
+ |
+# .FSF2 Format |
+# ----------------------- |
+ |
+generators/java/Applicazione.class: |
+ make -C generators/java all |
+ |
+out/%.done: loadfile/%.fsf2 generators/java/Applicazione.class |
+ cd generators/java; ./java_gen ../../loadfile/$(TEST).fsf2; mv event.c ../../out/ |
+ touch out/$*.done |
+ |
+# other file formats |
+# ----------------------- |
+out/%.done: loadfile/%.otherformat |
+ echo Other file formats that are not specified yet... |
+ touch out/$*.done |
+ |
+include $(OSINCLUDE) |
Index: rel_1_5_beta1/loader/readme.txt |
=================================================================== |
--- rel_1_5_beta1/loader/readme.txt (nonexistent) |
+++ rel_1_5_beta1/loader/readme.txt (revision 1557) |
@@ -0,0 +1,64 @@ |
+FIRST Framework Evaluation architecture |
+--------------------------------------- |
+ |
+makefile usage: |
+ |
+$ make OS=<osname> TEST=<demo> all |
+ |
+where: |
+ |
+<osname> is the name of the target operating system and it can be: |
+ |
+- MARTE for MaRTE OS |
+- SHARK for Shark |
+ |
+<demo> is the name of the test case that have to be compiled. The |
+specification of the test case is contained inside the loadfile |
+directory. |
+ |
+Valid extensions for the test case specification files are: |
+.fsf - old script file |
+.fsf2 - XML version |
+(other extensions can be added easily) |
+ |
+For example: |
+ |
+make OS=SHARK TEST=load all |
+ |
+these makefile will: |
+- prepare the out directory with the common files |
+- add the shark initialization files |
+- parse a file loadfile/load.fsf (the file extension is guessed automatically |
+ by the makefile) to produce source code inside out |
+- compile the resulting shark application |
+ |
+------------------------------------------------------------------------- |
+ |
+XML Parser & Java setup |
+ |
+To use the XML parser (file extension .fsf2) you need to properly setup |
+your system, and you need toinstall the following libraries: |
+ |
+- JDOM BETA 9 - http://www.jdom.org |
+- XERCES (Parser SAX with XSD support) - http://xml.apache.org |
+ |
+On my Linux system, after installing the Sun's j2re, |
+I did the following commands (as root): |
+ |
+# mkdir j |
+# cd j |
+# wget http://www.jdom.org/dist/binary/jdom-b9.tar.gz |
+# tar xvzf jdom-b9.tar.gz |
+# cp jdom-b9/build/jdom.jar /usr/java/j2re1.4.1_02/lib/ |
+# wget http://www.apache.org/dist/xml/xerces-j/Xerces-J-bin.2.6.0.tar.gz |
+# tar xvzf Xerces-J-bin.2.6.0.tar.gz |
+# cp ./xerces-2_6_0/xercesImpl.jar /usr/java/j2re1.4.1_02/lib/ |
+# cp ./xerces-2_6_0/xml-apis.jar /usr/java/j2re1.4.1_02/lib/ |
+ |
+then, as user, I did |
+ |
+$ export CLASSPATH=/usr/java/j2re1.4.1_02/lib |
+ |
+Enjoy, |
+ |
+Michael, Giacomo, PJ |
Index: rel_1_5_beta1/loader/marte/makefile.in |
=================================================================== |
--- rel_1_5_beta1/loader/marte/makefile.in (nonexistent) |
+++ rel_1_5_beta1/loader/marte/makefile.in (revision 1557) |
@@ -0,0 +1,7 @@ |
+# |
+# MaRTE OS dependecies |
+# |
+ |
+os_specific_dep: |
+ echo MaRTE dependencies here |
+ |
Index: rel_1_5_beta1/bttvdemo/initfile.c |
=================================================================== |
--- rel_1_5_beta1/bttvdemo/initfile.c (nonexistent) |
+++ rel_1_5_beta1/bttvdemo/initfile.c (revision 1557) |
@@ -0,0 +1,175 @@ |
+/* |
+ * Project: S.Ha.R.K |
+ * |
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it> |
+ * |
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
+ * |
+ * http://www.sssup.it |
+ * http://retis.sssup.it |
+ * http://hartik.sssup.it |
+ */ |
+ |
+#include "kernel/kern.h" |
+#include "edf/edf/edf.h" |
+#include "cbs/cbs/cbs.h" |
+#include "rr/rr/rr.h" |
+#include "dummy/dummy/dummy.h" |
+#include "intdrive/intdrive/intdrive.h" |
+ |
+#include "sem/sem/sem.h" |
+#include "hartport/hartport/hartport.h" |
+ |
+#include <drivers/shark_linuxc26.h> |
+#include <drivers/shark_pci26.h> |
+#include <drivers/shark_input26.h> |
+#include <drivers/shark_keyb26.h> |
+#include <drivers/shark_fb26.h> |
+#include <drivers/shark_i2c26.h> |
+#include <drivers/shark_bttv26.h> |
+#include <drivers/shark_videodev26.h> |
+ |
+#define FRAME_BUFFER_DEVICE 0 |
+#define FRAME_GRABBER_DEVICE 0 |
+ |
+/*+ sysyem tick in us +*/ |
+#define TICK 0 |
+ |
+/*+ RR tick in us +*/ |
+#define RRTICK 10000 |
+ |
+/*+ Interrup Server */ |
+#define INTDRIVE_Q 1000 |
+#define INTDRIVE_T 10000 |
+#define INTDRIVE_FLAG 0 |
+ |
+void call_shutdown_task(void *arg); |
+int device_drivers_init(); |
+int device_drivers_close(); |
+void set_shutdown_task(); |
+TASK shutdown_task_body(void *arg); |
+ |
+PID shutdown_task_PID = -1; |
+ |
+TIME __kernel_register_levels__(void *arg) |
+{ |
+ struct multiboot_info *mb = (struct multiboot_info *)arg; |
+ |
+ INTDRIVE_register_level(INTDRIVE_Q,INTDRIVE_T,INTDRIVE_FLAG); |
+ EDF_register_level(EDF_ENABLE_ALL); |
+ CBS_register_level(CBS_ENABLE_ALL, 1); |
+ RR_register_level(RRTICK, RR_MAIN_YES, mb); |
+ dummy_register_level(); |
+ |
+ SEM_register_module(); |
+ |
+ return TICK; |
+} |
+ |
+TASK __init__(void *arg) |
+{ |
+ struct multiboot_info *mb = (struct multiboot_info *)arg; |
+ |
+ HARTPORT_init(); |
+ |
+ set_shutdown_task(); |
+ |
+ device_drivers_init(); |
+ |
+ sys_atrunlevel(call_shutdown_task, NULL, RUNLEVEL_SHUTDOWN); |
+ |
+ __call_main__(mb); |
+ |
+ return (void *)0; |
+} |
+ |
+void set_shutdown_task() { |
+ |
+ NRT_TASK_MODEL nrt; |
+ |
+ nrt_task_default_model(nrt); |
+ nrt_task_def_system(nrt); |
+ |
+ shutdown_task_PID = task_create("Shutdown Task",shutdown_task_body,&nrt,NULL); |
+ if (shutdown_task_PID == NIL) { |
+ sys_shutdown_message("Error: Cannot create shutdown task\n"); |
+ exit(1); |
+ } |
+ |
+} |
+ |
+int device_drivers_init() { |
+ |
+ int res; |
+ KEYB_PARMS kparms = BASE_KEYB; |
+ |
+ LINUXC26_register_module(); |
+ |
+ PCI26_init(); |
+ |
+ I2C26_init(); |
+ |
+ INPUT26_init(); |
+ |
+ keyb_def_ctrlC(kparms, NULL); |
+ |
+ KEYB26_init(&kparms); |
+ |
+ BTTV26_init(); |
+ |
+ FB26_init(); |
+ |
+ res = FB26_open(FRAME_BUFFER_DEVICE); |
+ if (res) { |
+ cprintf("Error: Cannot open graphical mode\n"); |
+ KEYB26_close(); |
+ INPUT26_close(); |
+ exit(1); |
+ } |
+ |
+ FB26_use_grx(FRAME_BUFFER_DEVICE); |
+ |
+ FB26_setmode(FRAME_BUFFER_DEVICE,"640x480-16"); |
+ |
+ return 0; |
+ |
+} |
+ |
+int device_drivers_close() { |
+ |
+ BTTV26_close(); |
+ |
+ FB26_close(FRAME_BUFFER_DEVICE); |
+ |
+ KEYB26_close(); |
+ |
+ INPUT26_close(); |
+ |
+ return 0; |
+ |
+} |
+ |
+#define SHUTDOWN_TIMEOUT_SEC 3 |
+ |
+void call_shutdown_task(void *arg) |
+{ |
+ struct timespec t; |
+ |
+ sys_gettime(&t); |
+ t.tv_sec += SHUTDOWN_TIMEOUT_SEC; |
+ |
+ /* Emergency timeout to exit from RUNLEVEL_SHUTDOWN */ |
+ kern_event_post(&t,(void *)((void *)sys_abort_shutdown),(void *)0); |
+ |
+ task_activate(shutdown_task_PID); |
+} |
+ |
+TASK shutdown_task_body(void *arg) { |
+ |
+ device_drivers_close(); |
+ |
+ sys_shutdown_message("-- S.Ha.R.K. Closed --\n"); |
+ |
+ return NULL; |
+ |
+} |
Index: rel_1_5_beta1/bttvdemo/bttv.c |
=================================================================== |
--- rel_1_5_beta1/bttvdemo/bttv.c (nonexistent) |
+++ rel_1_5_beta1/bttvdemo/bttv.c (revision 1557) |
@@ -0,0 +1,340 @@ |
+/* |
+ * Project: S.Ha.R.K. |
+ * |
+ * Coordinators: |
+ * Giorgio Buttazzo <giorgio@sssup.it> |
+ * Paolo Gai <pj@gandalf.sssup.it> |
+ * |
+ * Authors : |
+ * Giacomo Guidi <giacomo@gandalf.sssup.it> |
+ * |
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
+ * |
+ * http://www.sssup.it |
+ * http://retis.sssup.it |
+ * http://shark.sssup.it |
+ */ |
+ |
+/* |
+ * Copyright (C) 2003 Giacomo Guidi |
+ * |
+ * 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 "stdlib.h" |
+#include "unistd.h" |
+ |
+#include "drivers/shark_keyb26.h" |
+#include "drivers/shark_videodev26.h" |
+#include "drivers/shark_fb26.h" |
+ |
+#include "tracer.h" |
+ |
+#define WIDTH 640 |
+#define HEIGHT 480 |
+#define BYTES_PP 2 |
+ |
+//#define COLOR |
+//#define MAX_SPEED |
+ |
+#define FRAME_GRABBER_NUMBER 0 |
+ |
+#define FG_PERIOD 40000 //ONLY IF MAX_SPEED IS DISABLED |
+#define FG_WCET 30000 |
+#define FG_W 320 |
+#define FG_H 240 |
+ |
+unsigned int frame_number = 0; |
+ |
+void program_end(void *arg) |
+{ |
+ |
+ exit(0); |
+ |
+} |
+ |
+void elaborate_image(void *imageptr); |
+ |
+void start_frame_grabber(PID elaborate_task_PID, int channel, struct video_buffer *fbuf) { |
+ |
+ struct video_window win; |
+ struct video_channel chan; |
+ struct video_tuner tuner; |
+ struct video_picture vpic; |
+ int res; |
+ |
+ /* Init videodev driver */ |
+ VIDEODEV26_open(FRAME_GRABBER_NUMBER); |
+ |
+ /* Select the input channel */ |
+ res = VIDEODEV26_ioctl(FRAME_GRABBER_NUMBER,VIDIOCGCHAN,(unsigned long)&chan); |
+ //cprintf("res = %d\n",res); |
+ |
+ chan.channel = channel; |
+ chan.type = VIDEO_VC_TUNER; |
+ chan.norm = VIDEO_TYPE_CAMERA; |
+ |
+ res = VIDEODEV26_ioctl(FRAME_GRABBER_NUMBER,VIDIOCSCHAN,(unsigned long)&chan); |
+ //cprintf("res = %d\n",res); |
+ |
+ /* Enable the tuner */ |
+ |
+ tuner.tuner = 0; |
+ tuner.mode = VIDEO_MODE_PAL; |
+ |
+ res = VIDEODEV26_ioctl(FRAME_GRABBER_NUMBER,VIDIOCSTUNER,(unsigned long)&tuner); |
+ //cprintf("res = %d\n",res); |
+ |
+ /* Select palette and depth */ |
+ res = VIDEODEV26_ioctl(FRAME_GRABBER_NUMBER,VIDIOCGPICT,(unsigned long)&vpic); |
+ //cprintf("res = %d\n",res); |
+ |
+ #ifdef COLOR |
+ vpic.palette = VIDEO_PALETTE_RGB24; |
+ vpic.depth = 24; |
+ #else |
+ vpic.palette = VIDEO_PALETTE_GREY; |
+ vpic.depth = 8; |
+ #endif |
+ |
+ vpic.brightness = 35000; |
+ vpic.hue = 32000; |
+ vpic.contrast = 32000; |
+ vpic.colour = 32000; |
+ |
+ res = VIDEODEV26_ioctl(FRAME_GRABBER_NUMBER,VIDIOCSPICT,(unsigned long)&vpic); |
+ //cprintf("res = %d\n",res); |
+ |
+ res = VIDEODEV26_ioctl(FRAME_GRABBER_NUMBER,VIDIOCGWIN,(unsigned long)&win); |
+ //cprintf("res = %d\n",res); |
+ |
+ win.x = 0; |
+ win.y = 0; |
+ win.width = FG_W; |
+ win.height = FG_H; |
+ |
+ res = VIDEODEV26_ioctl(FRAME_GRABBER_NUMBER,VIDIOCSWIN,(unsigned long)&win); |
+ //cprintf("res = %d\n",res); |
+ |
+ /* Set the buffer */ |
+ res = VIDEODEV26_ioctl(FRAME_GRABBER_NUMBER,VIDIOCSFBUF,(unsigned long)(fbuf)); |
+ //cprintf("res = %d\n",res); |
+ |
+ /* IMPORTANT: Set the aperiodic elaboration task |
+ * This is a SHARK change on VIDIOCSYNC. When the |
+ * new frame is ready, the task elaborate_task_PID |
+ * is activated. Elabortate_task must be aperiodic !! |
+ * To link the task to BTTV use this function: */ |
+ |
+ VIDEODEV26_ioctl(FRAME_GRABBER_NUMBER,VIDIOCSYNC,(unsigned long)(elaborate_task_PID)); |
+ |
+} |
+ |
+/* Check if the frame grabber is ready */ |
+volatile int ready_to_grab = 1; |
+ |
+void grab_command(void *arg) { |
+ |
+ SYS_FLAGS f; |
+ |
+ f = kern_fsave(); |
+ |
+ int on = 1; |
+ VIDEODEV26_ioctl(FRAME_GRABBER_NUMBER,VIDIOCCAPTURE,(unsigned long)&on); |
+ |
+ kern_frestore(f); |
+ |
+} |
+ |
+/* Elaboration task, it is called when the frame |
+ grabber buffer is ready */ |
+TASK elaborate_task(void *arg) { |
+ |
+ struct video_buffer *fbuf = (struct video_buffer *)(arg); |
+ char txt[100]; |
+ |
+ while(1) { |
+ |
+ elaborate_image(fbuf->base); |
+ //cprintf("E"); |
+ |
+ //Text version |
+ //printf_xy(1,20,WHITE,"%08x", |
+ // *(unsigned int *)(fbuf->base+50*320*3+50*3)); |
+ |
+ frame_number++; |
+ sprintf(txt,"Elapsed Time = %u us Frame = %u",(int)(sys_gettime(NULL)),frame_number); |
+ grx_text(txt, 10, 250, rgb16(255,255,255), 0); |
+ |
+ ready_to_grab = 1; |
+ |
+ #ifdef MAX_SPEED |
+ grab_command(NULL); |
+ #endif |
+ |
+ task_testcancel(); |
+ task_endcycle(); |
+ |
+ } |
+ |
+ return NULL; |
+ |
+} |
+ |
+/* Send the grab command */ |
+TASK grab_task(void *arg) { |
+ |
+ while(1) { |
+ |
+ if (ready_to_grab) { |
+ |
+ /* Grab */ |
+ grab_command(NULL); |
+ |
+ //cprintf("G"); |
+ |
+ ready_to_grab = 0; |
+ |
+ } else { |
+ |
+ //cprintf("S"); |
+ /* Frame skipped */ |
+ |
+ } |
+ |
+ task_testcancel(); |
+ task_endcycle(); |
+ |
+ } |
+ |
+ return NULL; |
+ |
+} |
+ |
+extern void *video_memory; |
+ |
+void elaborate_image(void *imageptr) |
+{ |
+ |
+ WORD x,y; |
+ BYTE *col; |
+ |
+ #ifdef COLOR |
+ |
+ for(y = 0; y < FG_H; y++) |
+ for(x = 0; x < FG_W; x++) { |
+ |
+ col = (BYTE *)(imageptr + y * FG_W * 3 + x * 3); |
+ *(WORD *)(video_memory + y*(WIDTH*2) + (x*2)) = (WORD)rgb16(*(BYTE *)(col+2),*(BYTE *)(col+1),*(BYTE *)(col+0)); |
+ |
+ } |
+ |
+ #else |
+ |
+ for(y = 0; y < FG_H; y++) |
+ for(x = 0; x < FG_W; x++) { |
+ |
+ col = (BYTE *)(imageptr + y * FG_W + x); |
+ *(WORD *)(video_memory + y*(WIDTH*2) + (x*2)) = (WORD)rgb16(*(BYTE *)(col),*(BYTE *)(col),*(BYTE *)(col)); |
+ |
+ } |
+ |
+ #endif |
+ |
+} |
+ |
+int main(int argc, char **argv) |
+{ |
+ |
+ HARD_TASK_MODEL gt; |
+ SOFT_TASK_MODEL et; |
+ PID grab_task_pid,elaborate_task_pid; |
+ |
+ struct video_buffer fbuf; |
+ int channel = 0; |
+ |
+ if (argc < 2) { |
+ sys_shutdown_message("ERROR: Enter the input channel [ex> %s 0]\n",argv[0]); |
+ exit(1); |
+ } |
+ |
+ channel = atoi(argv[1]); |
+ |
+ soft_task_default_model(et); |
+ soft_task_def_period(et,FG_PERIOD); |
+ soft_task_def_arg(et,(void *)(&fbuf)); |
+ soft_task_def_met(et,FG_WCET); |
+ soft_task_def_aperiodic(et); |
+ soft_task_def_ctrl_jet(et); |
+ |
+ hard_task_default_model(gt); |
+ hard_task_def_mit(gt,FG_PERIOD); |
+ hard_task_def_wcet(gt,5000); |
+ hard_task_def_ctrl_jet(gt); |
+ |
+ grab_task_pid = task_create("GrabTask",grab_task,>,NULL); |
+ if (grab_task_pid == NIL) { |
+ sys_shutdown_message("ERROR: Cannot create grab task\n"); |
+ exit(1); |
+ } |
+ |
+ elaborate_task_pid = task_create("ElaborateTask",elaborate_task,&et,NULL); |
+ if (grab_task_pid == NIL) { |
+ sys_shutdown_message("ERROR: Cannot create elaborate task\n"); |
+ exit(1); |
+ } |
+ |
+ #ifdef COLOR |
+ |
+ fbuf.base = malloc(FG_W*FG_H*3); |
+ fbuf.height = FG_H; |
+ fbuf.width = FG_W; |
+ fbuf.bytesperline = FG_W*3; |
+ fbuf.depth = 24; |
+ |
+ #else |
+ |
+ fbuf.base = malloc(FG_W*FG_H); |
+ fbuf.height = FG_H; |
+ fbuf.width = FG_W; |
+ fbuf.bytesperline = FG_W; |
+ fbuf.depth = 8; |
+ |
+ #endif |
+ |
+ start_frame_grabber(elaborate_task_pid,channel,&fbuf); |
+ |
+ #ifndef MAX_SPEED |
+ /* Activate periodic grabbing */ |
+ task_activate(grab_task_pid); |
+ #else |
+ /* Grab */ |
+ grab_command(NULL); |
+ #endif |
+ |
+ while(keyb_getch(BLOCK) != ESC); |
+ |
+ #ifndef MAX_SPEED |
+ task_kill(grab_task_pid); |
+ #endif |
+ |
+ sleep(1); |
+ |
+ exit(1); |
+ |
+ return 0; |
+ |
+} |
Index: rel_1_5_beta1/bttvdemo/readme.txt |
=================================================================== |
--- rel_1_5_beta1/bttvdemo/readme.txt (nonexistent) |
+++ rel_1_5_beta1/bttvdemo/readme.txt (revision 1557) |
@@ -0,0 +1,31 @@ |
+-------------------------------------- |
+BTTV Frame Grabber Demo |
+ |
+by |
+ |
+Giacomo Guidi <giacomo@gandalf.sssup.it> |
+ |
+Last update 12/05/2004 |
+-------------------------------------- |
+Ex: |
+ |
+x bttv [channel number] |
+ |
+if the channel is not specified 0 is taken. |
+If you don't see a grabbed image, you |
+can try to set a channel number from 0 to 4. |
+ |
+This is a simple demo for the BTTV driver. |
+It starts the frame grabber at 25 fps 320x200. |
+ |
+-------------------------------------- |
+ |
+The demo is composed by: |
+ |
+MAKEFILE The makefile used to compile the application |
+README.TXT This file |
+INITFILE.C The init file |
+BTTV.C The BTTV Demo |
+ |
+-------------------------------------- |
+ |
Index: rel_1_5_beta1/bttvdemo/makefile |
=================================================================== |
--- rel_1_5_beta1/bttvdemo/makefile (nonexistent) |
+++ rel_1_5_beta1/bttvdemo/makefile (revision 1557) |
@@ -0,0 +1,16 @@ |
+# |
+# |
+# |
+ |
+ifndef BASE |
+BASE=../.. |
+endif |
+include $(BASE)/config/config.mk |
+ |
+PROGS = bttv |
+ |
+include $(BASE)/config/example.mk |
+ |
+bttv: |
+ make -f $(SUBMAKE) APP=bttv INIT= OTHEROBJS="initfile.o" OTHERINCL= SHARKOPT="__LINUXC26__ __PCI__ __INPUT__ __FB__ __I2C__ __BTTV__" |
+ |
Index: rel_1_5_beta1/bca/initfile.c |
=================================================================== |
--- rel_1_5_beta1/bca/initfile.c (nonexistent) |
+++ rel_1_5_beta1/bca/initfile.c (revision 1557) |
@@ -0,0 +1,228 @@ |
+/* |
+ * Project: S.Ha.R.K. |
+ * |
+ * Coordinators: |
+ * Giorgio Buttazzo <giorgio@sssup.it> |
+ * Paolo Gai <pj@gandalf.sssup.it> |
+ * |
+ * Authors : |
+ * Giacomo Guidi <giacomo@gandalf.sssup.it> |
+ * (see the web pages for full authors list) |
+ * |
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
+ * |
+ * http://www.sssup.it |
+ * http://retis.sssup.it |
+ * http://shark.sssup.it |
+ */ |
+ |
+/* |
+ * 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 |
+ * |
+ */ |
+ |
+#define PI_MUTEX |
+ |
+#include "kernel/kern.h" |
+#include "intdrive/intdrive/intdrive.h" |
+#include "edf/edf/edf.h" |
+#include "hardcbs/hardcbs/hardcbs.h" |
+#include "rr/rr/rr.h" |
+#include "dummy/dummy/dummy.h" |
+ |
+#include "sem/sem/sem.h" |
+#include "hartport/hartport/hartport.h" |
+#include "cabs/cabs/cabs.h" |
+ |
+#include "pi/pi/pi.h" |
+#include "nop/nop/nop.h" |
+ |
+#include "bca.h" |
+ |
+#include <drivers/shark_linuxc26.h> |
+#include <drivers/shark_pci26.h> |
+#include <drivers/shark_input26.h> |
+#include <drivers/shark_keyb26.h> |
+#include <drivers/shark_fb26.h> |
+ |
+#define FRAME_BUFFER_DEVICE 0 |
+ |
+/*+ sysyem tick in us +*/ |
+#define TICK 0 |
+ |
+/*+ RR tick in us +*/ |
+#define RRTICK 2000 |
+ |
+/*+ Interrupt Server +*/ |
+#define INTDRIVE_Q 1000 |
+#define INTDRIVE_T 10000 |
+#define INTDRIVE_FLAG 0 |
+ |
+void call_shutdown_task(void *arg); |
+int device_drivers_init(); |
+int device_drivers_close(); |
+void set_shutdown_task(); |
+TASK shutdown_task_body(void *arg); |
+ |
+PID shutdown_task_PID = -1; |
+ |
+TIME __kernel_register_levels__(void *arg) |
+{ |
+ struct multiboot_info *mb = (struct multiboot_info *)arg; |
+ |
+ INTDRIVE_register_level(INTDRIVE_Q,INTDRIVE_T,INTDRIVE_FLAG); |
+ EDF_register_level(EDF_ENABLE_ALL); |
+ HCBS_register_level(HCBS_ENABLE_ALL, 1); |
+ RR_register_level(RRTICK, RR_MAIN_YES, mb); |
+ dummy_register_level(); |
+ |
+ SEM_register_module(); |
+ CABS_register_module(); |
+ |
+ PI_register_module(); |
+ NOP_register_module(); |
+ |
+ kern_init_bca(); |
+ |
+ return TICK; |
+} |
+ |
+TASK __init__(void *arg) |
+{ |
+ struct multiboot_info *mb = (struct multiboot_info *)arg; |
+ |
+ HARTPORT_init(); |
+ |
+ /* Create the shutdown task. It will be activated at RUNLEVEL |
+ SHUTDOWN */ |
+ set_shutdown_task(); |
+ |
+ /* Init the drivers */ |
+ device_drivers_init(); |
+ |
+ /* Set the shutdown task activation */ |
+ sys_atrunlevel(call_shutdown_task, NULL, RUNLEVEL_SHUTDOWN); |
+ |
+ __call_main__(mb); |
+ |
+ return (void *)0; |
+} |
+ |
+#ifdef PI_MUTEX |
+int app_mutex_init(mutex_t *m) |
+{ |
+ PI_mutexattr_t attr; |
+ |
+ PI_mutexattr_default(attr); |
+ |
+ return mutex_init(m, &attr); |
+} |
+#else |
+int app_mutex_init(mutex_t *m) |
+{ |
+ NOP_mutexattr_t attr; |
+ |
+ NOP_mutexattr_default(attr); |
+ |
+ return mutex_init(m, &attr); |
+} |
+#endif |
+ |
+void set_shutdown_task() { |
+ |
+ /* WARNING: the shutdown task is a background thread. It cannot execute |
+ if the system is overloaded */ |
+ NRT_TASK_MODEL nrt; |
+ |
+ nrt_task_default_model(nrt); |
+ nrt_task_def_system(nrt); |
+ |
+ shutdown_task_PID = task_create("Shutdown Task",shutdown_task_body,&nrt,NULL); |
+ if (shutdown_task_PID == NIL) { |
+ sys_shutdown_message("Error: Cannot create shutdown task\n"); |
+ exit(1); |
+ } |
+ |
+} |
+ |
+int device_drivers_init() { |
+ |
+ int res; |
+ KEYB_PARMS kparms = BASE_KEYB; |
+ |
+ LINUXC26_register_module(); |
+ |
+ PCI26_init(); |
+ |
+ INPUT26_init(); |
+ |
+ keyb_def_ctrlC(kparms, NULL); |
+ |
+ KEYB26_init(&kparms); |
+ |
+ FB26_init(); |
+ |
+ res = FB26_open(FRAME_BUFFER_DEVICE); |
+ if (res) { |
+ cprintf("Error: Cannot open graphical mode\n"); |
+ KEYB26_close(); |
+ INPUT26_close(); |
+ exit(1); |
+ } |
+ |
+ FB26_use_grx(FRAME_BUFFER_DEVICE); |
+ |
+ FB26_setmode(FRAME_BUFFER_DEVICE,"800x600-16"); |
+ |
+ return 0; |
+ |
+} |
+ |
+int device_drivers_close() { |
+ |
+ FB26_close(FRAME_BUFFER_DEVICE); |
+ |
+ KEYB26_close(); |
+ |
+ INPUT26_close(); |
+ |
+ return 0; |
+ |
+} |
+ |
+#define SHUTDOWN_TIMEOUT_SEC 3 |
+ |
+void call_shutdown_task(void *arg) |
+{ |
+ struct timespec t; |
+ |
+ sys_gettime(&t); |
+ t.tv_sec += SHUTDOWN_TIMEOUT_SEC; |
+ |
+ /* Emergency timeout to exit from RUNLEVEL_SHUTDOWN */ |
+ kern_event_post(&t,(void *)((void *)sys_abort_shutdown),(void *)0); |
+ |
+ task_activate(shutdown_task_PID); |
+} |
+ |
+TASK shutdown_task_body(void *arg) { |
+ |
+ device_drivers_close(); |
+ |
+ sys_shutdown_message("-- S.Ha.R.K. Closed --\n"); |
+ |
+ return NULL; |
+ |
+} |
Index: rel_1_5_beta1/bca/fab_lib.c |
=================================================================== |
--- rel_1_5_beta1/bca/fab_lib.c (nonexistent) |
+++ rel_1_5_beta1/bca/fab_lib.c (revision 1557) |
@@ -0,0 +1,424 @@ |
+/* |
+ * Project: S.Ha.R.K. |
+ * |
+ * Coordinators: |
+ * Giorgio Buttazzo <giorgio@sssup.it> |
+ * Paolo Gai <pj@gandalf.sssup.it> |
+ * |
+ * Authors : |
+ * Paolo Gai <pj@gandalf.sssup.it> |
+ * Massimiliano Giorgi <massy@gandalf.sssup.it> |
+ * Luca Abeni <luca@gandalf.sssup.it> |
+ * (see the web pages for full authors list) |
+ * |
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
+ * |
+ * http://www.sssup.it |
+ * http://retis.sssup.it |
+ * http://shark.sssup.it |
+ */ |
+ |
+/* CVS : $Id: fab_lib.c,v 1.5 2005-01-08 14:34:28 pj Exp $ */ |
+ |
+/* |
+ * Copyright (C) 2000 Fabio Calabrese <fabiocalabrese77@yahoo.it> |
+ * |
+ * 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 |
+ * |
+ */ |
+ |
+/**************************************************** |
+ * * |
+ * file: FAB_lib.c * |
+ * libreria: FAB_LIB * |
+ * version: 1.0 25/08/2002 * |
+ * creato da: Fabio CALABRESE * |
+ * * |
+ ****************************************************/ |
+ |
+#ifndef __FAB_LIB_c__ |
+#define __FAB_LIB_c__ |
+//-------------------BEGIN--------------------------- |
+ |
+// *** Librerie di S.Ha.R.K. *** |
+#include<kernel/kern.h> |
+#include<kernel/mem.h> |
+ |
+#include<drivers/shark_fb26.h> |
+ |
+#include<ll/sys/types.h> |
+#include<ll/i386/x-dos.h> |
+// *** Librerie Standard C *** |
+// *** Librerie FAB *** |
+#include"fab_lib/fab_msg.h" |
+#include"fab_lib/fab_tool.h" |
+#include"fab_lib/fab_grx.h" |
+ |
+// *** Corpo delle funzioni in FAB_msg.h *** // |
+ |
+void FAB_print(char * InitMsg, char * msg) |
+{ if (InitMsg!=NULL) {kern_printf("\n[%s]",(InitMsg));} |
+ if (msg!=NULL) {kern_printf("\n %s.",msg);} |
+} |
+void __FAB_go(int test, char * OkMsg, char * ErrorMsg,int EXITflag) |
+{ |
+ if (OkMsg==NULL) OkMsg=FAB_EMPTY_MSG; |
+ if (ErrorMsg==NULL) ErrorMsg=FAB_EMPTY_MSG; |
+ |
+ if (!test) {kern_printf("\n OK: %s.",OkMsg);} |
+ else {kern_printf("\n ERROR: %s!",ErrorMsg); |
+ if (EXITflag==FAB_EXIT_YES) exit(0); |
+ } |
+} |
+ |
+// *** Corpo delle funzioni in FAB_tool.h *** // |
+ |
+// nessun corpo! |
+ |
+// *** Corpo delle funzioni in FAB_show.h *** // |
+ |
+void FAB_show_sched_modules() |
+{ //int i; |
+ |
+ FAB_print("MODULI DI SCHEDULAZIONE",NULL); |
+ kern_printf("\n (livello) (nome)"); |
+ kern_printf("Names non more available!"); |
+ //for (i=0; i<sched_levels; i++) |
+ // {kern_printf("\n %-9d %s",i,(level_table[i])->level_name); |
+ // } |
+ FAB_newline(); |
+} |
+ |
+// *** Corpo delle funzioni in FAB_grx.h *** |
+ |
+FAB_BALLFRAME* FAB_ballframe_alloc() |
+{ FAB_BALLFRAME* frame; |
+ |
+ frame=(FAB_BALLFRAME*)kern_alloc(sizeof(FAB_BALLFRAME)); |
+ if (frame==NULL) { |
+ FAB_print(NULL,"BALLFRAME CREATING... ERROR #1"); |
+ return NULL; |
+ } |
+ return frame; |
+} |
+void FAB_ballframe_free(FAB_BALLFRAME * frame) |
+{ if (frame!=NULL) |
+ { kern_free(frame,sizeof(FAB_BALLFRAME)); |
+ } |
+} |
+ |
+FAB_FRAME* FAB_frame_alloc() |
+{ FAB_FRAME* frame; |
+ |
+ frame=(FAB_FRAME*)kern_alloc(sizeof(FAB_FRAME)); |
+ if (frame==NULL) { |
+ FAB_print(NULL,"FRAME CREATING... ERROR #1"); |
+ return NULL; |
+ } |
+ |
+ return frame; |
+} |
+void FAB_frame_free(FAB_FRAME * frame) |
+{ if (frame!=NULL) |
+ { kern_free(frame,sizeof(FAB_FRAME)); |
+ } |
+} |
+void FAB_ballborder_put(FAB_BORDER* border, WORD cx, WORD cy, WORD r_int) |
+{ int i; |
+ |
+ for (i=0; i<border->dim; i++) |
+ grx_circle(cx, cy, r_int+i, border->buf[i]); |
+} |
+void FAB_border_put(FAB_BORDER* border, WORD x0, WORD y0, WORD x1, WORD y1) |
+{ int i; |
+ |
+ for (i=0; i<border->dim; i++) |
+ grx_rect(x0-i, y0-i, x1+i, y1+i, border->buf[i]); |
+} |
+FAB_BORDER* FAB_border_alloc(WORD dim) |
+{ FAB_BORDER* border; |
+ |
+ border=(FAB_BORDER*)kern_alloc(sizeof(FAB_BORDER)); |
+ if (border==NULL) { |
+ FAB_print(NULL,"BORDER CREATING... ERROR #1"); |
+ return NULL; |
+ } |
+ |
+ border->buf=(COLOR*)kern_alloc(dim*sizeof(COLOR)); |
+ if (border->buf==NULL) { |
+ FAB_print(NULL,"BORDER CREATING... ERROR #2"); |
+ return NULL; |
+ } |
+ |
+ border->dim = dim; |
+ |
+ return border; |
+} |
+void FAB_border_free(FAB_BORDER * border) |
+{ if (border!=NULL) |
+ { kern_free(border->buf,border->dim*sizeof(COLOR)); |
+ kern_free(border,sizeof(FAB_BORDER)); |
+ } |
+} |
+void FAB_image_free(FAB_IMAGE* image) |
+{ if (image!=NULL) |
+ { kern_free(image->buf,image->lx*image->ly*sizeof(COLOR)); |
+ kern_free(image,sizeof(FAB_IMAGE)); |
+ } |
+} |
+FAB_IMAGE* FAB_image_alloc(WORD lx, WORD ly) |
+{ FAB_IMAGE* image; |
+ |
+ image=(FAB_IMAGE*)kern_alloc(sizeof(FAB_IMAGE)); |
+ if (image==NULL) { |
+ FAB_print(NULL,"IMAGE CREATING... ERROR #1"); |
+ return NULL; |
+ } |
+ |
+ image->buf=(COLOR*)kern_alloc(lx*ly*sizeof(COLOR)); |
+ if (image->buf==NULL) { |
+ FAB_print(NULL,"IMAGE CREATING... ERROR #2"); |
+ return NULL; |
+ } |
+ FAB_image_no_trasparent_set(image); |
+ image->lx = lx; |
+ image->ly = ly; |
+ |
+ return image; |
+} |
+int FAB_image_load(FAB_IMAGE* image, char* file_name) |
+{ |
+ DOS_FILE* file; |
+ BYTE rgb[3]; |
+ COLOR * buf; |
+ int i; |
+ |
+ file=DOS_fopen(file_name,"r"); |
+ if (file==NULL) return -1; |
+ |
+ buf = image->buf; |
+ for (i=0; i<image->lx*image->ly; i++) |
+ { DOS_fread(&rgb[0],sizeof(BYTE),3,file); |
+ *buf = FAB_rgb(rgb[0],rgb[1],rgb[2]); |
+ buf++; |
+ } |
+ |
+ DOS_fclose(file); |
+ return(0); |
+} |
+void FAB_image_get(FAB_IMAGE* image, WORD x0, WORD y0, WORD lx, WORD ly) |
+{ WORD x, y; |
+ COLOR* buf; |
+ |
+ buf = image->buf; |
+ for (y=0; y<image->ly; y++) |
+ for (x=0; x<image->lx; x++) { |
+ *buf = (COLOR) grx_getpixel(x0+x,y0+y); |
+ buf++; |
+ } |
+ FAB_image_no_trasparent_set(image); |
+} |
+void FAB_image_put(FAB_IMAGE* image, WORD x0, WORD y0) |
+{ WORD x, y; |
+ COLOR* buf; |
+ |
+ buf = image->buf; |
+ if (!image->trasparent) { |
+ for (y=0; y<image->ly; y++) |
+ for (x=0; x<image->lx; x++) |
+ grx_plot(x0+x,y0+y,*buf++); |
+ } |
+ else { |
+ for (y=0; y<image->ly; y++) |
+ for (x=0; x<image->lx; x++) { |
+ if (*buf!=image->trasparent_col) |
+ grx_plot(x0+x,y0+y,*buf); |
+ buf++; |
+ } |
+ } |
+} |
+void FAB_image_put_within(FAB_IMAGE* image, WORD x0, WORD y0, |
+ WORD xx0, WORD yy0, WORD xx1, WORD yy1) |
+{ int step_x0_xx0; |
+ int step_y0_yy0; |
+ int step_xx1_x1; |
+ int step_yy1_y1; |
+ WORD xx, yy; |
+ COLOR* buf; |
+ |
+ step_x0_xx0 = xx0 - x0; |
+ step_y0_yy0 = yy0 - y0; |
+ step_xx1_x1 = (x0 + image->lx - 1) - xx1; |
+ step_yy1_y1 = (y0 + image->ly - 1) - yy1; |
+ |
+ if (step_x0_xx0 < 0) step_x0_xx0 = 0; |
+ if (step_y0_yy0 < 0) step_y0_yy0 = 0; |
+ if (step_xx1_x1 < 0) step_xx1_x1 = 0; |
+ if (step_yy1_y1 < 0) step_yy1_y1 = 0; |
+ |
+ buf = image->buf + step_y0_yy0*image->lx; |
+ if (!image->trasparent) { |
+ for(yy=step_y0_yy0; yy<image->ly-step_yy1_y1; yy++) { |
+ buf += step_x0_xx0; |
+ for(xx=step_x0_xx0; xx<image->lx-step_xx1_x1; xx++) |
+ grx_plot(x0+xx,y0+yy,*buf++); |
+ buf += step_xx1_x1; |
+ } |
+ } |
+ else { |
+ for(yy=step_y0_yy0; yy<image->ly-step_yy1_y1; yy++) { |
+ buf += step_x0_xx0; |
+ for(xx=step_x0_xx0; xx<image->lx-step_xx1_x1; xx++) { |
+ if (*buf!=image->trasparent_col) |
+ grx_plot(x0+xx,y0+yy,*buf); |
+ buf++; |
+ } |
+ buf += step_xx1_x1; |
+ } |
+ } |
+} |
+//...funzione usata da FAB_image_fill()... |
+void __FAB_image_put_into(FAB_IMAGE* image, WORD x0, WORD y0, WORD lx, WORD ly) |
+{ WORD x, y; |
+ WORD skipped_pixels; |
+ COLOR* buf; |
+ |
+ if (lx < image->lx) skipped_pixels = image->lx - lx; |
+ else skipped_pixels = 0; |
+ buf = image->buf; |
+ |
+ if (!image->trasparent) { |
+ for (y=0; y<ly; y++, buf+=skipped_pixels) { |
+ if (y > image->ly -1) break; |
+ for (x=0; x<lx; x++, buf++) { |
+ if (x < image->lx) grx_plot(x0+x,y0+y,*buf); |
+ else break; |
+ } |
+ } |
+ } |
+ else { |
+ for (y=0; y<ly; y++, buf+=skipped_pixels) { |
+ if (y > image->ly -1) break; |
+ for (x=0; x<lx; x++, buf++) { |
+ if (x < image->lx) { |
+ if (*buf!=image->trasparent_col) |
+ grx_plot(x0+x,y0+y,*buf); |
+ } |
+ else break; |
+ } |
+ } |
+ } |
+} |
+void FAB_image_fill(FAB_IMAGE* image, WORD x0, WORD y0, WORD lx, WORD ly) |
+{ WORD x, y; |
+ WORD sub_lx, sub_ly; |
+ |
+ for (y=0; y<ly; y+=image->ly) { |
+ sub_ly = ly - y; // spazio verticale disponibile |
+ if (sub_ly > image->ly) sub_ly = image->ly; |
+ for (x=0; x<lx; x+=image->lx) { |
+ sub_lx = lx - x; // spazio orizzontale disponibile |
+ if (sub_lx > image->lx) sub_lx = image->lx; |
+ __FAB_image_put_into(image,x0+x,y0+y,sub_lx,sub_ly); |
+ } |
+ } |
+} |
+void FAB_frame_put(FAB_FRAME* frame, WORD x0, WORD y0, WORD lx, WORD ly) |
+{ |
+ WORD eff_dim; |
+ int j; |
+ |
+ //BORDO DEL FRAME |
+ if (frame->border!=NULL) eff_dim = frame->border->dim; |
+ else eff_dim = frame->border_dim; |
+ frame->x0 = x0 + eff_dim; |
+ frame->y0 = y0 + eff_dim; |
+ frame->x1 = x0 + lx - eff_dim - 1; |
+ frame->y1 = y0 + ly - eff_dim - 1; |
+ if (frame->border!=NULL) { |
+ FAB_border_put(frame->border, frame->x0-1, frame->y0-1, |
+ frame->x1+1, frame->y1+1); |
+ } |
+ else { |
+ for (j=0; j<eff_dim; j++) |
+ grx_rect(frame->x0-1-j, frame->y0-1-j, |
+ frame->x1+1+j, frame->y1+1+j, frame->border_col); |
+ } |
+ |
+ //PANNELLO DEL FRAME |
+ if (!frame->trasparent) { |
+ if (frame->image==NULL) grx_box(frame->x0, frame->y0, |
+ frame->x1, frame->y1, frame->color); |
+ else FAB_image_fill(frame->image, |
+ frame->x0, frame->y0, |
+ lx-eff_dim*2, ly-eff_dim*2); |
+ } |
+} |
+ |
+void FAB_ballframe_put(FAB_BALLFRAME* frame, WORD cx, WORD cy, WORD r) |
+{ |
+ int j; |
+ WORD eff_dim; |
+ |
+ //BORDO DEL FRAME |
+ if (frame->border!=NULL) eff_dim = frame->border->dim; |
+ else eff_dim = frame->border_dim; |
+ frame->cx = cx; |
+ frame->cy = cy; |
+ frame->r = r - eff_dim; |
+ |
+ if (frame->border!=NULL) { |
+ FAB_ballborder_put(frame->border,frame->cx,frame->cy,frame->r+1); |
+ } |
+ else { |
+ for (j=0; j<eff_dim; j++) |
+ grx_circle(frame->cx,frame->cy,frame->r+1+j,frame->border_col); |
+ } |
+ |
+ //PANNELLO DEL FRAME |
+ if (!frame->trasparent) { |
+ grx_disc(frame->cx,frame->cy,frame->r,frame->color); |
+ } |
+} |
+ |
+void FAB_image_copy(FAB_IMAGE* orig_image, FAB_IMAGE* dest_image) |
+{ |
+ COLOR* orig_buf; |
+ COLOR* dest_buf; |
+ int j,n; |
+ |
+ n = orig_image->lx * orig_image->ly; |
+ if (n==(dest_image->lx * dest_image->ly)) { |
+ orig_buf = orig_image->buf; |
+ dest_buf = dest_image->buf; |
+ for(j=0; j<n; j++) { |
+ *dest_buf = *orig_buf; |
+ orig_buf++; |
+ dest_buf++; |
+ } |
+ } |
+} |
+void FAB_image_color_change(FAB_IMAGE* image, COLOR old_col, COLOR new_col) |
+{ COLOR* buf; |
+ int j,n; |
+ |
+ buf = image->buf; |
+ n = image->lx * image->ly; |
+ for(j=0; j<n; j++, buf++) |
+ if (*buf==old_col) |
+ *buf=new_col; |
+} |
+//----------------------END-------------------------- |
+#endif |
Index: rel_1_5_beta1/bca/bca.c |
=================================================================== |
--- rel_1_5_beta1/bca/bca.c (nonexistent) |
+++ rel_1_5_beta1/bca/bca.c (revision 1557) |
@@ -0,0 +1,203 @@ |
+/* |
+ * Project: S.Ha.R.K. |
+ * |
+ * Coordinators: |
+ * Giorgio Buttazzo <giorgio@sssup.it> |
+ * Paolo Gai <pj@gandalf.sssup.it> |
+ * |
+ * Authors : |
+ * Paolo Gai <pj@gandalf.sssup.it> |
+ * Massimiliano Giorgi <massy@gandalf.sssup.it> |
+ * Luca Abeni <luca@gandalf.sssup.it> |
+ * (see the web pages for full authors list) |
+ * |
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
+ * |
+ * http://www.sssup.it |
+ * http://retis.sssup.it |
+ * http://shark.sssup.it |
+ */ |
+ |
+/* CVS : $Id: bca.c,v 1.6 2005-01-08 14:34:28 pj Exp $ */ |
+ |
+/* |
+ * Copyright (C) 2000 Fabio Calabrese <fabiocalabrese77@yahoo.it> |
+ * |
+ * 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 |
+ * |
+ */ |
+ |
+/**************************************************** |
+ * * |
+ * file: bca.c * |
+ * header file: bca.h * |
+ * data: 15/09/2002 * |
+ * creato da: Fabio CALABRESE * |
+ * * |
+ ****************************************************** |
+ * * |
+ * descrizione: e' il file in cui è descritto il task* |
+ * main del programma S.Ha.R.K. * |
+ * "(B)ase(C)ontr(A)rea". * |
+ * Il codice del programma comprende * |
+ * anche l'implementazione di altri task* |
+ * distribuiti nei seguenti file che * |
+ * quindi sono inclusi: * |
+ * dummy.c * |
+ * control.c * |
+ * aereo.c * |
+ * cannone.c * |
+ * missile.c * |
+ * esplo.c * |
+ * Inoltre è incluso anche il file: * |
+ * scenario.c * |
+ * che descrive come disegnare lo * |
+ * scenario grafico iniziale * |
+ * * |
+ ******************************************************/ |
+ |
+ |
+// *** Librerie S.Ha.R.K *** |
+#include <kernel/kern.h> |
+#include <ll/i386/cons.h> |
+ |
+#include <drivers/shark_fb26.h> |
+#include <drivers/shark_keyb26.h> |
+ |
+// *** Librerie Standard C *** |
+#include <stdlib.h> |
+// *** Librerie FAB *** |
+#include "fab_lib/fab_msg.h" |
+#include "fab_lib/fab_show.h" |
+#include "fab_lib/fab_tool.h" |
+#include "fab_lib/fab_grx.h" |
+// *** Librerie BCA *** |
+#include "bca.h" |
+ |
+ |
+char * titolo[10]; |
+ |
+void scenario(); |
+void info(); |
+#include"scenario.c" |
+ |
+PID crea_soft_dummy_radar (); |
+TASK dummy_radar(void *); |
+#include"dummy.c" |
+ |
+PID crea_soft_control(); |
+TASK control(void *); |
+#include"control.c" |
+ |
+PID crea_soft_aereo_creator(); |
+TASK aereo_creator(); |
+PID crea_hard_aereo(int index); |
+PID crea_soft_aereo(int index); |
+TASK aereo(void * index); |
+#include"aereo.c" |
+ |
+PID crea_soft_cannone_creator(); |
+TASK cannone_creator(); |
+PID crea_hard_cannone(int index); |
+PID crea_soft_cannone(int index); |
+TASK cannone(void * index); |
+#include"cannone.c" |
+ |
+PID crea_hard_missile(); |
+PID crea_soft_missile(); |
+TASK missile(); |
+#include"missile.c" |
+ |
+PID crea_soft_esplo(); |
+TASK esplo(void *); |
+#include"esplo.c" |
+ |
+void end_fun(KEY_EVT* k) |
+{ sys_shutdown_message("Ending...\n"); |
+ exit(0); |
+} |
+void incrementa_aerei_fun(KEY_EVT* k) |
+{ if (aereo_count<AEREO_N_MAX) aereo_count++; |
+} |
+void decrementa_aerei_fun(KEY_EVT* k) |
+{ if (aereo_count>AEREO_N_MIN) aereo_count--; |
+} |
+void incrementa_cannoni_fun(KEY_EVT* k) |
+{ if (cannone_count<CANNONE_N_MAX) cannone_count++; |
+} |
+void decrementa_cannoni_fun(KEY_EVT* k) |
+{ if (cannone_count>CANNONE_N_MIN) cannone_count--; |
+} |
+ |
+int main(int argc, char **argv) |
+{ |
+ PID pid; |
+ |
+ KEY_EVT k; |
+ |
+ k.flag = 0; |
+ k.scan = KEY_ENT; |
+ k.ascii = 13; |
+ k.status = KEY_PRESSED; |
+ keyb_hook(k,end_fun,FALSE); |
+ k.flag = 0; |
+ k.scan = KEY_1; |
+ k.ascii = '1'; |
+ k.status = KEY_PRESSED; |
+ keyb_hook(k,incrementa_aerei_fun,FALSE); |
+ k.flag = 0; |
+ k.scan = KEY_2; |
+ k.ascii = '2'; |
+ k.status = KEY_PRESSED; |
+ keyb_hook(k,decrementa_aerei_fun,FALSE); |
+ k.flag = 0; |
+ k.scan = KEY_3; |
+ k.ascii = '3'; |
+ k.status = KEY_PRESSED; |
+ keyb_hook(k,incrementa_cannoni_fun,FALSE); |
+ k.flag = 0; |
+ k.scan = KEY_4; |
+ k.ascii = '4'; |
+ k.status = KEY_PRESSED; |
+ keyb_hook(k,decrementa_cannoni_fun,FALSE); |
+ |
+ /* inizializza il mutex grafico */ |
+ app_mutex_init(&grx_mutex); |
+ |
+ scenario(); |
+ |
+ //---init--- |
+ srand(sys_gettime(NULL)); |
+ aereo_count = AEREO_N_MIN; |
+ cannone_count = CANNONE_N_MIN; |
+ |
+ pid=crea_soft_dummy_radar(); |
+ task_activate(pid); |
+ |
+ pid=crea_soft_aereo_creator(); |
+ task_activate(pid); |
+ |
+ pid=crea_soft_cannone_creator(); |
+ task_activate(pid); |
+ |
+ pid=crea_soft_control(); |
+ task_activate(pid); |
+ //---------- |
+ |
+ return 0; |
+ |
+} |
+ |
+ |
Index: rel_1_5_beta1/bca/esplo.c |
=================================================================== |
--- rel_1_5_beta1/bca/esplo.c (nonexistent) |
+++ rel_1_5_beta1/bca/esplo.c (revision 1557) |
@@ -0,0 +1,94 @@ |
+/* |
+ * Project: S.Ha.R.K. |
+ * |
+ * Coordinators: |
+ * Giorgio Buttazzo <giorgio@sssup.it> |
+ * Paolo Gai <pj@gandalf.sssup.it> |
+ * |
+ * Authors : |
+ * Paolo Gai <pj@gandalf.sssup.it> |
+ * Massimiliano Giorgi <massy@gandalf.sssup.it> |
+ * Luca Abeni <luca@gandalf.sssup.it> |
+ * (see the web pages for full authors list) |
+ * |
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
+ * |
+ * http://www.sssup.it |
+ * http://retis.sssup.it |
+ * http://shark.sssup.it |
+ */ |
+ |
+/* CVS : $Id: esplo.c,v 1.5 2004-05-26 09:25:06 giacomo Exp $ */ |
+ |
+/* |
+ * Copyright (C) 2000 Fabio Calabrese <fabiocalabrese77@yahoo.it> |
+ * |
+ * 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 |
+ * |
+ */ |
+ |
+//************************ |
+//* file: esplo.c * |
+//* included by: bca.c * |
+//************************ |
+ |
+#include <time.h> |
+ |
+PID crea_soft_esplo(int index) |
+{ |
+ SOFT_TASK_MODEL m; |
+ PID pid; |
+ |
+ soft_task_default_model(m); |
+ soft_task_def_arg(m,(void*)index); |
+ soft_task_def_period(m,ESPLO_PERIOD*2); |
+ soft_task_def_wcet(m,ESPLO_WCET*10); |
+ soft_task_def_met(m,ESPLO_MET*10); |
+ |
+ pid = task_create("esplo", esplo, &m, NULL); |
+ return pid; |
+} |
+ |
+TASK esplo(void *argv) |
+{ |
+ int i; |
+ int index; |
+ WORD xx0, yy0, xx1, yy1; |
+ struct timespec delay; |
+ |
+ |
+ delay.tv_sec = 0; |
+ delay.tv_nsec = 20000000; |
+ i=0; |
+ index = (int)argv; |
+ xx0 = aereo_table[index].x - ESPLO_LX/2; |
+ yy0 = aereo_table[index].y - ESPLO_LY/2; |
+ xx1 = xx0 + ESPLO_LX-1; |
+ yy1 = yy0 + ESPLO_LY-1; |
+ |
+ for(i=0;i<5;i++) { |
+ mutex_lock(&grx_mutex); |
+ FAB_image_put_within(image_esplo[i],xx0,yy0,X0,Y0,X1,Y1); |
+ mutex_unlock(&grx_mutex); |
+ task_endcycle(); |
+ } |
+ |
+ mutex_lock(&grx_mutex); |
+ FAB_image_put_within(image_bca,X0,Y0,xx0,yy0,xx1,yy1); |
+ mutex_unlock(&grx_mutex); |
+ |
+ return 0; |
+ |
+} |
Index: rel_1_5_beta1/bca/missile.c |
=================================================================== |
--- rel_1_5_beta1/bca/missile.c (nonexistent) |
+++ rel_1_5_beta1/bca/missile.c (revision 1557) |
@@ -0,0 +1,202 @@ |
+/* |
+ * Project: S.Ha.R.K. |
+ * |
+ * Coordinators: |
+ * Giorgio Buttazzo <giorgio@sssup.it> |
+ * Paolo Gai <pj@gandalf.sssup.it> |
+ * |
+ * Authors : |
+ * Paolo Gai <pj@gandalf.sssup.it> |
+ * Massimiliano Giorgi <massy@gandalf.sssup.it> |
+ * Luca Abeni <luca@gandalf.sssup.it> |
+ * (see the web pages for full authors list) |
+ * |
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
+ * |
+ * http://www.sssup.it |
+ * http://retis.sssup.it |
+ * http://shark.sssup.it |
+ */ |
+ |
+/* CVS : $Id: missile.c,v 1.3 2004-05-25 18:24:59 giacomo Exp $ */ |
+ |
+/* |
+ * Copyright (C) 2000 Fabio Calabrese <fabiocalabrese77@yahoo.it> |
+ * |
+ * 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 |
+ * |
+ */ |
+ |
+//************************** |
+//* file: missile.c * |
+//* included by: bca.c * |
+//************************** |
+ |
+PID crea_hard_missile(int index); |
+PID crea_soft_missile(int index); |
+PID crea_soft_esplo(int index); |
+ |
+TASK missile(void *arg) |
+{ |
+ PID esplo_pid; |
+ int img; |
+ int i, index; // indice nella cannone_table |
+ int distx, disty; |
+ int xx0,yy0,xx1,yy1; |
+ double vel, acc; |
+ double a; |
+ double y; |
+ double x; |
+ double old_x; // [pixel]: conserva valore x prima di aggiornare |
+ double old_y; |
+ double dx; // [pixel/us]: spostamento periodico |
+ double dy; |
+ int first_time; |
+ int killing; |
+ |
+ index = (int)arg; |
+ img=0; |
+ y = MISSILE_Y_MAX; |
+ x = cannone_table[index].x; |
+ a = FAB_rad(270); |
+ vel = MISSILE_V_MIN; |
+ acc = MISSILE_ACC_MIN; |
+ dx = 0; |
+ dy = 0; |
+ |
+ first_time = 1; |
+ killing = 0; |
+ |
+ while(1){ |
+ |
+ old_x = x; |
+ old_y = y; |
+ |
+ if (vel<MISSILE_V_MAX) { |
+ vel += acc*MISSILE_PERIOD/(60*60*1000000.0); |
+ if (vel>MISSILE_V_MAX) vel = MISSILE_V_MAX; |
+ } |
+ if (acc<MISSILE_ACC_MAX) { |
+ acc += MISSILE_ACC_MIN; |
+ if (acc>MISSILE_ACC_MAX) acc = MISSILE_ACC_MAX; |
+ } |
+ |
+ cannone_table[index].missile_vel=vel; |
+ |
+ dx = cos(a)*vel * (X1-X0) / (double)BASE_L |
+ * (MISSILE_PERIOD / (60*60*1000000.0)); |
+ dy = sin(a)*vel * (Y1-Y0) / ((double)BASE_H/1000) |
+ * (MISSILE_PERIOD / (60*60*1000000.0)); |
+ |
+ x += dx; |
+ y += dy; |
+ |
+ xx0 = old_x - MISSILE_LX/2; |
+ yy0 = old_y - MISSILE_LY/2; |
+ xx1 = xx0 + MISSILE_LX-1; |
+ yy1 = yy0 + MISSILE_LY-1; |
+ |
+ if (x<MISSILE_X_MIN || x>MISSILE_X_MAX |
+ || y<MISSILE_Y_MIN || y>MISSILE_Y_MAX) { |
+ killing = 1; |
+ } |
+ |
+ if (killing) { |
+ if (!first_time) { |
+ mutex_lock(&grx_mutex); |
+ FAB_image_put_within(image_bca,X0,Y0,xx0,yy0,xx1,yy1); |
+ mutex_unlock(&grx_mutex); |
+ } |
+ cannone_table[index].fire = 0; |
+ //il task cannone si accorge che il suo missile ha finito |
+ // quindi ne ricreer uno nuovo in caso di bersaglio!!! |
+ return NULL; |
+ } |
+ |
+ if ( (int)x != (int)old_x |
+ ||(int)y != (int)old_y ) {//...se c' lo spostamento reale |
+ // di almeno un pixel... |
+ mutex_lock(&grx_mutex); //...aggiorna disegno... |
+ if (first_time) { |
+ first_time=0; |
+ } |
+ else { |
+ if (yy1<Y1-CANNONE_LY) FAB_image_put_within(image_bca,X0,Y0,xx0,yy0,xx1,yy1); |
+ else FAB_image_put_within(image_bca,X0,Y0,xx0,yy0,xx1,Y1-CANNONE_LY); |
+ } |
+ |
+ FAB_image_put_within(image_missile[img++], x - MISSILE_LX/2, y - MISSILE_LY/2, |
+ X0, Y0, |
+ X1, Y1-CANNONE_LY); |
+ mutex_unlock(&grx_mutex); |
+ if (img==2) img = 0; |
+ } |
+ |
+ //Ha colpito un aereo? |
+ for (i=0; i<AEREO_N_MAX; i++) |
+ if (aereo_table[i].status){ |
+ distx = aereo_table[i].x-x; |
+ disty = aereo_table[i].y-y; |
+ if (distx<0) distx *= -1; |
+ if (disty<0) disty *= -1; |
+ if ( distx<(AEREO_LX+MISSILE_LX)/2-1 |
+ &&disty<(AEREO_LY+MISSILE_LY)/2-1 ) { // BERSAGLIO COLPITO! |
+ esplo_pid = crea_soft_esplo(i); |
+ task_activate(esplo_pid); |
+ killing=1; |
+ aereo_table[i].killing=1; |
+ break; |
+ } |
+ } |
+ |
+ task_endcycle(); |
+ } |
+ |
+return NULL; |
+} |
+ |
+ |
+PID crea_hard_missile(int index) |
+{ |
+ HARD_TASK_MODEL m; |
+ PID pid; |
+ |
+ hard_task_default_model(m); |
+ hard_task_def_level(m,1); |
+ hard_task_def_arg(m,(void*)index); |
+ hard_task_def_periodic(m); |
+ hard_task_def_wcet(m, MISSILE_WCET); |
+ hard_task_def_mit(m,MISSILE_PERIOD); |
+ |
+ pid = task_create("hard_missile", missile, &m, NULL); |
+ return pid; |
+} |
+ |
+PID crea_soft_missile(int index) |
+{ |
+ SOFT_TASK_MODEL m; |
+ PID pid; |
+ |
+ soft_task_default_model(m); |
+ soft_task_def_level(m,2); |
+ soft_task_def_arg(m,(void*)index); |
+ soft_task_def_periodic(m); |
+ soft_task_def_period(m,MISSILE_PERIOD); |
+ soft_task_def_wcet(m, MISSILE_WCET); |
+ soft_task_def_met(m,MISSILE_MET); |
+ |
+ pid = task_create("soft_missile", missile, &m, NULL); |
+ return pid; |
+} |
Index: rel_1_5_beta1/bca/cannone.c |
=================================================================== |
--- rel_1_5_beta1/bca/cannone.c (nonexistent) |
+++ rel_1_5_beta1/bca/cannone.c (revision 1557) |
@@ -0,0 +1,218 @@ |
+/* |
+ * Project: S.Ha.R.K. |
+ * |
+ * Coordinators: |
+ * Giorgio Buttazzo <giorgio@sssup.it> |
+ * Paolo Gai <pj@gandalf.sssup.it> |
+ * |
+ * Authors : |
+ * Paolo Gai <pj@gandalf.sssup.it> |
+ * Massimiliano Giorgi <massy@gandalf.sssup.it> |
+ * Luca Abeni <luca@gandalf.sssup.it> |
+ * (see the web pages for full authors list) |
+ * |
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
+ * |
+ * http://www.sssup.it |
+ * http://retis.sssup.it |
+ * http://shark.sssup.it |
+ */ |
+ |
+/* CVS : $Id: cannone.c,v 1.3 2004-05-25 18:24:59 giacomo Exp $ */ |
+ |
+/* |
+ * Copyright (C) 2000 Fabio Calabrese <fabiocalabrese77@yahoo.it> |
+ * |
+ * 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 |
+ * |
+ */ |
+ |
+//************************** |
+//* file: cannone.c * |
+//* included by: bca.c * |
+//************************** |
+ |
+TASK cannone_creator(void * arg) |
+{ int i, index, last; |
+ WORD count; |
+ PID pid=-1; |
+ |
+ while(1){ |
+ |
+ count=0; |
+ index=-1; |
+ last=-1; |
+ |
+ for (i=0; i<CANNONE_N_MAX; i++) // Conteggio aerei attivi |
+ if (cannone_table[i].status) { |
+ count++; |
+ last=i; //...ultima posizione occupata in tabella... |
+ } |
+ else { |
+ if (index==-1) index=i; //...prima posizione libera in tabella... |
+ } |
+ |
+ if (count<cannone_count && index!=-1) { // Richiesta nuovo cannone |
+ cannone_table[index].status = 1; //...occupa posizione... |
+ cannone_table[index].killing = 0; //...disattiva richiesta di kill... |
+ if (index==0) pid = crea_hard_cannone(index); // sempre il 1ø hard |
+ else pid = crea_soft_cannone(index); // tutti gli altri soft |
+ cannone_table[index].pid = pid; |
+ if (pid!=NIL) task_activate(pid); |
+ else { //ripristino il posto libero in tabella; |
+ cannone_table[index].status = -2; |
+ cannone_table[index].killing = -2; |
+ } |
+ } |
+ |
+ else if (count>cannone_count) { // Richiesta cancellazione cannone |
+ cannone_table[last].killing = 1; |
+ } |
+ |
+ task_endcycle(); |
+ } |
+ return NULL; |
+} |
+ |
+PID crea_soft_cannone_creator(); |
+PID crea_hard_cannone(int index); |
+PID crea_hard_cannone(int index); |
+ |
+PID crea_hard_missile(int index); |
+PID crea_soft_missile(int index); |
+ |
+TASK cannone(void *arg) |
+{ |
+ PID missile_pid=-2; |
+ int i, index; // indice nella aereo_table e cannone_table |
+ int d, dir; |
+ int xx0,yy0,xx1,yy1; |
+ int first_time; |
+ |
+ index = (int)arg; |
+ first_time = 1; |
+ if (index%2) { |
+ //indice dispari |
+ xx0 = X0 + 500/2 - CANNONE_LX/2 + 500/(CANNONE_N_MAX+1)*(index+1)/2; |
+ } |
+ else { |
+ //indice pari |
+ xx0 = X0 + 500/2 - CANNONE_LX/2 - 500/(CANNONE_N_MAX+1)*(index/2); |
+ } |
+ xx1 = xx0 + CANNONE_LX; |
+ yy0= Y1 - CANNONE_LY; |
+ yy1= Y1; |
+ |
+ cannone_table[index].x = xx0 + CANNONE_LX/2; |
+ |
+ while(1){ |
+ |
+ if (cannone_table[index].killing) { |
+ if (!first_time) { |
+ mutex_lock(&grx_mutex); |
+ FAB_image_put_within(image_bca,X0,Y0,xx0,yy0,xx1,yy1); |
+ mutex_unlock(&grx_mutex); |
+ } |
+ cannone_table[index].status=0; |
+ cannone_table[index].pid=-2; |
+ cannone_table[index].killing=0; |
+ //il task aereo_creator si accorge che c' un aereo in meno |
+ // quindi ne ricreer uno nuovo!!! |
+ return NULL; |
+ } |
+ |
+ if (first_time) { |
+ mutex_lock(&grx_mutex); //...aggiorna disegno... |
+ if (index==0) FAB_image_put(image_cannone[1], xx0, yy0); |
+ else FAB_image_put(image_cannone[0], xx0, yy0); |
+ mutex_unlock(&grx_mutex); |
+ first_time=0; |
+ } |
+ |
+ if (!cannone_table[index].fire) { |
+ for (i=0; i<AEREO_N_MAX; i++) { |
+ if (aereo_table[i].status) { |
+ d = aereo_table[i].x - (xx0+CANNONE_LX/2); |
+ dir = aereo_table[i].dir; |
+ if (d*dir<0 && FAB_ABS(d)<=CANNONE_SENSIBILITA/1000.0*500/BASE_L) { |
+ // FA F U O C O |
+ if (index==0) missile_pid=crea_hard_missile(index); |
+ else missile_pid=crea_soft_missile(index); |
+ if (missile_pid!=NIL) { |
+ cannone_table[index].fire = 1; |
+ task_activate(missile_pid); |
+ break; |
+ } |
+ } |
+ } |
+ } |
+ } |
+ |
+ task_endcycle(); |
+ } |
+ |
+return NULL; |
+} |
+ |
+ |
+ |
+PID crea_soft_cannone_creator() |
+{ |
+ SOFT_TASK_MODEL m; |
+ PID pid; |
+ |
+ soft_task_default_model(m); |
+ soft_task_def_periodic(m); |
+ soft_task_def_period(m,CANNONE_CREATOR_PERIOD); |
+ soft_task_def_wcet(m,CANNONE_CREATOR_WCET); |
+ soft_task_def_met(m,CANNONE_CREATOR_MET); |
+ |
+ pid = task_create("cannone_creator", cannone_creator, &m, NULL); |
+ return pid; |
+} |
+ |
+PID crea_hard_cannone(int index) |
+{ |
+ HARD_TASK_MODEL m; |
+ PID pid; |
+ |
+ hard_task_default_model(m); |
+ hard_task_def_level(m,1); |
+ hard_task_def_arg(m,(void*)index); |
+ hard_task_def_periodic(m); |
+ hard_task_def_wcet(m, CANNONE_WCET); |
+ hard_task_def_mit(m,CANNONE_PERIOD); |
+ |
+ pid = task_create("hard_cannone", cannone, &m, NULL); |
+ return pid; |
+} |
+ |
+PID crea_soft_cannone(int index) |
+{ |
+ SOFT_TASK_MODEL m; |
+ PID pid; |
+ |
+ soft_task_default_model(m); |
+ soft_task_def_level(m,2); |
+ soft_task_def_arg(m,(void*)index); |
+ soft_task_def_periodic(m); |
+ soft_task_def_period(m,CANNONE_PERIOD); |
+ soft_task_def_wcet(m, CANNONE_WCET); |
+ soft_task_def_met(m,CANNONE_MET); |
+ |
+ pid = task_create("soft_cannone", cannone, &m, NULL); |
+ return pid; |
+} |
+ |
Index: rel_1_5_beta1/bca/aereo.c |
=================================================================== |
--- rel_1_5_beta1/bca/aereo.c (nonexistent) |
+++ rel_1_5_beta1/bca/aereo.c (revision 1557) |
@@ -0,0 +1,241 @@ |
+/* |
+ * Project: S.Ha.R.K. |
+ * |
+ * Coordinators: |
+ * Giorgio Buttazzo <giorgio@sssup.it> |
+ * Paolo Gai <pj@gandalf.sssup.it> |
+ * |
+ * Authors : |
+ * Paolo Gai <pj@gandalf.sssup.it> |
+ * Massimiliano Giorgi <massy@gandalf.sssup.it> |
+ * Luca Abeni <luca@gandalf.sssup.it> |
+ * (see the web pages for full authors list) |
+ * |
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
+ * |
+ * http://www.sssup.it |
+ * http://retis.sssup.it |
+ * http://shark.sssup.it |
+ */ |
+ |
+/* CVS : $Id: aereo.c,v 1.2 2004-05-25 18:24:59 giacomo Exp $ */ |
+ |
+/* |
+ * Copyright (C) 2000 Fabio Calabrese <fabiocalabrese77@yahoo.it> |
+ * |
+ * 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 |
+ * |
+ */ |
+ |
+//************************ |
+//* file: aereo.c * |
+//* included by: bca.c * |
+//************************ |
+ |
+TASK aereo_creator(void * arg) |
+{ int i, index, last; |
+ WORD count; |
+ PID pid=-1; |
+ COLOR col; |
+ double vel; |
+ int dir; |
+ WORD h; |
+ double l; |
+ WORD x, y; |
+ |
+ while(1){ |
+ |
+ count=0; |
+ index=-1; |
+ last=-1; |
+ |
+ for (i=0; i<AEREO_N_MAX; i++) // Conteggio aerei attivi |
+ if (aereo_table[i].status) { |
+ count++; |
+ last=i; //...ultima posizione occupata in tabella... |
+ } |
+ else { |
+ if (index==-1) index=i; //...prima posizione libera in tabella... |
+ } |
+ |
+ if (count<aereo_count && index!=-1) { // Richiesta nuovo aereo |
+ aereo_table[index].status = 1; //...occupa posizione... |
+ aereo_table[index].killing = 0; //...disattiva richiesta di kill... |
+ col = FAB_rgb(FAB_int_rand(50,255), //...nuovo colore... |
+ FAB_int_rand(50,255), |
+ FAB_int_rand(50,255)); |
+ vel = FAB_double_rand(AEREO_V_MIN,AEREO_V_MAX); //...velocita'... |
+ dir = FAB_sign_rand(); //...direzione... |
+ h = FAB_int_rand(AEREO_H_MIN,AEREO_H_MAX); //...altezza... |
+ y = Y0 + 500 - h*500/BASE_H; |
+ l = (dir>0) ? AEREO_L_MIN : AEREO_L_MAX; //...posizione iniz... |
+ x = (dir>0) ? AEREO_X_MIN : AEREO_X_MAX; |
+ // ... settaggio valori in tabella ... |
+ aereo_table[index].color = col; |
+ if (index>0) { |
+ if (dir>0) FAB_image_copy(image_aereo[0],aereo_table[index].image); |
+ else FAB_image_copy(image_aereo[1],aereo_table[index].image); |
+ } |
+ else { |
+ if (dir>0) FAB_image_copy(image_aereo[2],aereo_table[index].image); |
+ else FAB_image_copy(image_aereo[3],aereo_table[index].image); |
+ } |
+ FAB_image_color_change(aereo_table[index].image,AEREO_BASE_COL,col); |
+ aereo_table[index].vel = vel; |
+ aereo_table[index].dir = dir; |
+ aereo_table[index].h = h; |
+ aereo_table[index].l = l; |
+ aereo_table[index].x = x; |
+ aereo_table[index].y = y; |
+ if (index==0) pid = crea_hard_aereo(index); // sempre il 1ø hard |
+ else pid = crea_soft_aereo(index); // tutti gli altri soft |
+ aereo_table[index].pid = pid; |
+ if (pid!=NIL) task_activate(pid); |
+ else { //ripristino il posto libero in tabella; |
+ aereo_table[index].status = 0; |
+ aereo_table[index].killing = 0; |
+ } |
+ } |
+ |
+ else if (count>aereo_count) { // Richiesta cancellazione aereo |
+ aereo_table[last].killing = 1; |
+ } |
+ |
+ task_endcycle(); |
+ } |
+ return NULL; |
+} |
+ |
+TASK aereo(void *arg) |
+{ |
+ int index; // indice nella aereo_table |
+ FAB_IMAGE* image; |
+ int xx0,yy0,xx1,yy1; |
+ int y; |
+ double x; |
+ double old_x; // [pixel]: conserva valore x prima di aggiornare |
+ double dx; // [pixel/us]: spostamento periodico |
+ int first_time; |
+ |
+ index = (int)arg; |
+ image = aereo_table[index].image; |
+ y = aereo_table[index].y; |
+ x = aereo_table[index].x; |
+ dx = aereo_table[index].vel * (AEREO_X_MAX-AEREO_X_MIN) / (double)BASE_L |
+ * (AEREO_PERIOD / (60*60*1000000.0)) |
+ * aereo_table[index].dir; |
+ first_time = 1; |
+ |
+ while(1){ |
+ |
+ old_x = x; |
+ x += dx; |
+ |
+ xx0 = old_x - AEREO_LX/2; |
+ yy0 = y - AEREO_LY/2; |
+ xx1 = xx0 + AEREO_LX - 1; |
+ yy1 = yy0 + AEREO_LY - 1; |
+ |
+ aereo_table[index].x = x; //...aggiornamento posizione in tabella... |
+ |
+ if (x<AEREO_X_MIN || x>AEREO_X_MAX) { |
+ aereo_table[index].killing = 1; |
+ } |
+ |
+ if (aereo_table[index].killing) { |
+ if (!first_time) { |
+ mutex_lock(&grx_mutex); |
+ FAB_image_put_within(image_bca,X0,Y0,xx0,yy0,xx1,yy1); |
+ mutex_unlock(&grx_mutex); |
+ } |
+ aereo_table[index].status=0; |
+ aereo_table[index].pid=-2; |
+ aereo_table[index].killing=0; |
+ //il task aereo_creator si accorge che c' un aereo in meno |
+ // quindi ne ricreer uno nuovo!!! |
+ return NULL; |
+ } |
+ |
+ if(aereo_table[index].x!=(int)old_x) {//...se c' lo spostamento reale |
+ // di almeno un pixel... |
+ mutex_lock(&grx_mutex); //...aggiorna disegno... |
+ if (first_time) { |
+ first_time=0; |
+ } |
+ else { |
+ FAB_image_put_within(image_bca,X0,Y0,xx0,yy0,xx1,yy1); |
+ } |
+ |
+ FAB_image_put_within(image, x - AEREO_LX/2, y - AEREO_LY/2, |
+ X0, Y0, X1, Y1); |
+ mutex_unlock(&grx_mutex); |
+ } |
+ |
+ task_endcycle(); |
+ } |
+ |
+return NULL; |
+} |
+ |
+PID crea_soft_aereo_creator() |
+{ |
+ SOFT_TASK_MODEL m; |
+ PID pid; |
+ |
+ soft_task_default_model(m); |
+ soft_task_def_periodic(m); |
+ soft_task_def_period(m,AEREO_CREATOR_PERIOD); |
+ soft_task_def_wcet(m,AEREO_CREATOR_WCET); |
+ soft_task_def_met(m,AEREO_CREATOR_MET); |
+ |
+ pid = task_create("aereo_creator", aereo_creator, &m, NULL); |
+ return pid; |
+} |
+ |
+PID crea_hard_aereo(int index) |
+{ |
+ HARD_TASK_MODEL m; |
+ PID pid; |
+ |
+ hard_task_default_model(m); |
+ hard_task_def_level(m,1); |
+ hard_task_def_arg(m,(void*)index); |
+ hard_task_def_periodic(m); |
+ hard_task_def_wcet(m, AEREO_WCET); |
+ hard_task_def_mit(m,AEREO_PERIOD); |
+ hard_task_def_usemath(m); |
+ |
+ pid = task_create("hard_aereo", aereo, &m, NULL); |
+ return pid; |
+} |
+ |
+PID crea_soft_aereo(int index) |
+{ |
+ SOFT_TASK_MODEL m; |
+ PID pid; |
+ |
+ soft_task_default_model(m); |
+ soft_task_def_level(m,2); |
+ soft_task_def_arg(m,(void*)index); |
+ soft_task_def_periodic(m); |
+ soft_task_def_period(m,AEREO_PERIOD); |
+ soft_task_def_wcet(m, AEREO_WCET); |
+ soft_task_def_met(m,AEREO_MET); |
+ soft_task_def_usemath(m); |
+ |
+ pid = task_create("soft aereo", aereo, &m, NULL); |
+ return pid; |
+} |
+ |
Index: rel_1_5_beta1/bca/bca_lib.c |
=================================================================== |
--- rel_1_5_beta1/bca/bca_lib.c (nonexistent) |
+++ rel_1_5_beta1/bca/bca_lib.c (revision 1557) |
@@ -0,0 +1,412 @@ |
+/* |
+ * Project: S.Ha.R.K. |
+ * |
+ * Coordinators: |
+ * Giorgio Buttazzo <giorgio@sssup.it> |
+ * Paolo Gai <pj@gandalf.sssup.it> |
+ * |
+ * Authors : |
+ * Paolo Gai <pj@gandalf.sssup.it> |
+ * Massimiliano Giorgi <massy@gandalf.sssup.it> |
+ * Luca Abeni <luca@gandalf.sssup.it> |
+ * (see the web pages for full authors list) |
+ * |
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
+ * |
+ * http://www.sssup.it |
+ * http://retis.sssup.it |
+ * http://shark.sssup.it |
+ */ |
+ |
+/* CVS : $Id: bca_lib.c,v 1.4 2004-05-23 08:59:27 giacomo Exp $ */ |
+ |
+/* |
+ * Copyright (C) 2000 Fabio Calabrese <fabiocalabrese77@yahoo.it> |
+ * |
+ * 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 |
+ * |
+ */ |
+ |
+/**************************************************** |
+ * * |
+ * file: BCA_LIB.c * |
+ * libreria: BCA_LIB * |
+ * creato da: Fabio CALABRESE * |
+ * * |
+ ****************************************************/ |
+ |
+#ifndef __BCA_LIB_c__ |
+#define __BCA_LIB_c__ |
+//-------------------BEGIN--------------------------- |
+ |
+// *** Librerie S.Ha.R.K *** |
+#include<kernel/kern.h> |
+ |
+#include<drivers/shark_fb26.h> |
+ |
+// *** Librerie Standard C *** |
+// *** Librerie FAB *** |
+#include"fab_lib/fab_msg.h" |
+// *** Librerie BCA *** |
+#include"bca.h" |
+ |
+char * titolo[10]={" UNIVERSITA' DEGLI \0", |
+ " STUDI DI \0", |
+ " PAVIA \0", |
+ "Progetto S.Ha.R.K.\0", |
+ " 'BaseContrAerea' \0", |
+ "-------------------\0", |
+ " PAVIA 2002 \0", |
+ "by Fabio CALABRESE \0", |
+ "<fabiocalabrese77 \0", |
+ " @yahoo.it>\0"}; |
+ |
+void kern_alloc_images(); // richiede DISABLED_INTERUPTS |
+void kern_free_images(); // richiede DISABLED_INTERUPTS |
+void kern_load_images(); // solo in __kernel_register_levels__() |
+ |
+void kern_alloc_borders(); // richiede DISABLED_INTERUPTS |
+void kern_free_borders(); // richiede DISABLED_INTERUPTS |
+void kern_set_border(); // consigliato in __kernel_register-levels__() |
+ |
+void kern_alloc_frames(); // richiede DISABLED_INTERUPTS |
+void kern_free_frames(); // richiede DISABLED_INTERUPTS |
+void kern_set_frames(); // consigliato in __kernel_register-levels__() |
+ |
+void kern_alloc_ballframes(); // richiede DISABLED_INTERUPTS |
+void kern_free_ballframes(); // richiede DISABLED_INTERUPTS |
+void kern_set_ballframes(); // consigliato in __kernel_register-levels__() |
+ |
+void kern_alloc_task_tables(); // richiede DISABLED_INTERUPTS |
+void kern_free_task_tables(); // richiede DISABLED_INTERUPTS |
+void kern_set_task_tables(); // consigliato in __kernel_register-levels__() |
+ |
+void kern_alloc_task_tables() |
+{ |
+ int test=0,j; |
+ |
+ FAB_print("TASKS'TABLES","allocazione..."); |
+ for (j=0; j<AEREO_N_MAX; j++) { |
+ aereo_table[j].image=FAB_image_alloc(AEREO_LX,AEREO_LY); |
+ if(aereo_table[j].image==NULL) test=1; |
+ } |
+ FAB_msg(test,"fatto","almeno un elemento della tabella non allocato"); |
+} |
+void kern_free_task_tables() |
+{ int j; |
+ |
+ for (j=0; j<AEREO_N_MAX; j++) { |
+ FAB_image_free(aereo_table[j].image); |
+ } |
+} |
+void kern_set_task_tables() |
+{ int j; |
+ |
+ FAB_print(NULL,"settaggio..."); |
+ for (j=0; j<AEREO_N_MAX; j++) { |
+ aereo_table[j].status = 0; |
+ aereo_table[j].killing = 0; |
+ aereo_table[j].image->trasparent = 1; |
+ aereo_table[j].image->trasparent_col = AEREO_TRASPARENT_COL; |
+ } |
+ |
+ FAB_print(NULL,"fatto"); |
+} |
+ |
+ |
+void kern_alloc_ballframes() |
+{ |
+ int test=0,j; |
+ |
+ FAB_print("FAB_BALLFRAMEs","allocazione..."); |
+ ballframe_radar = FAB_ballframe_alloc(); |
+ if (ballframe_radar==NULL) test=1; |
+ for (j=0; j<3; j++) { |
+ ballframe_lucerossa[j] = FAB_ballframe_alloc(); |
+ if (ballframe_lucerossa[j]==NULL) test=1; |
+ } |
+ FAB_msg(test,"fatto","almeno un ballframe non allocato"); |
+} |
+void kern_free_ballframes() |
+{ int j; |
+ |
+ FAB_ballframe_free(ballframe_radar); |
+ for (j=0; j<3; j++) |
+ FAB_ballframe_free(ballframe_lucerossa[j]); |
+} |
+void kern_set_ballframes() |
+{ int j; |
+ |
+ FAB_print(NULL,"settaggio..."); |
+ FAB_ballframe_border_set(ballframe_radar,border_verde7,7, |
+ FRAME_MISURE_LINE_COLOR); |
+ FAB_ballframe_color_set(ballframe_radar,0,FAB_blue); |
+ for(j=0; j<3; j++) { |
+ FAB_ballframe_border_set(ballframe_lucerossa[j],border_verde7,7, |
+ FRAME_MISURE_LINE_COLOR); |
+ FAB_ballframe_color_set(ballframe_lucerossa[j],0,FAB_red); |
+ } |
+ FAB_print(NULL,"fatto"); |
+} |
+ |
+void kern_alloc_frames() |
+{ |
+ int test=0; |
+ |
+ FAB_print("FAB_FRAMEs","allocazione..."); |
+ frame_bca = FAB_frame_alloc(); |
+ if (frame_bca==NULL) test=1; |
+ frame_misure_oriz = FAB_frame_alloc(); |
+ if (frame_misure_oriz==NULL) test=1; |
+ frame_misure_vert = FAB_frame_alloc(); |
+ if (frame_misure_vert==NULL) test=1; |
+ frame_titolo = FAB_frame_alloc(); |
+ if (frame_titolo==NULL) test=1; |
+ frame_comandi = FAB_frame_alloc(); |
+ if (frame_comandi==NULL) test=1; |
+ frame_control = FAB_frame_alloc(); |
+ if (frame_control==NULL) test=1; |
+ |
+ FAB_msg(test,"fatto","almeno un frame non allocato"); |
+} |
+void kern_free_frames() |
+{ |
+ FAB_frame_free(frame_bca); |
+ FAB_frame_free(frame_misure_oriz); |
+ FAB_frame_free(frame_misure_vert); |
+ FAB_frame_free(frame_titolo); |
+ FAB_frame_free(frame_comandi); |
+ FAB_frame_free(frame_control); |
+ |
+} |
+ |
+void kern_set_frames() |
+{ |
+ FAB_print(NULL,"settaggio..."); |
+ FAB_frame_border_set(frame_bca,border_blu7,7,FAB_rgb(255,0,0)); |
+ FAB_frame_color_set(frame_bca,0,image_bca,FAB_green); |
+ FAB_frame_border_set(frame_misure_oriz,border_verde7,7,FRAME_MISURE_LINE_COLOR); |
+ FAB_frame_color_set(frame_misure_oriz,0,NULL,FRAME_MISURE_BACK_COLOR); |
+ FAB_frame_border_set(frame_misure_vert,border_verde7,7,FRAME_MISURE_LINE_COLOR); |
+ FAB_frame_color_set(frame_misure_vert,0,NULL,FRAME_MISURE_BACK_COLOR); |
+ FAB_frame_border_set(frame_titolo,border_bianco7,7,FAB_white); |
+ FAB_frame_color_set(frame_titolo,0,NULL,FRAME_TITOLO_BACK_COLOR1); |
+ FAB_frame_border_set(frame_comandi,border_giallo7,7,FAB_yellow); |
+ FAB_frame_color_set(frame_comandi,0,NULL,FRAME_COMANDI_BACK_COLOR1); |
+ FAB_frame_border_set(frame_control,border_verde7,7,FAB_green); |
+ FAB_frame_color_set(frame_control,0,NULL,FRAME_CONTROL_BACK_COLOR); |
+ |
+ FAB_print(NULL,"fatto"); |
+} |
+ |
+void kern_alloc_borders() |
+{ |
+ int test=0; |
+ |
+ FAB_print("FAB_BORDERs","allocazione..."); |
+ border_blu7 = FAB_border_alloc(7); |
+ if (border_blu7==NULL) test=1; |
+ border_verde7 = FAB_border_alloc(7); |
+ if (border_verde7==NULL) test=1; |
+ border_rosso7 = FAB_border_alloc(7); |
+ if (border_rosso7==NULL) test=1; |
+ border_bianco7 = FAB_border_alloc(7); |
+ if (border_bianco7==NULL) test=1; |
+ border_giallo7 = FAB_border_alloc(7); |
+ if (border_giallo7==NULL) test=1; |
+ |
+ FAB_msg(test,"fatto","almeno un bordo non allocato"); |
+} |
+void kern_free_borders() |
+{ |
+ FAB_border_free(border_blu7); |
+ FAB_border_free(border_verde7); |
+ FAB_border_free(border_rosso7); |
+ FAB_border_free(border_bianco7); |
+ FAB_border_free(border_giallo7); |
+} |
+ |
+void kern_set_borders() |
+{ |
+ FAB_print(NULL,"settaggio..."); |
+ border_blu7->buf[0]=FAB_rgb( 0, 0, 50); |
+ border_blu7->buf[1]=FAB_rgb( 0, 50,200); |
+ border_blu7->buf[2]=FAB_rgb( 50,100,255); |
+ border_blu7->buf[3]=FAB_rgb(100,150,255); |
+ border_blu7->buf[4]=FAB_rgb( 50,100,255); |
+ border_blu7->buf[5]=FAB_rgb( 0, 50,200); |
+ border_blu7->buf[6]=FAB_rgb( 0, 0, 50); |
+ |
+ border_verde7->buf[0]=FAB_rgb( 0, 50, 0); |
+ border_verde7->buf[1]=FAB_rgb( 0,100, 50); |
+ border_verde7->buf[2]=FAB_rgb( 50,255,100); |
+ border_verde7->buf[3]=FAB_rgb(100,255,150); |
+ border_verde7->buf[4]=FAB_rgb( 50,255,100); |
+ border_verde7->buf[5]=FAB_rgb( 0,100, 50); |
+ border_verde7->buf[6]=FAB_rgb( 0, 50, 0); |
+ |
+ border_rosso7->buf[0]=FAB_rgb( 50, 0, 0); |
+ border_rosso7->buf[1]=FAB_rgb(200, 25, 25); |
+ border_rosso7->buf[2]=FAB_rgb(255, 75, 75); |
+ border_rosso7->buf[3]=FAB_rgb(255,125,125); |
+ border_rosso7->buf[4]=FAB_rgb(255, 75, 75); |
+ border_rosso7->buf[5]=FAB_rgb(200, 25, 25); |
+ border_rosso7->buf[6]=FAB_rgb( 50, 0, 0); |
+ |
+ border_bianco7->buf[0]=FAB_rgb( 25, 25, 25); |
+ border_bianco7->buf[1]=FAB_rgb( 75, 75, 75); |
+ border_bianco7->buf[2]=FAB_rgb(125,125,125); |
+ border_bianco7->buf[3]=FAB_rgb(255,255,255); |
+ border_bianco7->buf[4]=FAB_rgb(125,125,125); |
+ border_bianco7->buf[5]=FAB_rgb( 75, 75, 75); |
+ border_bianco7->buf[6]=FAB_rgb( 25, 25, 25); |
+ |
+ border_giallo7->buf[0]=FAB_rgb( 25, 25, 0); |
+ border_giallo7->buf[1]=FAB_rgb(115,115, 25); |
+ border_giallo7->buf[2]=FAB_rgb(170,170, 75); |
+ border_giallo7->buf[3]=FAB_rgb(255,255,100); |
+ border_giallo7->buf[4]=FAB_rgb(170,170, 75); |
+ border_giallo7->buf[5]=FAB_rgb(115,115, 25); |
+ border_giallo7->buf[6]=FAB_rgb( 25, 25, 0); |
+ |
+ FAB_print(NULL,"fatto"); |
+} |
+ |
+void kern_alloc_images() |
+{ |
+ int j,test=0; |
+ |
+ FAB_print("FAB_IMAGEs","allocazione..."); |
+ |
+ image_missile[0] = FAB_image_alloc(MISSILE_LX,MISSILE_LY); |
+ if (image_missile[0]==NULL) test=1; |
+ image_missile[1] = FAB_image_alloc(MISSILE_LX,MISSILE_LY); |
+ if (image_missile[1]==NULL) test=1; |
+ |
+ for (j=0; j<2; j++) { |
+ image_cannone[j] = FAB_image_alloc(CANNONE_LX,CANNONE_LY); |
+ if (image_cannone[j]==NULL) test=1; |
+ } |
+ |
+ for (j=0; j<4; j++) { |
+ image_aereo[j] = FAB_image_alloc(AEREO_LX,AEREO_LY); |
+ if (image_aereo[j]==NULL) test=1; |
+ } |
+ |
+ for (j=0; j<5; j++) { |
+ image_esplo[j] = FAB_image_alloc(ESPLO_LX,ESPLO_LY); |
+ if (image_esplo[j]==NULL) test=1; |
+ } |
+ |
+ image_sfondo = FAB_image_alloc(96,96); |
+ if (image_sfondo==NULL) test=1; |
+ |
+ image_bca = FAB_image_alloc(500,500); |
+ if (image_bca==NULL) test=1; |
+ |
+ FAB_msg(test,"fatto","almeno un'immagine non allocata"); |
+} |
+void kern_free_images() |
+{ |
+ int j; |
+ |
+ FAB_image_free(image_missile[0]); |
+ FAB_image_free(image_missile[1]); |
+ for (j=0; j<2; j++) FAB_image_free(image_cannone[j]); |
+ for (j=0; j<4; j++) FAB_image_free(image_aereo[j]); |
+ for (j=0; j<5; j++) FAB_image_free(image_esplo[j]); |
+ FAB_image_free(image_sfondo); |
+ FAB_image_free(image_bca); |
+} |
+ |
+void kern_load_images() |
+{ int test=0; |
+ |
+ FAB_print(NULL,"caricamento dai file..."); |
+ |
+ FAB_print(NULL," [missile1.raw]..."); |
+ if(FAB_image_load(image_missile[0],"BCA_raw/missile1.raw")==-1) test=1; |
+ FAB_image_trasparent_set(image_missile[0],MISSILE_TRASPARENT_COL); |
+ FAB_print(NULL," [missile2.raw]..."); |
+ if(FAB_image_load(image_missile[1],"BCA_raw/missile2.raw")==-1) test=1; |
+ FAB_image_trasparent_set(image_missile[1],MISSILE_TRASPARENT_COL); |
+ |
+ FAB_print(NULL," [aereo1.raw]..."); |
+ if(FAB_image_load(image_aereo[0],"BCA_raw/aereo1.raw")==-1) test=1; |
+ FAB_image_trasparent_set(image_aereo[0],AEREO_TRASPARENT_COL); |
+ FAB_print(NULL," [aereo2.raw]..."); |
+ if(FAB_image_load(image_aereo[1],"BCA_raw/aereo2.raw")==-1) test=1; |
+ FAB_image_trasparent_set(image_aereo[1],AEREO_TRASPARENT_COL); |
+ FAB_print(NULL," [aereo1_h.raw]..."); |
+ if(FAB_image_load(image_aereo[2],"BCA_raw/aereo1_h.raw")==-1) test=1; |
+ FAB_image_trasparent_set(image_aereo[2],AEREO_TRASPARENT_COL); |
+ FAB_print(NULL," [aereo2_h.raw]..."); |
+ if(FAB_image_load(image_aereo[3],"BCA_raw/aereo2_h.raw")==-1) test=1; |
+ FAB_image_trasparent_set(image_aereo[3],AEREO_TRASPARENT_COL); |
+ |
+ FAB_print(NULL," [cannon.raw]..."); |
+ if(FAB_image_load(image_cannone[0],"BCA_raw/cannon.raw")==-1) test=1; |
+ FAB_image_trasparent_set(image_cannone[0],CANNONE_TRASPARENT_COL); |
+ FAB_print(NULL," [cannon_h.raw]..."); |
+ if(FAB_image_load(image_cannone[1],"BCA_raw/cannon_h.raw")==-1) test=1; |
+ FAB_image_trasparent_set(image_cannone[1],CANNONE_TRASPARENT_COL); |
+ |
+ FAB_print(NULL," [esplo1.raw]..."); |
+ if(FAB_image_load(image_esplo[0],"BCA_raw/esplo1.raw")==-1) test=1; |
+ FAB_image_trasparent_set(image_esplo[0],ESPLO_TRASPARENT_COL); |
+ FAB_print(NULL," [esplo2.raw]..."); |
+ if(FAB_image_load(image_esplo[1],"BCA_raw/esplo2.raw")==-1) test=1; |
+ FAB_image_trasparent_set(image_esplo[1],ESPLO_TRASPARENT_COL); |
+ FAB_print(NULL," [esplo3.raw]..."); |
+ if(FAB_image_load(image_esplo[2],"BCA_raw/esplo3.raw")==-1) test=1; |
+ FAB_image_trasparent_set(image_esplo[2],ESPLO_TRASPARENT_COL); |
+ FAB_print(NULL," [esplo4.raw]..."); |
+ if(FAB_image_load(image_esplo[3],"BCA_raw/esplo4.raw")==-1) test=1; |
+ FAB_image_trasparent_set(image_esplo[3],ESPLO_TRASPARENT_COL); |
+ FAB_print(NULL," [esplo5.raw]..."); |
+ if(FAB_image_load(image_esplo[4],"BCA_raw/esplo5.raw")==-1) test=1; |
+ FAB_image_trasparent_set(image_esplo[4],ESPLO_TRASPARENT_COL); |
+ |
+ FAB_print(NULL," [sfondo.raw]..."); |
+ if(FAB_image_load(image_sfondo,"BCA_raw/sfondo.raw")==-1) test=1; |
+ FAB_image_no_trasparent_set(image_sfondo); |
+ |
+ FAB_print(NULL," [bca.raw]..."); |
+ if(FAB_image_load(image_bca,"BCA_raw/bca.raw")==-1) test=1; |
+ FAB_image_no_trasparent_set(image_bca); |
+ |
+ FAB_msg(test,"fatto","almeno un file non esiste oppure ha un formato incompatibile"); |
+} |
+ |
+// *** Corpo delle funzioni in CA.h *** // |
+void kern_init_bca() |
+{ |
+ FAB_clr(); |
+ |
+ kern_alloc_task_tables(); |
+ kern_set_task_tables(); |
+ |
+ kern_alloc_borders(); |
+ kern_set_borders(); |
+ kern_alloc_images(); |
+ kern_load_images(); |
+ kern_alloc_frames(); |
+ kern_set_frames(); |
+ kern_alloc_ballframes(); |
+ kern_set_ballframes(); |
+} |
+ |
+//----------------------END-------------------------- |
+#endif |
Index: rel_1_5_beta1/bca/makefile |
=================================================================== |
--- rel_1_5_beta1/bca/makefile (nonexistent) |
+++ rel_1_5_beta1/bca/makefile (revision 1557) |
@@ -0,0 +1,16 @@ |
+# |
+# |
+# |
+ |
+ifndef BASE |
+BASE=../.. |
+endif |
+include $(BASE)/config/config.mk |
+ |
+PROGS= bca |
+ |
+include $(BASE)/config/example.mk |
+ |
+bca: |
+ make -f $(SUBMAKE) APP=bca INIT= OTHEROBJS="initfile.o fab_lib.o bca_lib.o" SHARKOPT="__LINUXC26__ __PCI__ __INPUT__ __FB__" |
+ |
Index: rel_1_5_beta1/bca/fab_lib/fab_msg.h |
=================================================================== |
--- rel_1_5_beta1/bca/fab_lib/fab_msg.h (nonexistent) |
+++ rel_1_5_beta1/bca/fab_lib/fab_msg.h (revision 1557) |
@@ -0,0 +1,94 @@ |
+/* |
+ * Project: S.Ha.R.K. |
+ * |
+ * Coordinators: |
+ * Giorgio Buttazzo <giorgio@sssup.it> |
+ * Paolo Gai <pj@gandalf.sssup.it> |
+ * |
+ * Authors : |
+ * Paolo Gai <pj@gandalf.sssup.it> |
+ * Massimiliano Giorgi <massy@gandalf.sssup.it> |
+ * Luca Abeni <luca@gandalf.sssup.it> |
+ * (see the web pages for full authors list) |
+ * |
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
+ * |
+ * http://www.sssup.it |
+ * http://retis.sssup.it |
+ * http://shark.sssup.it |
+ */ |
+ |
+/* CVS : $Id: fab_msg.h,v 1.2 2004-05-23 08:59:28 giacomo Exp $ */ |
+ |
+/* |
+ * Copyright (C) 2000 Fabio Calabrese <fabiocalabrese77@yahoo.it> |
+ * |
+ * 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 |
+ * |
+ */ |
+ |
+/**************************************************** |
+ * * |
+ * file: FAB_msg.h * |
+ * libreria: FAB_LIB * |
+ * version: 1.0 25/08/2002 * |
+ * creato da: Fabio CALABRESE * |
+ * * |
+ **************************************************** |
+ * * |
+ * descrizione: libreria di funzioni per stampare * |
+ * messaggi circa il corretto esito * |
+ * dell'esecuzione delle istruzioni; * |
+ * stampa semplici stringhe colorate; * |
+ * aiuta a fare il debbuging. * |
+ * * |
+ ****************************************************/ |
+ |
+#ifndef __FAB_LIB__FAB_msg_h__ |
+#define __FAB_LIB__FAB_msg_h__ |
+//-------------------BEGIN--------------------------- |
+ |
+// *** Librerie di S.Ha.R.K. *** |
+#include <ll/i386/cons.h> |
+// *** Librerie Standard C *** |
+// *** Librerie FAB *** |
+ |
+// ----------- |
+// Definizioni |
+//---------------------- |
+#define FAB_EXIT_YES 1 |
+#define FAB_EXIT_NO 0 |
+#define FAB_EMPTY_MSG "" |
+//---------------------- |
+ |
+// ---------------- |
+// Funzioni & Macro |
+//------------------------------------------------- |
+#define FAB_newline() NL() |
+#define FAB_home() HOME() |
+#define FAB_clr() clear() |
+ |
+void FAB_print(char * InitMsg, char * msg); |
+#define FAB_msg(TEST,OKMSG,ERRORMSG) __FAB_go((TEST),(OKMSG),(ERRORMSG),FAB_EXIT_NO) |
+#define FAB_go(TEST,OKMSG,ERRORMSG,EXITFLAG) __FAB_go((TEST),(OKMSG),(ERRORMSG),(EXITFLAG)) |
+//-------------------------------------------------- |
+ |
+ |
+// Altro... |
+ |
+void __FAB_go(int test, char * OkMsg, char * ErrorMsg,int EXITflag); |
+ |
+//----------------------END-------------------------- |
+#endif |
Index: rel_1_5_beta1/bca/fab_lib/fab_grx.h |
=================================================================== |
--- rel_1_5_beta1/bca/fab_lib/fab_grx.h (nonexistent) |
+++ rel_1_5_beta1/bca/fab_lib/fab_grx.h (revision 1557) |
@@ -0,0 +1,203 @@ |
+/* |
+ * Project: S.Ha.R.K. |
+ * |
+ * Coordinators: |
+ * Giorgio Buttazzo <giorgio@sssup.it> |
+ * Paolo Gai <pj@gandalf.sssup.it> |
+ * |
+ * Authors : |
+ * Paolo Gai <pj@gandalf.sssup.it> |
+ * Massimiliano Giorgi <massy@gandalf.sssup.it> |
+ * Luca Abeni <luca@gandalf.sssup.it> |
+ * (see the web pages for full authors list) |
+ * |
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
+ * |
+ * http://www.sssup.it |
+ * http://retis.sssup.it |
+ * http://shark.sssup.it |
+ */ |
+ |
+/* CVS : $Id: fab_grx.h,v 1.3 2004-05-23 08:59:28 giacomo Exp $ */ |
+ |
+/* |
+ * Copyright (C) 2000 Fabio Calabrese <fabiocalabrese77@yahoo.it> |
+ * |
+ * 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 |
+ * |
+ */ |
+ |
+/**************************************************** |
+ * * |
+ * file: FAB_grx.h * |
+ * libreria: FAB_LIB * |
+ * version: 1.0 25/08/2002 * |
+ * creato da: Fabio CALABRESE * |
+ * * |
+ **************************************************** |
+ * * |
+ * descrizione: libreria di funzioni grafiche: * |
+ * permette di gestire con facilita' * |
+ * immagini, cornici, e veri e propri * |
+ * pannelli colorati. * |
+ * Il contesto di grafica va avviato * |
+ * con FAB_grx_open() e alla fine * |
+ * chiuso correttamente con la funz. * |
+ * FAB_grx_close(). L'ambiente di * |
+ * grafica e'impostato a 16bit per * |
+ * default, comunque e' sempre * |
+ * possibile scegliere la profondita' * |
+ * di colori preferita tra 15/16/24/32* |
+ * definendo semplicemente solo una * |
+ * delle seguenti costanti all'inizio * |
+ * del proprio programma che include * |
+ * questa libreria grafica: * |
+ * FAB_GRX_15 * |
+ * FAB_GRX_16 (default) * |
+ * FAB_GRX_24 * |
+ * FAB_GRX_32 * |
+ * * |
+ ****************************************************/ |
+ |
+#ifndef __FAB_LIB_fab_grx_h__ |
+#define __FAB_LIB_fab_grx_h__ |
+//-------------------BEGIN--------------------------- |
+ |
+// *** Librerie di S.Ha.R.K. *** |
+#include <kernel/kern.h> |
+#include <ll/sys/types.h> |
+ |
+#include <drivers/shark_fb26.h> |
+ |
+// *** Librerie Standard C *** |
+// *** Librerie FAB *** |
+#include"fab_grx.sys" |
+ |
+//#define FAB_GRX_15 |
+//#define FAB_GRX_16 |
+//#define FAB_GRX_24 |
+//#define FAB_GRX_32 |
+ |
+typedef __FAB_COLOR COLOR; |
+ |
+typedef struct { |
+ WORD lx,ly; |
+ COLOR * buf; |
+ int trasparent; |
+ COLOR trasparent_col; |
+ } FAB_IMAGE; |
+ |
+typedef struct { |
+ WORD dim; |
+ COLOR * buf; |
+ } FAB_BORDER; |
+ |
+typedef struct { |
+ FAB_BORDER * border; //default = NULL |
+ WORD border_dim; //default = 0 |
+ COLOR border_col; |
+ |
+ BYTE trasparent; //default = 0 |
+ FAB_IMAGE * image; //default = NULL |
+ COLOR color; |
+ |
+ WORD x0,y0,x1,y1; //spigoli pannello interno |
+ //cornice esclusa: vengono settati |
+ //automaticamente con FAB_frame_put(). |
+ } FAB_FRAME; |
+typedef struct { |
+ FAB_BORDER * border; //default = NULL |
+ WORD border_dim; //default = 0 |
+ COLOR border_col; |
+ |
+ BYTE trasparent; //default = 0 |
+ COLOR color; |
+ |
+ WORD cx,cy,r; //centro e raggio del pannello |
+ //circolare: vengono settati |
+ //automaticamente con FAB_ballframe_put(). |
+ } FAB_BALLFRAME; |
+ |
+// ----------- |
+// Definizioni |
+//---------------------- |
+#define FAB_BPP __FAB_BPP |
+#define FAB_rgb(R24,G24,B24) __FAB_rgb((R24),(G24),(B24)) |
+ |
+// Colori base |
+#define FAB_white FAB_rgb(255,255,255) |
+#define FAB_black FAB_rgb( 0, 0, 0) |
+#define FAB_red FAB_rgb(255, 0, 0) |
+#define FAB_green FAB_rgb( 0,255, 0) |
+#define FAB_blue FAB_rgb( 0, 0,255) |
+#define FAB_yellow FAB_rgb(255,255, 0) |
+#define FAB_gray FAB_rgb(100,100,100) |
+ |
+//---------------------- |
+ |
+// ---------------- |
+// Funzioni & Macro |
+//-------------------------------------------------- |
+int FAB_grx_open(WORD lx, WORD ly); |
+void FAB_grx_close(); |
+ |
+FAB_IMAGE* FAB_image_alloc(WORD lx, WORD ly); //richiede DISABLED INTERRUPTS |
+void FAB_image_free(FAB_IMAGE* image); //richiede DISABLED INTERRUPTS |
+FAB_BORDER* FAB_border_alloc(WORD dim); //richiede DISABLED INTERRUPTS |
+void FAB_border_free(FAB_BORDER * border);//richiede DISABLED INTERRUPTS |
+FAB_FRAME* FAB_frame_alloc(); //richiede DISABLED INTERRUPTS |
+void FAB_frame_free(FAB_FRAME * frame); //richiede DISABLED INTERRUPTS |
+FAB_BALLFRAME* FAB_ballframe_alloc(); //richiede DISABLED INTERRUPTS |
+void FAB_ballframe_free(FAB_BALLFRAME * frame);//richiede DISABLED INTERRUPTS |
+ |
+// Permette di riempire lo spazio allocato ad un FAB_IMAGE |
+// leggendo le sequenze rgb a 24bit da un file immagine binario. |
+// Un formato perfettamente compatibile quello |
+// "RAW"(con header=0 e sequenza ad ordinamento RGB-RGB-RGB...): |
+int FAB_image_load(FAB_IMAGE* image, char* file_name); // solo in __kernel_register_levels__() |
+// Per default un FAB_IMAGE non ha il colore di trasparenza: |
+#define FAB_image_no_trasparent_set(IMAGE) (IMAGE)->trasparent=0 |
+#define FAB_image_trasparent_set(IMAGE,TRASPARENT_COL) (IMAGE)->trasparent=1;(IMAGE)->trasparent_col=(TRASPARENT_COL) |
+ |
+// Settaggio FAB_BORDER deve essere fatto manualmente! |
+// esempio: |
+// mio_border->buf[i] = FAB_rgb(0,100,0); |
+// ... |
+// mio_border->buf[N] = FAB_rgb(0,100,255); |
+// (non esiste una funzione FAB_border_set) |
+ |
+#define FAB_frame_border_set(FRAME,BORDER,BORDER_DIM,BORDER_COL) (FRAME)->border=(BORDER);(FRAME)->border_dim=(BORDER_DIM);(FRAME)->border_col=(BORDER_COL); |
+#define FAB_frame_color_set(FRAME,TRASPARENT_FLAG,IMAGE,COLOR) (FRAME)->trasparent=(TRASPARENT_FLAG);(FRAME)->image=(IMAGE);(FRAME)->color=(COLOR); |
+#define FAB_ballframe_border_set(FRAME,BORDER,BORDER_DIM,BORDER_COL) (FRAME)->border=(BORDER);(FRAME)->border_dim=(BORDER_DIM);(FRAME)->border_col=(BORDER_COL); |
+#define FAB_ballframe_color_set(FRAME,TRASPARENT_FLAG,COLOR) (FRAME)->trasparent=(TRASPARENT_FLAG);(FRAME)->color=(COLOR); |
+ |
+void FAB_ball_put(WORD cx, WORD cy, WORD r, COLOR c); |
+void FAB_image_get(FAB_IMAGE* image, WORD x, WORD y, WORD lx, WORD ly); |
+void FAB_image_put(FAB_IMAGE* image, WORD x, WORD y); |
+void FAB_image_put_within(FAB_IMAGE* image, WORD x0, WORD y0, |
+ WORD xx0, WORD yy0, WORD xx1, WORD yy1); |
+void FAB_image_copy(FAB_IMAGE* orig_image, FAB_IMAGE* dest_image); |
+void FAB_image_color_change(FAB_IMAGE* image, COLOR old_col, COLOR new_col); |
+void FAB_image_fill(FAB_IMAGE* image, WORD x0, WORD y0, WORD lx, WORD ly); |
+void FAB_border_put(FAB_BORDER* border, WORD x0, WORD y0, WORD x1, WORD y1); |
+void FAB_ballborder_put(FAB_BORDER* border, WORD cx, WORD cy, WORD r_int); |
+void FAB_frame_put(FAB_FRAME* frame, WORD x0, WORD y0, WORD lx, WORD ly); |
+void FAB_ballframe_put(FAB_BALLFRAME* frame, WORD cx, WORD cy, WORD r); |
+//-------------------------------------------------- |
+ |
+// Altro... |
+ |
+//---------------------END--------------------------- |
+#endif |
Index: rel_1_5_beta1/bca/fab_lib/fab_show.h |
=================================================================== |
--- rel_1_5_beta1/bca/fab_lib/fab_show.h (nonexistent) |
+++ rel_1_5_beta1/bca/fab_lib/fab_show.h (revision 1557) |
@@ -0,0 +1,83 @@ |
+/* |
+ * Project: S.Ha.R.K. |
+ * |
+ * Coordinators: |
+ * Giorgio Buttazzo <giorgio@sssup.it> |
+ * Paolo Gai <pj@gandalf.sssup.it> |
+ * |
+ * Authors : |
+ * Paolo Gai <pj@gandalf.sssup.it> |
+ * Massimiliano Giorgi <massy@gandalf.sssup.it> |
+ * Luca Abeni <luca@gandalf.sssup.it> |
+ * (see the web pages for full authors list) |
+ * |
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
+ * |
+ * http://www.sssup.it |
+ * http://retis.sssup.it |
+ * http://shark.sssup.it |
+ */ |
+ |
+/* CVS : $Id: fab_show.h,v 1.2 2002-10-01 10:33:52 pj Exp $ */ |
+ |
+/* |
+ * Copyright (C) 2000 Fabio Calabrese <fabiocalabrese77@yahoo.it> |
+ * |
+ * 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 |
+ * |
+ */ |
+ |
+/**************************************************** |
+ * * |
+ * file: FAB_show.h * |
+ * libreria: FAB_LIB * |
+ * version: 1.0 25/08/2002 * |
+ * creato da: Fabio CALABRESE * |
+ * * |
+ **************************************************** |
+ * * |
+ * descrizione: libreria di funzioni per stampare * |
+ * specifiche informazioni utili * |
+ * riguardo lo stato del sistema. * |
+ * * |
+ ****************************************************/ |
+ |
+#ifndef __FAB_LIB__FAB_show_h__ |
+#define __FAB_LIB__FAB_show_h__ |
+//-------------------BEGIN--------------------------- |
+ |
+// *** Librerie S.Ha.R.K *** |
+ |
+// *** Librerie Standard C *** |
+ |
+// *** Librerie FAB *** |
+#include "fab_msg.h" |
+ |
+// ----------- |
+// Definizioni |
+//---------------------- |
+//---------------------- |
+ |
+// ---------------- |
+// Funzioni & Macro |
+//------------------------------------------------- |
+void FAB_show_sched_modules(); |
+//-------------------------------------------------- |
+ |
+ |
+// Altro... |
+ |
+//----------------------END-------------------------- |
+#endif |
Index: rel_1_5_beta1/bca/fab_lib/fab_grx.sys |
=================================================================== |
--- rel_1_5_beta1/bca/fab_lib/fab_grx.sys (nonexistent) |
+++ rel_1_5_beta1/bca/fab_lib/fab_grx.sys (revision 1557) |
@@ -0,0 +1,71 @@ |
+/* |
+ * Project: S.Ha.R.K. |
+ * |
+ * Coordinators: |
+ * Giorgio Buttazzo <giorgio@sssup.it> |
+ * Paolo Gai <pj@gandalf.sssup.it> |
+ * |
+ * Authors : |
+ * Paolo Gai <pj@gandalf.sssup.it> |
+ * Massimiliano Giorgi <massy@gandalf.sssup.it> |
+ * Luca Abeni <luca@gandalf.sssup.it> |
+ * (see the web pages for full authors list) |
+ * |
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
+ * |
+ * http://www.sssup.it |
+ * http://retis.sssup.it |
+ * http://shark.sssup.it |
+ */ |
+ |
+/* CVS : $Id: fab_grx.sys,v 1.1 2002-10-01 10:25:02 pj Exp $ */ |
+ |
+/* |
+ * Copyright (C) 2000 Fabio Calabrese <fabiocalabrese77@yahoo.it> |
+ * |
+ * 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 |
+ * |
+ */ |
+ |
+// file incluso da FAB_grx.h |
+// ------------------------- |
+ |
+typedef BYTE COLOR8; |
+typedef WORD COLOR15; |
+typedef WORD COLOR16; |
+typedef DWORD COLOR24; |
+typedef DWORD COLOR32; |
+ |
+#if defined FAB_GRX_15 |
+ #define __FAB_BPP 15 |
+ #define __FAB_rgb(R24,G24,B24) rgb15((R24),(G24),(B24)) |
+ typedef COLOR15 __FAB_COLOR; |
+#elif defined FAB_GRX_16 |
+ #define __FAB_BPP 16 |
+ #define __FAB_rgb(R24,G24,B24) rgb16((R24),(G24),(B24)) |
+ typedef COLOR16 __FAB_COLOR; |
+#elif defined FAB_GRX_24 |
+ #define __FAB_BPP 24 |
+ #define __FAB_rgb(R24,G24,B24) rgb24((R24),(G24),(B24)) |
+ typedef COLOR24 __FAB_COLOR; |
+#elif defined FAB_GRX_32 |
+ #define __FAB_BPP 32 |
+ #define __FAB_rgb(R24,G24,B24) rgb32((R24),(G24),(B24)) |
+ typedef COLOR32 __FAB_COLOR; |
+#else |
+ #define __FAB_BPP 16 |
+ #define __FAB_rgb(R24,G24,B24) rgb16((R24),(G24),(B24)) |
+ typedef COLOR16 __FAB_COLOR; |
+#endif |
Index: rel_1_5_beta1/bca/fab_lib/fab_tool.h |
=================================================================== |
--- rel_1_5_beta1/bca/fab_lib/fab_tool.h (nonexistent) |
+++ rel_1_5_beta1/bca/fab_lib/fab_tool.h (revision 1557) |
@@ -0,0 +1,90 @@ |
+/* |
+ * Project: S.Ha.R.K. |
+ * |
+ * Coordinators: |
+ * Giorgio Buttazzo <giorgio@sssup.it> |
+ * Paolo Gai <pj@gandalf.sssup.it> |
+ * |
+ * Authors : |
+ * Paolo Gai <pj@gandalf.sssup.it> |
+ * Massimiliano Giorgi <massy@gandalf.sssup.it> |
+ * Luca Abeni <luca@gandalf.sssup.it> |
+ * (see the web pages for full authors list) |
+ * |
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
+ * |
+ * http://www.sssup.it |
+ * http://retis.sssup.it |
+ * http://shark.sssup.it |
+ */ |
+ |
+/* CVS : $Id: fab_tool.h,v 1.1 2002-10-01 10:25:03 pj Exp $ */ |
+ |
+/* |
+ * Copyright (C) 2000 Fabio Calabrese <fabiocalabrese77@yahoo.it> |
+ * |
+ * 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 |
+ * |
+ */ |
+ |
+/**************************************************** |
+ * * |
+ * file: FAB_tool.h * |
+ * libreria: FAB_LIB * |
+ * version: 1.0 25/08/2002 * |
+ * creato da: Fabio CALABRESE * |
+ * * |
+ **************************************************** |
+ * * |
+ * descrizione: tool di funzioni d'utilita' * |
+ * * |
+ ****************************************************/ |
+ |
+#ifndef __FAB_LIB__FAB_tool_h__ |
+#define __FAB_LIB__FAB_tool_h__ |
+//-------------------BEGIN--------------------------- |
+ |
+// *** Librerie S.Ha.R.K *** |
+// *** Librerie Standard C *** |
+#include <stdlib.h> |
+#include <math.h> |
+// *** Librerie FAB *** |
+ |
+// ----------- |
+// Definizioni |
+//---------------------- |
+//---------------------- |
+ |
+// ---------------- |
+// Funzioni & Macro |
+//------------------------------------------------- |
+#define FAB_PI 3.141592654 |
+#define FAB_grad(RADIANTI) RADIANTI/FAB_PI*180 |
+#define FAB_rad(GRADI) GRADI/180.0*FAB_PI |
+#define FAB_set_ang360(ANGOLO,X,Y) if ((X)>0) {if((Y)>0) (ANGOLO)=atan((Y)/(double)(X));else if((Y)<0) (ANGOLO)=atan((Y)/(double)(X))+2*FAB_PI;else (ANGOLO)=0;}else if ((X)<0) (ANGOLO)=atan((Y)/(double)(X))+FAB_PI;else /* X==0 */if ((Y)>0) (ANGOLO)=FAB_PI/2;else if ((Y)<0) (ANGOLO)=FAB_PI/2+FAB_PI;else /* Y==0 */ (ANGOLO)=-1; /* X=Y=0 */ |
+#define FAB_set_xy360(X,Y,MODULO,ANGOLO) (X)=(MODULO)*cos(ANGOLO);(Y)=(MODULO)*sin(ANGOLO); |
+ |
+#define FAB_ABS(X) ((X) > 0 ? (X) : (X)*-1) |
+ |
+#define FAB_sign_rand() (rand()%2 ? -1 : +1) |
+#define FAB_int_rand(MIN,MAX ) ((MIN) + rand()%((MAX)-(MIN)+1)) |
+#define FAB_double_rand(MIN,MAX) ((MIN) + ((MAX)-(MIN))*((double)rand()/RAND_MAX)) |
+//-------------------------------------------------- |
+ |
+ |
+// Altro... |
+ |
+//----------------------END-------------------------- |
+#endif |
Index: rel_1_5_beta1/bca/bca.h |
=================================================================== |
--- rel_1_5_beta1/bca/bca.h (nonexistent) |
+++ rel_1_5_beta1/bca/bca.h (revision 1557) |
@@ -0,0 +1,288 @@ |
+/* |
+ * Project: S.Ha.R.K. |
+ * |
+ * Coordinators: |
+ * Giorgio Buttazzo <giorgio@sssup.it> |
+ * Paolo Gai <pj@gandalf.sssup.it> |
+ * |
+ * Authors : |
+ * Paolo Gai <pj@gandalf.sssup.it> |
+ * Massimiliano Giorgi <massy@gandalf.sssup.it> |
+ * Luca Abeni <luca@gandalf.sssup.it> |
+ * (see the web pages for full authors list) |
+ * |
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
+ * |
+ * http://www.sssup.it |
+ * http://retis.sssup.it |
+ * http://shark.sssup.it |
+ */ |
+ |
+/* CVS : $Id: bca.h,v 1.2 2002-10-01 10:33:51 pj Exp $ */ |
+ |
+/* |
+ * Copyright (C) 2000 Fabio Calabrese <fabiocalabrese77@yahoo.it> |
+ * |
+ * 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 |
+ * |
+ */ |
+ |
+/**************************************************** |
+ * * |
+ * file: bca.h * |
+ * included by: bca.c & bca_lib di cui fa da header* |
+ * data: 15/09/2002 * |
+ * creato da: Fabio CALABRESE * |
+ * * |
+ ****************************************************** |
+ * * |
+ * descrizione: contiene la definizione di variabili * |
+ * e strutture globali, con un corredo * |
+ * di macro e funzioni per la loro * |
+ * gestione, usate nel programma SHaRK * |
+ * "(B)ase(C)ontr(A)rea", il cui codice * |
+ * e' scritto nel file bca.c; * |
+ * il file bca_lib.c contiene il corpo * |
+ * di tutte le funzioni qui dichiarate. * |
+ * * |
+ ******************************************************/ |
+ |
+#ifndef __BCA_H__ |
+#define __BCA_H__ |
+//----------------BEGIN------------------ |
+ |
+// *** Librerie S.Ha.R.K *** |
+// *** Librerie Standard C *** |
+// *** Librerie FAB *** |
+#include"fab_lib/fab_grx.h" |
+#include"fab_lib/fab_tool.h" |
+// *** Librerie BCA *** |
+ |
+ |
+// --------------------------------- |
+// *** Elementi Grafici Generici *** |
+// --------------------------------- |
+ |
+// IMMAGINI: |
+FAB_IMAGE* image_sfondo; |
+FAB_IMAGE* image_bca; |
+FAB_IMAGE* image_aereo[4]; // 1 aereo per ogni direzione(soft e hard) |
+FAB_IMAGE* image_esplo[5]; // 5 immagini in sequenza simulanti |
+FAB_IMAGE* image_cannone[2]; // un esplosione |
+FAB_IMAGE* image_missile[2]; |
+ |
+// BORDI: |
+FAB_BORDER* border_blu7; |
+FAB_BORDER* border_verde7; |
+FAB_BORDER* border_rosso7; |
+FAB_BORDER* border_bianco7; |
+FAB_BORDER* border_giallo7; |
+ |
+// FRAME: |
+FAB_FRAME* frame_bca; |
+FAB_FRAME* frame_misure_oriz; |
+FAB_FRAME* frame_misure_vert; |
+FAB_FRAME* frame_misure_vert; |
+FAB_FRAME* frame_titolo; |
+FAB_FRAME* frame_comandi; |
+FAB_FRAME* frame_control; |
+ |
+// BALLFRAME: |
+FAB_BALLFRAME* ballframe_radar; |
+FAB_BALLFRAME* ballframe_lucerossa[3]; |
+ |
+// Base ContrAerea |
+#define BASE_L 1.0 // [Km]: lunghezza |
+#define BASE_H 2100 // [m]: altezza max di visibilita' |
+ |
+// Finestra Virtuale sullo schermo |
+#define FIN_X_MIN 20 // [pixel] |
+#define FIN_X_MAX 520-1 // [pixel] |
+#define FIN_Y_MIN 20 // [pixel] |
+#define FIN_Y_MAX 520-1 // [pixel] |
+// Inoltre si possono usare le seguenti + comode define |
+// con gli stessi valori: |
+#define X0 FIN_X_MIN |
+#define X1 FIN_X_MAX |
+#define Y0 FIN_Y_MIN |
+#define Y1 FIN_Y_MAX |
+// NB: non e' necessaria la proporzionalita' tra finestra |
+// reale(BASE_L*BASE_H) e virtuale((X1-X0)*(Y1-Y0))! |
+ |
+// Finestra Misure |
+#define FRAME_MISURE_LINE_COLOR FAB_green |
+#define FRAME_MISURE_BACK_COLOR FAB_black |
+#define FRAME_MISURE_ORIZ_LY 30 |
+#define FRAME_MISURE_VERT_LX 52 |
+ |
+// Finestra Titolo |
+#define FRAME_TITOLO_TEXT_COLOR1 FAB_yellow |
+#define FRAME_TITOLO_TEXT_COLOR2 FAB_white |
+#define FRAME_TITOLO_BACK_COLOR1 FAB_gray |
+#define FRAME_TITOLO_BACK_COLOR2 FAB_blue |
+ |
+// Finestra Comandi |
+#define FRAME_COMANDI_TEXT_COLOR1 FAB_yellow |
+#define FRAME_COMANDI_TEXT_COLOR2 FAB_white |
+#define FRAME_COMANDI_TEXT_COLOR3 FAB_red |
+#define FRAME_COMANDI_BACK_COLOR1 FAB_gray |
+#define FRAME_COMANDI_BACK_COLOR2 FAB_yellow |
+ |
+// Finestra Control |
+#define FRAME_CONTROL_TEXT_COLOR1 FAB_rgb( 50,255, 50) |
+#define FRAME_CONTROL_TEXT_COLOR2 FAB_rgb(150,255,150) |
+#define FRAME_CONTROL_BACK_COLOR FAB_black |
+ |
+// --------------------------------- |
+// *** Elementi Task Dummy_radar *** |
+// --------------------------------- |
+#define DUMMY_RADAR_GROUP 3 |
+#define DUMMY_RADAR_PERIOD 50000 |
+#define DUMMY_RADAR_WCET 400 |
+#define DUMMY_RADAR_MET 200 |
+ |
+// --------------------------------- |
+// *** Elementi Task Control *** |
+// --------------------------------- |
+#define CONTROL_PERIOD 50000 |
+#define CONTROL_WCET 400 |
+#define CONTROL_MET 300 |
+ |
+// --------------------------- |
+// *** Elementi Task Esplo *** |
+// --------------------------- |
+#define ESPLO_TRASPARENT_COL FAB_white |
+#define ESPLO_LX 40 |
+#define ESPLO_LY 40 |
+ |
+#define ESPLO_PERIOD 80000 |
+#define ESPLO_WCET 300 |
+#define ESPLO_MET 100 |
+ |
+// ----------------------------------- |
+// *** Elementi Task Aereo_Creator *** |
+// ----------------------------------- |
+#define AEREO_CREATOR_PERIOD 200000 |
+#define AEREO_CREATOR_WCET 300 |
+#define AEREO_CREATOR_MET 100 |
+ |
+// ----------------------------------- |
+// *** Elementi Task Cannone_Creator *** |
+// ----------------------------------- |
+#define CANNONE_CREATOR_PERIOD 1000000 |
+#define CANNONE_CREATOR_WCET 150 |
+#define CANNONE_CREATOR_MET 50 |
+ |
+// --------------------------- |
+// *** Elementi Task Aereo *** |
+// --------------------------- |
+#define AEREO_N_MAX 10 |
+#define AEREO_N_MIN 1 |
+ |
+#define AEREO_TRASPARENT_COL FAB_white |
+#define AEREO_BASE_COL FAB_green |
+#define AEREO_LX 32 |
+#define AEREO_LY 19 |
+#define AEREO_H_MIN 500 // [m]: altezza min di volo |
+#define AEREO_H_MAX 2000 // [m]: altezza max di volo (<BASE_H) |
+#define AEREO_L_MIN 0 // [km]: posizione 0 nella base |
+#define AEREO_L_MAX BASE_L // [km] posizione max nella base |
+#define AEREO_V_MIN 300.0 // [Km/h]: velocit min di volo |
+#define AEREO_V_MAX 500.0 // [Km/h]: velocit max di volo |
+#define AEREO_X_MIN X0 - AEREO_LX/2 |
+#define AEREO_X_MAX X1 + AEREO_LX/2 |
+ |
+#define AEREO_PERIOD 30000 |
+#define AEREO_WCET 1250 //Verificato! |
+#define AEREO_MET 800 |
+ |
+struct { BYTE status; //[0=free/1=occupato] |
+ BYTE killing; //richiesta uscita se 1 altrimenti 0 |
+ PID pid; |
+ COLOR color; |
+ FAB_IMAGE* image; |
+ double vel; //[km/h] |
+ int dir; //[+1/-1] |
+ WORD h; //[m] |
+ double l; //[km] |
+ WORD x, y; //[pixel] |
+ } aereo_table[AEREO_N_MAX]; |
+ |
+int aereo_count; |
+ |
+// ----------------------------- |
+// *** Elementi Task Cannone *** |
+// ----------------------------- |
+#define CANNONE_N_MAX 9 |
+#define CANNONE_N_MIN 1 |
+ |
+#define CANNONE_SENSIBILITA 200 //[m] |
+ |
+#define CANNONE_TRASPARENT_COL FAB_white |
+#define CANNONE_LX 33 |
+#define CANNONE_LY 15 |
+ |
+#define CANNONE_PERIOD 100000 |
+#define CANNONE_WCET 1000 |
+#define CANNONE_MET 100 |
+ |
+struct { BYTE status; //[0=free/1=occupato] |
+ BYTE killing; //richiesta uscita se 1 altrimenti 0 |
+ PID pid; |
+ BYTE fire; |
+ WORD x; |
+ double missile_vel; |
+ } cannone_table[CANNONE_N_MAX]; |
+ |
+int cannone_count; |
+ |
+// ----------------------------- |
+// *** Elementi Task Missile *** |
+// ----------------------------- |
+#define MISSILE_V_MIN 300.0 //[km/h] |
+#define MISSILE_V_MAX 5000.0 //[km/h] |
+#define MISSILE_ACC_MIN 100000.0 //[km/(h*h)] |
+#define MISSILE_ACC_MAX 10000000.0 //[km/(h*h)] |
+#define MISSILE_X_MAX X1 + MISSILE_LX/2 //[pixel] |
+#define MISSILE_X_MIN X0 - MISSILE_LX/2 //[pixel] |
+#define MISSILE_Y_MAX Y1 + MISSILE_LY/2 //[pixel] |
+#define MISSILE_Y_MIN Y0 - MISSILE_LY/2 //[pixel] |
+ |
+#define MISSILE_TRASPARENT_COL FAB_white |
+ |
+#define MISSILE_LX 7 //[pixel] |
+#define MISSILE_LY 15 //[pixel] |
+ |
+#define MISSILE_PERIOD 10000 |
+#define MISSILE_WCET 500 |
+#define MISSILE_MET 100 |
+ |
+ |
+ |
+ |
+ |
+// MUTEX: |
+mutex_t grx_mutex; //per l'accesso alla grafica |
+int app_mutex_init(mutex_t *m); |
+ |
+ |
+ |
+// FUNZIONI GESTIONE RISORSE DI MEMORIA: |
+void kern_init_bca(); |
+ |
+ |
+ |
+//------------------END------------------ |
+#endif |
Index: rel_1_5_beta1/bca/scenario.c |
=================================================================== |
--- rel_1_5_beta1/bca/scenario.c (nonexistent) |
+++ rel_1_5_beta1/bca/scenario.c (revision 1557) |
@@ -0,0 +1,168 @@ |
+/* |
+ * Project: S.Ha.R.K. |
+ * |
+ * Coordinators: |
+ * Giorgio Buttazzo <giorgio@sssup.it> |
+ * Paolo Gai <pj@gandalf.sssup.it> |
+ * |
+ * Authors : |
+ * Paolo Gai <pj@gandalf.sssup.it> |
+ * Massimiliano Giorgi <massy@gandalf.sssup.it> |
+ * Luca Abeni <luca@gandalf.sssup.it> |
+ * (see the web pages for full authors list) |
+ * |
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
+ * |
+ * http://www.sssup.it |
+ * http://retis.sssup.it |
+ * http://shark.sssup.it |
+ */ |
+ |
+/* CVS : $Id: scenario.c,v 1.1 2002-10-01 10:25:01 pj Exp $ */ |
+ |
+/* |
+ * Copyright (C) 2000 Fabio Calabrese <fabiocalabrese77@yahoo.it> |
+ * |
+ * 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 |
+ * |
+ */ |
+ |
+//*************************** |
+//* file: scenario.c * |
+//* included by: bca.c * |
+//*************************** |
+ |
+void scenario_ca() |
+{ //SFONDO |
+ FAB_image_fill(image_sfondo,0,0,800,600); |
+ |
+ //FRAME_BCA |
+ FAB_frame_put(frame_bca,X0-7,Y0-7,500+7*2,500+7*2); |
+} |
+void scenario_misure() |
+{ int x, y, cx, cy; |
+ char* str_km ="X.Xkm"; |
+ char* str_m ="XXXXm"; |
+ int h; |
+ |
+ //FRAME_MISURE orizzontale |
+ FAB_frame_put(frame_misure_oriz, X0-7, Y1+7+20-7, |
+ 500+7*2, FRAME_MISURE_ORIZ_LY+7*2); |
+ cy = frame_misure_oriz->y0 + 10; |
+ cx = frame_misure_oriz->x0 + |
+ (frame_misure_oriz->x1 - frame_misure_oriz->x0) / 2; |
+ for(x=frame_misure_oriz->x0 ;x<frame_misure_oriz->x1+1 ;x+=5) |
+ grx_line(x,cy,x+2,cy,FRAME_MISURE_LINE_COLOR); |
+ for(y=frame_misure_oriz->y0; y<cy-1; y+=5) { |
+ grx_line(frame_misure_oriz->x0,y,frame_misure_oriz->x0,y+2,FRAME_MISURE_LINE_COLOR); |
+ grx_line(cx,y,cx,y+2,FRAME_MISURE_LINE_COLOR); |
+ grx_line(frame_misure_oriz->x1,y,frame_misure_oriz->x1,y+2,FRAME_MISURE_LINE_COLOR); |
+ } |
+ sprintf(str_km,"%02.1fkm",0.0); |
+ grx_text(str_km,frame_misure_oriz->x0+10,cy+2,FRAME_MISURE_LINE_COLOR,frame_misure_oriz->color); |
+ sprintf(str_km,"%02.1fkm",BASE_L/2.0); |
+ grx_text(str_km,cx-10,cy+2,FRAME_MISURE_LINE_COLOR,frame_misure_oriz->color); |
+ sprintf(str_km,"%02.1fkm",BASE_L); |
+ grx_text(str_km,frame_misure_oriz->x1-FRAME_MISURE_ORIZ_LY,cy+2,FRAME_MISURE_LINE_COLOR,frame_misure_oriz->color); |
+ |
+ //FRAME_MISURE verticale |
+ FAB_frame_put(frame_misure_vert, X1+7+20-7, Y0-7, |
+ FRAME_MISURE_VERT_LX+7*2, 500+7*2); |
+ cy = frame_misure_vert->y0 + |
+ (frame_misure_vert->y1 - frame_misure_vert->y0) / 2; |
+ cx = frame_misure_vert->x0 + 10; |
+ for(y=frame_misure_vert->y1; y>frame_misure_vert->y0-1; y-=5) |
+ grx_line(cx,y,cx,y-2,FRAME_MISURE_LINE_COLOR); |
+ h=0; |
+ for(y=frame_misure_vert->y1; y>frame_misure_vert->y0-1; |
+ y-=500.0*(X1-X0)/BASE_H, h+=500) { |
+ for(x=frame_misure_vert->x0; x<cx-1; x+=5) |
+ grx_line(x,y,x+2,y,FRAME_MISURE_LINE_COLOR); |
+ sprintf(str_m,"%dm",h); |
+ grx_text(str_m, cx+2, y-6, |
+ FRAME_MISURE_LINE_COLOR, frame_misure_vert->color); |
+ } |
+} |
+void scenario_radar() |
+{ FAB_ballframe_put(ballframe_radar, |
+ frame_bca->x1+7+30, frame_bca->y1+7+30, 30); |
+ FAB_ballframe_put(ballframe_lucerossa[2],605,546,20); |
+ FAB_ballframe_put(ballframe_lucerossa[1],594,578,15); |
+ FAB_ballframe_put(ballframe_lucerossa[0],574,591,10); |
+} |
+void scenario_titolo() |
+{ int x0,y0; |
+ x0 = frame_misure_vert->x1+7+20-7; |
+ y0 = frame_bca->y0-7; |
+ FAB_frame_put(frame_titolo,x0,y0,800-x0-20+7,170); |
+ x0 = frame_titolo->x0; |
+ y0 = frame_titolo->y0; |
+ grx_text(titolo[0],x0+2,y0+10,FRAME_TITOLO_TEXT_COLOR2,FRAME_TITOLO_BACK_COLOR1); |
+ grx_text(titolo[1],x0+2,y0+20,FRAME_TITOLO_TEXT_COLOR2,FRAME_TITOLO_BACK_COLOR1); |
+ grx_text(titolo[2],x0+2,y0+30,FRAME_TITOLO_TEXT_COLOR2,FRAME_TITOLO_BACK_COLOR1); |
+ grx_text(titolo[3],x0+2,y0+46,FRAME_TITOLO_TEXT_COLOR2,FRAME_TITOLO_BACK_COLOR1); |
+ grx_text(titolo[4],x0+2,y0+66,FRAME_TITOLO_TEXT_COLOR1,FRAME_TITOLO_BACK_COLOR2); |
+ grx_text(titolo[5],x0+2,y0+81,FRAME_TITOLO_TEXT_COLOR2,FRAME_TITOLO_BACK_COLOR1); |
+ grx_text(titolo[6],x0+2,y0+96,FRAME_TITOLO_TEXT_COLOR2,FRAME_TITOLO_BACK_COLOR1); |
+ grx_text(titolo[7],x0+2,y0+116,FRAME_TITOLO_TEXT_COLOR2,FRAME_TITOLO_BACK_COLOR1); |
+ grx_text(titolo[8],x0+2,y0+133,FRAME_TITOLO_TEXT_COLOR2,FRAME_TITOLO_BACK_COLOR1); |
+ grx_text(titolo[9],x0+2,y0+141,FRAME_TITOLO_TEXT_COLOR2,FRAME_TITOLO_BACK_COLOR1); |
+} |
+void scenario_comandi() |
+{ int x0, y0; |
+ x0 = frame_misure_vert->x1+7+20-7; |
+ y0 = frame_titolo->y1+7+20-7; |
+ FAB_frame_put(frame_comandi,x0,y0,800-x0-20+7,100+7*2); |
+ x0 = frame_comandi->x0; |
+ y0 = frame_comandi->y0; |
+ grx_text(" COMANDI \0",x0+2,y0+10,FRAME_COMANDI_TEXT_COLOR1,FRAME_COMANDI_BACK_COLOR1); |
+ grx_text("-------------------\0",x0+2,y0+20,FRAME_COMANDI_TEXT_COLOR2,FRAME_COMANDI_BACK_COLOR1); |
+ grx_text(" esci \0",x0+2,y0+40,FRAME_COMANDI_TEXT_COLOR2,FRAME_COMANDI_BACK_COLOR1); |
+ grx_text("[INVIO]",x0+2,y0+40,FRAME_COMANDI_TEXT_COLOR3,FRAME_COMANDI_BACK_COLOR2); |
+ grx_text(" +/- aerei \0",x0+2,y0+60,FRAME_COMANDI_TEXT_COLOR2,FRAME_COMANDI_BACK_COLOR1); |
+ grx_text("[1/2]",x0+2,y0+60,FRAME_COMANDI_TEXT_COLOR3,FRAME_COMANDI_BACK_COLOR2); |
+ grx_text(" +/- cannoni\0",x0+2,y0+80,FRAME_COMANDI_TEXT_COLOR2,FRAME_COMANDI_BACK_COLOR1); |
+ grx_text("[3/4]",x0+2,y0+80,FRAME_COMANDI_TEXT_COLOR3,FRAME_COMANDI_BACK_COLOR2); |
+} |
+void scenario_control() |
+{ int x0,y0; |
+ |
+ x0 = frame_misure_vert->x1+7+20-7; |
+ y0 = frame_comandi->y1+7+20-7; |
+ FAB_frame_put(frame_control,x0,y0,800-x0-20+7,frame_misure_vert->y1+7-y0); |
+ x0 = frame_control->x0; |
+ y0 = frame_control->y0; |
+ grx_text(" CONTROL \0",x0+2, y0+5,FRAME_CONTROL_TEXT_COLOR2,FRAME_CONTROL_BACK_COLOR); |
+ grx_line(x0-3, y0+15, |
+ frame_control->x1+3, y0+15, |
+ FRAME_CONTROL_TEXT_COLOR1); |
+ |
+ grx_line(x0-3, frame_control->y1-81, |
+ frame_control->x1+3, frame_control->y1-81, |
+ FRAME_CONTROL_TEXT_COLOR1); |
+} |
+void scenario() |
+{ scenario_ca(); |
+ scenario_misure(); |
+ scenario_radar(); |
+ scenario_titolo(); |
+ scenario_comandi(); |
+ scenario_control(); |
+} |
+ |
+void info() |
+{ int i; |
+ for(i=0; i<10; i++) kern_printf("%s\n",titolo[i]); |
+} |
Index: rel_1_5_beta1/bca/readme |
=================================================================== |
--- rel_1_5_beta1/bca/readme (nonexistent) |
+++ rel_1_5_beta1/bca/readme (revision 1557) |
@@ -0,0 +1,11 @@ |
+Hi, |
+ |
+This is a nice simulation made by Fabio Calabrese |
+(fabiocalabrese77@yahoo.it). |
+ |
+Documentation is also available in PDF form on the shark website (only |
+in italian, sorry). |
+ |
+Enjoy |
+ |
+PJ |
Index: rel_1_5_beta1/bca/bca_raw/esplo5.raw |
=================================================================== |
--- rel_1_5_beta1/bca/bca_raw/esplo5.raw (nonexistent) |
+++ rel_1_5_beta1/bca/bca_raw/esplo5.raw (revision 1557) |
@@ -0,0 +1,65 @@ |
+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ)&ÿÿÿÿÿÿÿÿÿ |
+ÿÿÿÿÿÿ +*#! |
+.*% ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ):'+) :-65/1&&ÿÿÿÿÿÿ *-"&* %!&$)"%+-&% &!+%)&ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ |
+ ?.'O==D58F><$!ÿÿÿ=<EF&23FJ'16EI.;>)58%:=,10&$ +.(B= 7342)& |
+ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ $ )&.(:/G7'H7/@3-) 62& +* EE HJ MRNSHNOS2JN7Y\K<=/0/@@('& |
+<9B=D?SO)75-* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ-.YW.uqDYP)[M3P@0SE8J>2/(1-XUzz$(v{!rv)Z^!BDWYC=>0=>0KK3BC#;;DEA?SP'JHVT#2/,) + ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ + +-ba3`{tHl_?cT=\L<`SBSH2`Y/xr(509z}&kn)QR*OO7VTGIJ:DE&EHJL47@?RQ!]\&[Z"KHTR, ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ !IGTQ$^W-ZM-aS9zkVj[Dj_Ai^1zq,.2}}aa;: LJ#CA*@>/A@+HJ"HMAF=BORBBXW!po9spEvsPÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ + *'! .(OD(cW?o`Ik]BylJqd8pc,x1>{"MJ 0/ 0,#!41 ,,;>EJOTZ_RU MOVU%_^0\Z4gfH$#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ -)( +/,")#+#?4 i]GcU:i[6}nEmEuDzo-xr(^ZDB :6'%30//3627 9=BE`a7**! *'1-KH7*'ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ |
+-(.2-*A=4<8,*$ + &QC(eW2o`9E4]M,QE[Uzv9eb/63#!+*#% 47 |
+$& |