From 53338f6817557cc2290fe1f8fb581ceebb2177a0 Mon Sep 17 00:00:00 2001 From: jjak0b <32840785+jjak0b@users.noreply.github.com> Date: Sat, 2 May 2020 15:53:52 +0200 Subject: [PATCH] Aggiunti header relativi ai device di phase0 Spostata gestione semafori di umps in sorgenti condivisi [uMPS] Fix errori compilazione #15 Aggiornato SConstruct --- SConstruct | 10 +++- include/system/shared/device/device.h | 66 +++++++++++++++++++++++++ include/system/shared/device/terminal.h | 25 ++++++++++ include/umps/umpsconst.h | 58 ---------------------- src/handler/umps/handler.c | 28 +++++++---- src/main.c | 2 + src/system/shared/device/device.c | 32 ++++++++++++ 7 files changed, 152 insertions(+), 69 deletions(-) create mode 100644 include/system/shared/device/device.h create mode 100644 include/system/shared/device/terminal.h create mode 100644 src/system/shared/device/device.c diff --git a/SConstruct b/SConstruct index 61b9cc6..1b5138d 100644 --- a/SConstruct +++ b/SConstruct @@ -35,6 +35,7 @@ scheduler_h = dir_h + '/scheduler' system_h = dir_h + '/system' sysshared_h = system_h + '/shared' utilities_h = dir_h + '/utilities' +shared_device_h = sysshared_h + '/device' # INCLUDE dir specifiche per architettura uarm_h = dir_h + '/uarm' @@ -54,6 +55,8 @@ pcb_s = dir_s + '/pcb' scheduler_s = dir_s + '/scheduler' system_s = dir_s + '/system' handler_s = dir_s + '/handler' +sysshared_s = system_s + '/shared' +device_s = sysshared_s + '/device' # SOURCE dir specifiche per architettura uarm_s = dir_s + '/uarm' @@ -92,6 +95,9 @@ scheduler_f = scheduler_s + '/scheduler' #System Module #-------------------- + +##SHARED +shared_device_f = device_s + '/device' ##UARM dedicated uarm_shared_f = sysuarm_s + '/shared' uarm_sysinit_f = sysuarm_s + '/sysinit' @@ -152,7 +158,7 @@ uarm_ENV = Environment( # Headers lists #------------------- -shared_headers_list = [dir_h, system_h, sysshared_h, asl_h, handler_h, pcb_h, scheduler_h, utilities_h] +shared_headers_list = [dir_h, system_h, sysshared_h, asl_h, handler_h, pcb_h, scheduler_h, utilities_h, shared_device_h ] uarm_headers_list = [uarm_h, sysuarm_h, uarm_handler_h] umps_headers_list = [umps_h, sysumps_h, umps_handler_h] @@ -167,7 +173,7 @@ for i,x in enumerate(umps_headers_list): # Source (NOEXT) lists #------------------- -shared_noext_list = [main_f, p2test_f, test_f, handler_f, scheduler_f, pcb_f, pcb_utils_f, asl_f] +shared_noext_list = [main_f, p2test_f, test_f, handler_f, scheduler_f, pcb_f, pcb_utils_f, asl_f, shared_device_f ] # Per favore, lascia i file crtso____ e lib_____ per ultimi uarm_noext_list = [uarm_shared_f, uarm_handler_f, uarm_sysinit_f, crtso_uarm, libuarm, libdiv_uarm] diff --git a/include/system/shared/device/device.h b/include/system/shared/device/device.h new file mode 100644 index 0000000..b2c26d3 --- /dev/null +++ b/include/system/shared/device/device.h @@ -0,0 +1,66 @@ +#ifndef __SHARED_DEVICE_H__ +#define __SHARED_DEVICE_H__ + +#define DEV_FULL_MASK 0xFFFFFFFF + +// stati generici di un dispositivo +#define DEV_STATUS_NOT_INSTALLED 0 +#define DEV_STATUS_READY 1 +#define DEV_STATUS_UNKNOWN_CMD 2 +#define DEV_STATUS_BUSY 3 +#define DEV_STATUS_CODE_4 4 +#define DEV_STATUS_CODE_5 5 +#define DEV_STATUS_CODE_6 6 +#define DEV_STATUS_CODE_7 7 +#define DEV_STATUS_CODE_128 128 +// comandi generici di un dispositivo +#define DEV_CMD_RESET 0 +#define DEV_CMD_ACK 1 + +#define IS_DEV_IN_ERROR(status) (\ + (status&0xFF)==DEV_STATUS_NOT_INSTALLED || (status&0xFF)==DEV_STATUS_UNKNOWN_CMD || \ + (status&0xFF)==DEV_STATUS_CODE_4 || (status&0xFF)==DEV_STATUS_CODE_5 || \ + (status&0xFF)==DEV_STATUS_CODE_6 || (status&0xFF)==DEV_STATUS_CODE_7 || \ + (status&0xFF)==DEV_STATUS_CODE_128) + +// +#define IS_IRQ_RAISED_FROM_I(line,i) ((i>=0 && i<8 && CDEV_BITMAP_ADDR(line)&(1U<term.transm_status)? (0) : (1))) +// +#define GET_SEM_INDEX(dev_reg,line,device) (N_DEV_PER_IL*(line-N_EXT_IL+GET_SEM_OFFSET(dev_reg,line))+device) +#define GET_SEM_INDEX_SUBDEV(line,device,subdevice) (N_DEV_PER_IL*(line-N_EXT_IL+ ( line!=IL_TERMINAL ? 0 : subdevice ) )+device) +// +#define GET_DEV_STATUS(dev_reg, line) (line!=IL_TERMINAL ?(dev_reg->dtp.status):(GET_SEM_OFFSET(dev_reg,line) ?(dev_reg->term.recv_status):(dev_reg->term.transm_status)) ) + + +void device_init(); + +/** + * @brief Memorizza il tipo (linea) di interrupt e numero di device relativo al registro del device fornito + * + * @param devreg indirizzo del registro del device + * @param line tipo (linea) di interrupt + * @param devNo numero del device + */ +void device_GetInfo( devreg_t *devreg, int *devline, int *devNo ); + +/** + * @brief Restituisce il puntatore al semaforo dedicato al (sotto-)dispositivo del tipo specificato + * + * @param devline + * @param devNo + * @param subDev + * @return int* + */ +int *device_GetSem( int devline, int devNo, int subDev ); + +#endif + + diff --git a/include/system/shared/device/terminal.h b/include/system/shared/device/terminal.h new file mode 100644 index 0000000..f8a349f --- /dev/null +++ b/include/system/shared/device/terminal.h @@ -0,0 +1,25 @@ +#ifndef __DEVICE_TERMINAL_H__ +#define __DEVICE_TERMINAL_H__ + +#include "device.h" + +#define TERMINAL_STATUS_TRANSMISSION_ERROR DEV_STATUS_CODE_4 +#define TERMINAL_STATUS_RECEIVED_ERROR TERMINAL_STATUS_RECEIVED_ERROR + +#define TERMINAL_STATUS_TRANSMITTED DEV_STATUS_CODE_5 +#define TERMINAL_STATUS_RECEIVED TERMINAL_STATUS_TRANSMITTED + +#define TERMINAL_CMD_TRANSMIT 2 +#define TERMINAL_CMD_RECEIVE TERMINAL_CMD_TRANSMIT + +#define CHAR_OFFSET 8 +#define TERMINAL_STATUS_MASK 0xFF +#define TERMINAL_DATA_MASK 0xFF00 + + +#define IS_TERM_READY(status) ((status&TERMINAL_STATUS_MASK)==DEV_STATUS_READY) +#define IS_TERM_IN_ERROR(status) (\ + (status&TERMINAL_STATUS_MASK)==DEV_STATUS_NOT_INSTALLED || \ + (status&TERMINAL_STATUS_MASK)==DEV_STATUS_UNKNOWN_CMD || \ + (status&TERMINAL_STATUS_MASK)==TERMINAL_STATUS_TRANSMISSION_ERROR) +#endif \ No newline at end of file diff --git a/include/umps/umpsconst.h b/include/umps/umpsconst.h index 5d7a696..0817d64 100644 --- a/include/umps/umpsconst.h +++ b/include/umps/umpsconst.h @@ -30,62 +30,4 @@ #define INTERVAL_TIMER_ON (STATUS_IM(2)) #define INTERVAL_TIMER_OFF (~INTERVAL_TIMER_ON) -#define RESET 0 -#define ACK 1 -//-------------------------------------------------------Terminal -/*Terminal Device Status Codes*/ -#define TERM_NOT_INSTALLED 0 -#define TERM_READY 1 -#define TERM_ILLEGAL_OP 2 -#define TERM_BUSY 3 -#define RECV_TRASM_ERR 4 -#define CHAR_RECV_TRASM 5 - -#define IS_TERM_READY(status) ((status&0xFF)==TERM_READY) -#define IS_TERM_IN_ERROR(status) (\ - (status&0xFF)==TERM_NOT_INSTALLED || \ - (status&0xFF)==TERM_ILLEGAL_OP || \ - (status&0xFF)==RECV_TRASM_ERR) -//--------------------------------------------------------------- - -//------------------------------------------------------Other Dev -#define DEV_NOT_INSTALLED 0 -#define DEV_READY 1 -#define ILLEGAL_OP 2 -#define DEV_BUSY 3 -#define ERR_CODE_4 4 -#define ERR_CODE_5 5 -#define ERR_CODE_6 6 -#define ERR_CODE_7 7 -#define ERR_CODE_128 128 - -#define IS_DEV_IN_ERROR(status) (\ - (status&0xFF)==DEV_NOT_INSTALLED || (status&0xFF)==ILLEGAL_OP || \ - (status&0xFF)==ERR_CODE_4 || (status&0xFF)==ERR_CODE_5 \ - (status&0xFF)==ERR_CODE_6 || (status&0xFF)==ERR_CODE_7 \ - (status&0xFF)==ERR_CODE_128) - -//--------------------------------------------------------------- - - - -// #define CAUSE_IP_GET(cause, line) ((cause&CAUSE_IP(line)) != 0) - -// -#define IS_IRQ_RAISED_FROM_I(line,i) ((i>=0 && i<8 && CDEV_BITMAP_ADDR(line)&(1U<term->transm_status)? (0) : (1))) -// -#define GET_SEM_INDEX(dev_reg,line,device) (N_DEV_PER_IL*(line-DEV_ONLY+GET_SEM_OFFSET(dev_reg,line))+device) -// -#define GET_DEV_STATUS(dev_reg, line) (line!=IL_TERMINAL ?(dev_reg->dtp->status):(GET_SEM_OFFSET(dev_reg,line) ?(dev_reg->term->recv_status):(dev_reg->term->trasm_status)) - - diff --git a/src/handler/umps/handler.c b/src/handler/umps/handler.c index 5c4c042..6d3b3f9 100644 --- a/src/handler/umps/handler.c +++ b/src/handler/umps/handler.c @@ -22,8 +22,18 @@ #include #include #include +#include -extern int semdev[SEM_DEV_N]; // la vera struttura dati sarĂ  nell init.c +#include +#include + +int get_interrupting_line( state_t *request ); + +int get_interrupting_device( int line ); + +void handle_irq_terminal(devreg_t *dev_reg); + +void handle_irq_other_dev(devreg_t *dev_reg); // Syscall-Breakpoint Handler //--------------------------------------------------------------- @@ -107,10 +117,10 @@ void Handler_Interrupt(void) { //--------------------------Processor Local Timer/Interval Timer if(CAUSE_IP_GET(request->cause,IL_CPUTIMER)){ - sheduler_shedule(FALSE); + scheduler_schedule(FALSE); } if(CAUSE_IP_GET(request->cause,IL_TIMER)){ - sheduler_shedule(TRUE); + scheduler_schedule(TRUE); } //------------------------------------------------------------- @@ -134,7 +144,7 @@ void Handler_Interrupt(void) { handle_irq_other_dev(dev_reg); } - int *sem = &(semdev[GET_SEM_INDEX(dev_reg,line,dev)]); /*sem associated with device*/ + int *sem = device_GetSem( line, dev, GET_SEM_OFFSET(dev_reg, line) ); /*sem associated with device*/ if(++(*sem) <= 0){ /*V on this sem*/ pcb_t *p = removeBlocked(sem); if(p!=NULL){ @@ -143,7 +153,7 @@ void Handler_Interrupt(void) { scheduler_AddProcess(p); } } - sheduler_shedule(FALSE); + scheduler_schedule(FALSE); } int get_interrupting_line(state_t *request){ @@ -180,16 +190,16 @@ int get_interrupting_device(int line){ } void handle_irq_terminal(devreg_t *dev_reg){ - if(IS_TERM_READY(dev_reg->term->transm_status)){ + if(IS_TERM_READY(dev_reg->term.transm_status)){ /* gestione del terminale di ricezione */ - dev_reg->term->recv_command = IS_TERM_IN_ERROR(dev_reg->term->recv_status) ? RESET : ACK; + dev_reg->term.recv_command = IS_TERM_IN_ERROR(dev_reg->term.recv_status) ? DEV_CMD_RESET : DEV_CMD_ACK; return; } /* gestione del terminale di trasmissione */ - dev_reg->term->transm_command = IS_TERM_IN_ERROR(dev_reg->term->transm_status) ? RESET : ACK; + dev_reg->term.transm_command = IS_TERM_IN_ERROR(dev_reg->term.transm_status) ? DEV_CMD_RESET : DEV_CMD_ACK; } void handle_irq_other_dev(devreg_t *dev_reg){ - dev_reg->dtp->command = IS_DEV_IN_ERROR(dev_reg->dtp->status) ? RESET : ACK; + dev_reg->dtp.command = IS_DEV_IN_ERROR( (dev_reg->dtp.status) ) ? DEV_CMD_RESET : DEV_CMD_ACK; } //------------------------------------------------------------------ diff --git a/src/main.c b/src/main.c index a541397..ac6ae01 100644 --- a/src/main.c +++ b/src/main.c @@ -25,6 +25,7 @@ #include #include #include +#include int main(){ //---------------------Inizialializzazione del sistema @@ -32,6 +33,7 @@ int main(){ SpecPassup_init(); initPcbs(); initASL(); + device_init(); scheduler_init(); //---------------------------------------------------- diff --git a/src/system/shared/device/device.c b/src/system/shared/device/device.c new file mode 100644 index 0000000..27f1cae --- /dev/null +++ b/src/system/shared/device/device.c @@ -0,0 +1,32 @@ +#include +#include + +HIDDEN int _semdev[SEM_DEV_N]; + +void device_init() { + +} + +void device_GetInfo( devreg_t *devreg, int *_line, int *_devNo ) { + if( _line == NULL ) return; + + int line, devNo; + for( line = DEV_IL_START; line < DEV_PER_INT ; line++ ) { + if( !( (devreg_t*)DEV_REG_ADDR(line, 0) <= devreg && devreg <= (devreg_t*)DEV_REG_ADDR(line, N_EXT_IL-1 ) ) ) { + continue; + } + *_line = line; + if( _devNo == NULL ) return; + + for( devNo = 0; devNo < N_EXT_IL; devNo ++ ){ + if( devreg == (devreg_t*)DEV_REG_ADDR(line, devNo) ) { + *_devNo = devNo; + return; + } + } + } +} + +int *device_GetSem( int devline, int devNo, int subDev ) { + return &_semdev[ GET_SEM_INDEX_SUBDEV(devline, devNo, subDev) ]; +}