Skip to content
Snippets Groups Projects
Commit 7b36a7d1 authored by Thierno souleymane Bah's avatar Thierno souleymane Bah
Browse files

feat(start_sched done and test by updated pingpongpang)

parent 65519c0e
No related branches found
No related tags found
No related merge requests found
INC=-I/vagrant/ASE/ordonnancement/x86-64/include
LIB=-L/vagrant/ASE/ordonnancement/x86-64/lib -lhardware
all: display_stack try_mul pingpong pingpongpang
all: try_mul pingpong pingpongpang
display_stack : display_stack.o
gcc -o $@ $^ $(LIB)
......@@ -19,4 +19,4 @@ pingpongpang : try.o pingpongpang.o
gcc $(INC) -c $<
clean:
rm -f *.o *.s display_stack try_mul pingpong pingpongpang
\ No newline at end of file
rm -f *.o *.s display_stack try_mul pingpong pingpongpang vdisk?.bin
\ No newline at end of file
# $Id: hardware.ini 114 2009-12-01 13:06:43Z simon_duquennoy $
#------------------------------------------------------------
#
# Hardware.cfg
# Fichier de configuration du simulateur de matériel
#
#
# Trace de Debug
#
# define DEBUG_SETUP 0x0001 /* trace hardware setup */
# define DEBUG_IT 0x0010 /* trace interruptions generation */
# define DEBUG_REG 0x0100 /* trace hardware register access */
# define DEBUG_WARNING 0x1000 /* trace hardware warning messages */
DEBUG = 0x0000
#
# Configuration des paramêtres de base du simulateur
#
SYSTICK = 1000 # delais entre deux ticks du simulateur (en micro-seconde)
#
# Configuration des matériels réseau
#
# configuration des ports COM (port serie de type RS232)
# > Port Serie n°1
SL1_ENABLE = 0 # SL1_ENABLE = 0 => simulation lien serie désactivée
SL1 = "chimay.lifl.fr" # Machine connecté à la sortie du lien serie n°1
SL1_COM = 1 # destinataire 1 = lien serie "com1", 2 = lien serie "com2"
SL1_NOISE = 500 # bruit de la ligne 0-999 (exprimé en /1000 d'erreur)
SL1_IRQ = 4 # niveau d'interruption de l'UART serie n°1
SL1_UARTSR = 0x3F8 # registre de status de l'UART serie n°1
SL1_UARTDATA = 0x3FA # registre d'entrée sortie de l'UART serie n°1
SL1_UDPPORT = 1500 # port UDP "réel" utiliser pour simulation serie n°1
# > Port Serie n°2
SL2_ENABLE = 0 # SL2_ENABLE = 0 => simulation lien serie désactivée
SL2 = "ldx2" # Machine connecté à la sortie du lien serie n°2
SL2_COM = 2 # destinataire 1 = lien serie "com1", 2 = lien serie "com2"
SL2_NOISE = 0 # bruit de la ligne 0-999 (exprimé en /1000 d'erreur)
SL2_IRQ = 5 # niveau d'interruption de l'UART serie n°2
SL2_UARTSR = 0x3FC # registre de status de l'UART serie n°2
SL2_UARTDATA = 0x3FE # registre d'entrée sortie de l'UART serie n°2
SL2_UDPPORT = 1501 # port UDP "réel" utiliser pour simulation serie n°2
# > Configuration de la carte Ethernet
ENABLE_ETHERNET = 0 # ENABLE_ETHERNET = 0 => simulation ethernet désactivée
Eth0_Link = 1 # num de cable de connexion de la carte Eth0
Eth0_DMASR = 0xE800 # registre de status de la carte Ethernet
Eth0_DMABASE = 0xE804 # adresse de base pour le vidage d'un paquet
Eth0_DMASIZE = 0xE808 # adresse limite pour le vidage d'un paquet
Eth0_IRQ = 9 # niveau d'interruption de la carte.
Eth0_MCADR = "225.0.0.1" # adresse multicast utilisée pour la simulation ethernet
Eth0_UDPPORT = 1502 # port UDP utilisé pour la simulation ethernet
#
# Configuration des disques durs
#
# > Disque dur IDE Maitre
ENABLE_HDA = 1 # ENABLE_HD = 0 => simulation du disque désactivée
HDA_FILENAME = "vdiskA.bin" # nom du fichier de stockage du disque simulé
HDA_CMDREG = 0x3F6 # registre de commande du disque maitre
HDA_DATAREGS = 0x110 # base des registres de données (r,r+1,r+2,...r+7)
HDA_IRQ = 14 # Interruption du disque
HDA_MAXCYLINDER = 16 # Nombre de pistes du disque maître
HDA_MAXSECTOR = 16 # Nombre de secteurs du disque maître
HDA_SECTORSIZE = 32 # Taille (en octet) d'un secteur du disque maître
HDA_STPS = 2 # nombre de SYSTICK pour changer de secteur
HDA_STPC = 1 # nombre de SYSTICK pour changer de piste
HDA_PON_DELAY = 30 # nombre de SYSTICK avant amorce du disque
HDA_POFF_DELAY = 30 # nombre de SYSTICK avant arret du disque
# > Disque dur IDE Esclave
ENABLE_HDB = 1 # ENABLE_HD = 0 => simulation du disque désactivée
HDB_FILENAME = "vdiskB.bin" # nom du fichier de stockage du disque simulé
HDB_CMDREG = 0x376 # registre de commande du disque esclave
HDB_DATAREGS = 0x170 # base des registres de données (r,r+1,r+2,...r+7)
HDB_IRQ = 15 # Niveau d'interruption du disque
HDB_MAXCYLINDER = 16 # Nombre de pistes du disque esclave
HDB_MAXSECTOR = 16 # Nombre de secteurs du disque esclave
HDB_SECTORSIZE = 512 # Taille (en octet) d'un secteur du disque esclave
HDB_STPS = 2 # nombre de SYSTICK pour changer de secteur
HDB_STPC = 3 # nombre de SYSTICK pour changer de piste
HDB_PON_DELAY = 30 # nombre de SYSTICK avant amorce du disque
HDB_POFF_DELAY = 30 # nombre de SYSTICK avant arret du disque
#
# Configuration de l'horologe interne
#
TIMER_CLOCK = 0xF0 # registre de lecture de la date courante (en ms)
TIMER_PARAM = 0xF4 # registre de configuration du TIMER
# bit 7 : RESET general (=1)
# bit 6 : Alarm ON = 1, Alarm OFF = 0
# bit 5 : Declanche la division Hz du Timer (=1)
# bit 4 \ Si le division Hz du timer est demandé :
# bit 3 / 00: 1 top d'alarme pour 1 tops d'horloge ,
# 01: 1 top d'alarme pour 8 tops d'horloge ,
# 10: 1 top d'alarme pour 64 tops d'horloge ,
# 11: 1 top d'alarme pour 512 tops d'horloge.
# bit 2 - R.F.U. -
# bit 1 \ Lecture d'un état interne de l'alarme
# bit 0 / 00: Alarme Courante,
# 01: Division Hz,
# 10: Ticks/Sec
# 11: niveau d'interruption de l'horloge
TIMER_ALARM = 0xF8 # registre de generation d'interruption
TIMER_IRQ = 2 # Niveau d'interruption de l'horologe
TIMER_TICKS = 1 # Nombre de SYSTICKS par tick d'horloge
#
# Configuration de la MMU
#
MMU_ENABLE = 1 # MMU_ENABLE = 0 => simulation de la MMU désactivée
MMU_IRQ = 13 # Niveau d'interruption de la MMU
MMU_CMD = 0x66 # Registre de commande de la MMU
MMU_FAULT_ADDR = 0xCD # Registre contenant l'adresse mémoire ayant provoqué une faute
TLB_ADD_ENTRY = 0xCE # Registre de commande d'ajout d'entrée dans la TLB
# attend une valeur de la forme :
# struct tlb_entry_s {
# unsigned unused: 8;
# unsigned virt_page: 12;
# unsigned phys_page: 8;
# unsigned access_type: 3;
# unsigned is_active: 1;
#};
# le nouveau mapping est ajouté dans la TLB,
# provoquant éventuellement l'écrasement d'une ancienne entrée
TLB_DEL_ENTRY = 0xDE # Registre de commande de suppression d'entrée dans la TLB
# seul phys_page est lu, et toutes les entrée
# correspondant à cette page physicique sont supprimées de la TLB
TLB_SIZE = 32 # Number of entries in the TLB
TLB_ENTRIES = 0x800 # Registre contenant les entrées de la TLB (32 bits par entrée)
# Accessible en lecture comme en écriture avec le même format que
# celui utilisé par TLB_ADD_ENTRY
/* ------------------------------
$Id: hardware.h 114 2009-12-01 13:06:43Z simon_duquennoy $
------------------------------------------------------------
hardware.h
Interface de la bibliothèque de simulation du matériel.
*/
#ifndef _HARDWARE_H_
#define _HARDWARE_H_
/**
* CMD_
* commandes ATA-2
*/
#define CMD_SEEK 0x02
#define CMD_READ 0x04
#define CMD_WRITE 0x06
#define CMD_FORMAT 0x08
#define CMD_STATUS 0x12
#define CMD_DMASET 0x14
#define CMD_DSKINFO 0x16
#define CMD_MANUF 0xA2
#define CMD_DIAG 0xA4
/**
* Commandes de la MMU (registre MMU_CMD)
*/
#define MMU_PROCESS 0xCC /* Commande d'activation/désactivation de la MMU */
#define MMU_RESET 0xD5 /* Commande de réinitialisation de la MMU */
/**
* Physical and virtual memory for MMU
*/
extern void *physical_memory;
extern void *virtual_memory;
/**
* prototype des fonctions-interruptions.
* une interruption ne recoit aucun paramêtre "d'appel",
* une interruption ne retourne aucun resultat, mais
* sa terminaison restaure le contexte d'exécution du programme interrompu.
*/
typedef void (*func_irq)(void);
/**
* int init_hardware(const char *fileconfig);
* initialisation du matériel. Pas de "reinitialisation" possible.
* l'initialisation définit le matériel conformément aux spécifications
* fournies par le fichier dont le nom est "fileconfig".
* retourne 0 en cas de problème lors de l'initialisation.
*/
extern int init_hardware(const char *fileconfig);
/**
* IRQVECTOR
* donne la base d'un tableau de pointeur de fonction du type
* func_irq. la fonction IRQVECTOR[n]() est appelée lorsque
* l'interuption de niveau n est déclanchée par le matériel.
*/
#define IRQ_VECOTR_SIZE 256
extern func_irq *irq_vector; /* n'utilisez pas cette variable */
#define IRQVECTOR irq_vector /* préférez ce #define IRQVECTOR */
extern int SYSTICKDURATION; /* microseconde entre les SYSTICK */
/**
* MASTERBUFFER et SLAVEBUFFER
* Adresses des buffers de donnees des disques maitre et esclave
*/
/* n'utilisez pas ces variables*/
extern unsigned char ** HDA_masterbufferaddress, **HDB_masterbufferaddress;
/* préférez ces #define MASTERBUFFER et SLAVEBUFFER */
#define MASTERBUFFER (*HDA_masterbufferaddress)
#define SLAVEBUFFER (*HDB_masterbufferaddress)
/**
* BASEADDRESS_RAM
* variable associée à adresse de base de la mémoire globale
* de la machine. Cette mémoire est commune à tout les programmes
* qui utilisent la librairie sur la même machine.
*
*/
extern unsigned char *baseGlobalMem; /* n'utilisez pas cette variable */
#define BASEADDRESS_RAM baseGlobalMem /* préférez ce #define BASEADDRESS_RAM */
/**
* int _in(int port);
* lecture du contenu du registre matériel n° "port".
* retourne la valeur lue.
*/
int _in(int port);
/**
* void _out(int port, int value);
* ecriture de la valeur "value" dans le registre matériel n° "port".
*/
void _out(int port, int value);
/**
* void _sleep(int irq_level);
* Stoppe l'activité du microprocesseur jusqu'à l'occurence
* une interruption de niveau au moins égale à "irqLevel".
*/
void _sleep(int irq_level);
/**
* void _mask(int irqLevel);
* - cache au microprocesseur l'occurence d'interruptions
* de niveau inférieure à irqLevel.
* - 16ème bit à 0 : passage en mode protégé
* - 16ème bit à 1 : passage en mode user
*
*/
void _mask(int irq_level);
/**
* void _int(int irqLevel);
* - lance une interruption logicielle de niveau irqLevel
*
*/
void _int(int irqLevel);
#endif
......@@ -14,35 +14,37 @@ int main(int argc, char *argv[])
ctx_t *pong_ctx = create_ctx(STACK, f_pong, NULL);
ctx_t *ping_ctx = create_ctx(STACK, f_ping, NULL);
printf("Begin \n");
yield();
//yield();
start_sched();
printf("Nope \n");
return EXIT_SUCCESS;
}
void f_ping(void *args)
{
while (1)
{
printf("A");
yield();
printf("B");
yield();
printf("C");
yield();
}
}
void f_pong(void *args)
{
while (1)
{
printf("1");
yield();
printf("2");
yield();
}
}
void f_pang(void *args)
{
while (1)
{
printf("(");
yield();
printf(":");
yield();
printf(")");
yield();
}
}
......@@ -122,7 +122,7 @@ void yield()
switch_to_ctx(current_ctx->next_ctx);
}
empty_it(void)
void empty_it()
{
return;
}
......
File added
# $Id: hardware.ini 114 2009-12-01 13:06:43Z simon_duquennoy $
#------------------------------------------------------------
#
# Hardware.cfg
# Fichier de configuration du simulateur de matériel
#
#
# Trace de Debug
#
# define DEBUG_SETUP 0x0001 /* trace hardware setup */
# define DEBUG_IT 0x0010 /* trace interruptions generation */
# define DEBUG_REG 0x0100 /* trace hardware register access */
# define DEBUG_WARNING 0x1000 /* trace hardware warning messages */
DEBUG = 0x0000
#
# Configuration des paramêtres de base du simulateur
#
SYSTICK = 1000 # delais entre deux ticks du simulateur (en micro-seconde)
#
# Configuration des matériels réseau
#
# configuration des ports COM (port serie de type RS232)
# > Port Serie n°1
SL1_ENABLE = 0 # SL1_ENABLE = 0 => simulation lien serie désactivée
SL1 = "chimay.lifl.fr" # Machine connecté à la sortie du lien serie n°1
SL1_COM = 1 # destinataire 1 = lien serie "com1", 2 = lien serie "com2"
SL1_NOISE = 500 # bruit de la ligne 0-999 (exprimé en /1000 d'erreur)
SL1_IRQ = 4 # niveau d'interruption de l'UART serie n°1
SL1_UARTSR = 0x3F8 # registre de status de l'UART serie n°1
SL1_UARTDATA = 0x3FA # registre d'entrée sortie de l'UART serie n°1
SL1_UDPPORT = 1500 # port UDP "réel" utiliser pour simulation serie n°1
# > Port Serie n°2
SL2_ENABLE = 0 # SL2_ENABLE = 0 => simulation lien serie désactivée
SL2 = "ldx2" # Machine connecté à la sortie du lien serie n°2
SL2_COM = 2 # destinataire 1 = lien serie "com1", 2 = lien serie "com2"
SL2_NOISE = 0 # bruit de la ligne 0-999 (exprimé en /1000 d'erreur)
SL2_IRQ = 5 # niveau d'interruption de l'UART serie n°2
SL2_UARTSR = 0x3FC # registre de status de l'UART serie n°2
SL2_UARTDATA = 0x3FE # registre d'entrée sortie de l'UART serie n°2
SL2_UDPPORT = 1501 # port UDP "réel" utiliser pour simulation serie n°2
# > Configuration de la carte Ethernet
ENABLE_ETHERNET = 0 # ENABLE_ETHERNET = 0 => simulation ethernet désactivée
Eth0_Link = 1 # num de cable de connexion de la carte Eth0
Eth0_DMASR = 0xE800 # registre de status de la carte Ethernet
Eth0_DMABASE = 0xE804 # adresse de base pour le vidage d'un paquet
Eth0_DMASIZE = 0xE808 # adresse limite pour le vidage d'un paquet
Eth0_IRQ = 9 # niveau d'interruption de la carte.
Eth0_MCADR = "225.0.0.1" # adresse multicast utilisée pour la simulation ethernet
Eth0_UDPPORT = 1502 # port UDP utilisé pour la simulation ethernet
#
# Configuration des disques durs
#
# > Disque dur IDE Maitre
ENABLE_HDA = 1 # ENABLE_HD = 0 => simulation du disque désactivée
HDA_FILENAME = "vdiskA.bin" # nom du fichier de stockage du disque simulé
HDA_CMDREG = 0x3F6 # registre de commande du disque maitre
HDA_DATAREGS = 0x110 # base des registres de données (r,r+1,r+2,...r+7)
HDA_IRQ = 14 # Interruption du disque
HDA_MAXCYLINDER = 16 # Nombre de pistes du disque maître
HDA_MAXSECTOR = 16 # Nombre de secteurs du disque maître
HDA_SECTORSIZE = 32 # Taille (en octet) d'un secteur du disque maître
HDA_STPS = 2 # nombre de SYSTICK pour changer de secteur
HDA_STPC = 1 # nombre de SYSTICK pour changer de piste
HDA_PON_DELAY = 30 # nombre de SYSTICK avant amorce du disque
HDA_POFF_DELAY = 30 # nombre de SYSTICK avant arret du disque
# > Disque dur IDE Esclave
ENABLE_HDB = 1 # ENABLE_HD = 0 => simulation du disque désactivée
HDB_FILENAME = "vdiskB.bin" # nom du fichier de stockage du disque simulé
HDB_CMDREG = 0x376 # registre de commande du disque esclave
HDB_DATAREGS = 0x170 # base des registres de données (r,r+1,r+2,...r+7)
HDB_IRQ = 15 # Niveau d'interruption du disque
HDB_MAXCYLINDER = 16 # Nombre de pistes du disque esclave
HDB_MAXSECTOR = 16 # Nombre de secteurs du disque esclave
HDB_SECTORSIZE = 512 # Taille (en octet) d'un secteur du disque esclave
HDB_STPS = 2 # nombre de SYSTICK pour changer de secteur
HDB_STPC = 3 # nombre de SYSTICK pour changer de piste
HDB_PON_DELAY = 30 # nombre de SYSTICK avant amorce du disque
HDB_POFF_DELAY = 30 # nombre de SYSTICK avant arret du disque
#
# Configuration de l'horologe interne
#
TIMER_CLOCK = 0xF0 # registre de lecture de la date courante (en ms)
TIMER_PARAM = 0xF4 # registre de configuration du TIMER
# bit 7 : RESET general (=1)
# bit 6 : Alarm ON = 1, Alarm OFF = 0
# bit 5 : Declanche la division Hz du Timer (=1)
# bit 4 \ Si le division Hz du timer est demandé :
# bit 3 / 00: 1 top d'alarme pour 1 tops d'horloge ,
# 01: 1 top d'alarme pour 8 tops d'horloge ,
# 10: 1 top d'alarme pour 64 tops d'horloge ,
# 11: 1 top d'alarme pour 512 tops d'horloge.
# bit 2 - R.F.U. -
# bit 1 \ Lecture d'un état interne de l'alarme
# bit 0 / 00: Alarme Courante,
# 01: Division Hz,
# 10: Ticks/Sec
# 11: niveau d'interruption de l'horloge
TIMER_ALARM = 0xF8 # registre de generation d'interruption
TIMER_IRQ = 2 # Niveau d'interruption de l'horologe
TIMER_TICKS = 1 # Nombre de SYSTICKS par tick d'horloge
#
# Configuration de la MMU
#
MMU_ENABLE = 1 # MMU_ENABLE = 0 => simulation de la MMU désactivée
MMU_IRQ = 13 # Niveau d'interruption de la MMU
MMU_CMD = 0x66 # Registre de commande de la MMU
MMU_FAULT_ADDR = 0xCD # Registre contenant l'adresse mémoire ayant provoqué une faute
TLB_ADD_ENTRY = 0xCE # Registre de commande d'ajout d'entrée dans la TLB
# attend une valeur de la forme :
# struct tlb_entry_s {
# unsigned unused: 8;
# unsigned virt_page: 12;
# unsigned phys_page: 8;
# unsigned access_type: 3;
# unsigned is_active: 1;
#};
# le nouveau mapping est ajouté dans la TLB,
# provoquant éventuellement l'écrasement d'une ancienne entrée
TLB_DEL_ENTRY = 0xDE # Registre de commande de suppression d'entrée dans la TLB
# seul phys_page est lu, et toutes les entrée
# correspondant à cette page physicique sont supprimées de la TLB
TLB_SIZE = 32 # Number of entries in the TLB
TLB_ENTRIES = 0x800 # Registre contenant les entrées de la TLB (32 bits par entrée)
# Accessible en lecture comme en écriture avec le même format que
# celui utilisé par TLB_ADD_ENTRY
/* ------------------------------
$Id: hardware.h 114 2009-12-01 13:06:43Z simon_duquennoy $
------------------------------------------------------------
hardware.h
Interface de la bibliothèque de simulation du matériel.
*/
#ifndef _HARDWARE_H_
#define _HARDWARE_H_
/**
* CMD_
* commandes ATA-2
*/
#define CMD_SEEK 0x02
#define CMD_READ 0x04
#define CMD_WRITE 0x06
#define CMD_FORMAT 0x08
#define CMD_STATUS 0x12
#define CMD_DMASET 0x14
#define CMD_DSKINFO 0x16
#define CMD_MANUF 0xA2
#define CMD_DIAG 0xA4
/**
* Commandes de la MMU (registre MMU_CMD)
*/
#define MMU_PROCESS 0xCC /* Commande d'activation/désactivation de la MMU */
#define MMU_RESET 0xD5 /* Commande de réinitialisation de la MMU */
/**
* Physical and virtual memory for MMU
*/
extern void *physical_memory;
extern void *virtual_memory;
/**
* prototype des fonctions-interruptions.
* une interruption ne recoit aucun paramêtre "d'appel",
* une interruption ne retourne aucun resultat, mais
* sa terminaison restaure le contexte d'exécution du programme interrompu.
*/
typedef void (*func_irq)(void);
/**
* int init_hardware(const char *fileconfig);
* initialisation du matériel. Pas de "reinitialisation" possible.
* l'initialisation définit le matériel conformément aux spécifications
* fournies par le fichier dont le nom est "fileconfig".
* retourne 0 en cas de problème lors de l'initialisation.
*/
extern int init_hardware(const char *fileconfig);
/**
* IRQVECTOR
* donne la base d'un tableau de pointeur de fonction du type
* func_irq. la fonction IRQVECTOR[n]() est appelée lorsque
* l'interuption de niveau n est déclanchée par le matériel.
*/
#define IRQ_VECOTR_SIZE 256
extern func_irq *irq_vector; /* n'utilisez pas cette variable */
#define IRQVECTOR irq_vector /* préférez ce #define IRQVECTOR */
extern int SYSTICKDURATION; /* microseconde entre les SYSTICK */
/**
* MASTERBUFFER et SLAVEBUFFER
* Adresses des buffers de donnees des disques maitre et esclave
*/
/* n'utilisez pas ces variables*/
extern unsigned char ** HDA_masterbufferaddress, **HDB_masterbufferaddress;
/* préférez ces #define MASTERBUFFER et SLAVEBUFFER */
#define MASTERBUFFER (*HDA_masterbufferaddress)
#define SLAVEBUFFER (*HDB_masterbufferaddress)
/**
* BASEADDRESS_RAM
* variable associée à adresse de base de la mémoire globale
* de la machine. Cette mémoire est commune à tout les programmes
* qui utilisent la librairie sur la même machine.
*
*/
extern unsigned char *baseGlobalMem; /* n'utilisez pas cette variable */
#define BASEADDRESS_RAM baseGlobalMem /* préférez ce #define BASEADDRESS_RAM */
/**
* int _in(int port);
* lecture du contenu du registre matériel n° "port".
* retourne la valeur lue.
*/
int _in(int port);
/**
* void _out(int port, int value);
* ecriture de la valeur "value" dans le registre matériel n° "port".
*/
void _out(int port, int value);
/**
* void _sleep(int irq_level);
* Stoppe l'activité du microprocesseur jusqu'à l'occurence
* une interruption de niveau au moins égale à "irqLevel".
*/
void _sleep(int irq_level);
/**
* void _mask(int irqLevel);
* - cache au microprocesseur l'occurence d'interruptions
* de niveau inférieure à irqLevel.
* - 16ème bit à 0 : passage en mode protégé
* - 16ème bit à 1 : passage en mode user
*
*/
void _mask(int irq_level);
/**
* void _int(int irqLevel);
* - lance une interruption logicielle de niveau irqLevel
*
*/
void _int(int irqLevel);
#endif
File added
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment