Skip to content
This repository has been archived by the owner on Nov 2, 2022. It is now read-only.

Commit

Permalink
Aggiunti header relativi ai device di phase0
Browse files Browse the repository at this point in the history
Spostata gestione semafori di umps in sorgenti condivisi
[uMPS] Fix errori compilazione #15
Aggiornato SConstruct
  • Loading branch information
jjak0b committed May 2, 2020
1 parent 274b26f commit 53338f6
Show file tree
Hide file tree
Showing 7 changed files with 152 additions and 69 deletions.
10 changes: 8 additions & 2 deletions SConstruct
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand All @@ -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'
Expand Down Expand Up @@ -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'
Expand Down Expand Up @@ -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]

Expand All @@ -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]
Expand Down
66 changes: 66 additions & 0 deletions include/system/shared/device/device.h
Original file line number Diff line number Diff line change
@@ -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<<i)) != 0)

/* We are 8 type of interrupt lines. But, only 5
* lines are related to devices.
*/
#define SEM_DEV_N ((N_EXT_IL+1)*N_DEV_PER_IL)

//
#define GET_SEM_OFFSET(dev_reg,line) (line!=IL_TERMINAL ? (0) : (IS_TERM_READY(dev_reg->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


25 changes: 25 additions & 0 deletions include/system/shared/device/terminal.h
Original file line number Diff line number Diff line change
@@ -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
58 changes: 0 additions & 58 deletions include/umps/umpsconst.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<<i)) != 0)

/* We are 8 type of interrupt lines. But, only 5
* lines are related to devices.
*/
#define DEV_ONLY (N_IL-3)
#define SEM_DEV_N ((DEV_ONLY+1)*N_DEV_PER_IL)

//
#define GET_SEM_OFFSET(dev_reg,line) (line!=IL_TERMINAL ? (0) : (IS_TERM_READY(dev_reg->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))


28 changes: 19 additions & 9 deletions src/handler/umps/handler.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,18 @@
#include <handler/handler.h>
#include <handler/shared.h>
#include <scheduler/scheduler.h>
#include <asl/asl.h>

extern int semdev[SEM_DEV_N]; // la vera struttura dati sarà nell init.c
#include <shared/device/device.h>
#include <shared/device/terminal.h>

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
//---------------------------------------------------------------
Expand Down Expand Up @@ -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);
}
//-------------------------------------------------------------

Expand All @@ -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){
Expand All @@ -143,7 +153,7 @@ void Handler_Interrupt(void) {
scheduler_AddProcess(p);
}
}
sheduler_shedule(FALSE);
scheduler_schedule(FALSE);
}

int get_interrupting_line(state_t *request){
Expand Down Expand Up @@ -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;
}
//------------------------------------------------------------------
2 changes: 2 additions & 0 deletions src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,15 @@
#include <test.h>
#include <scheduler/scheduler.h>
#include <handler/shared.h>
#include <system/shared/device/device.h>

int main(){
//---------------------Inizialializzazione del sistema
initAreas();
SpecPassup_init();
initPcbs();
initASL();
device_init();
scheduler_init();
//----------------------------------------------------

Expand Down
32 changes: 32 additions & 0 deletions src/system/shared/device/device.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#include <system/system.h>
#include <system/shared/device/device.h>

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) ];
}

0 comments on commit 53338f6

Please sign in to comment.