From 93904cb2f34bba787a254916bf8ac736ca058508 Mon Sep 17 00:00:00 2001 From: cdez Date: Wed, 14 Feb 2024 13:20:04 -0700 Subject: [PATCH] Started outlining the CS480 Simulator 2 project, analyzed a testfile, and added SimTimer stuff ++ simtimer.c/h ++ testfile-dnw.mdf +- simulator.c/h -- Sim01 Grading --- Sim01_GradingForm_v01.xlsx | Bin 18524 -> 0 bytes Sim02/simtimer.c | 231 +++++++++++++++++++++++++++++++++++++ Sim02/simtimer.h | 45 ++++++++ Sim02/simulator.c | 25 +++- Sim02/simulator.h | 31 ++++- Sim02/testfile-dnw.mdf | 86 ++++++++++++++ 6 files changed, 415 insertions(+), 3 deletions(-) delete mode 100644 Sim01_GradingForm_v01.xlsx create mode 100644 Sim02/simtimer.c create mode 100644 Sim02/simtimer.h create mode 100644 Sim02/testfile-dnw.mdf diff --git a/Sim01_GradingForm_v01.xlsx b/Sim01_GradingForm_v01.xlsx deleted file mode 100644 index af3f902b60e0631aca9d10e6bc8eeaf76644698d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18524 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 diff --git a/Sim02/simtimer.c b/Sim02/simtimer.c new file mode 100644 index 0000000..374b580 --- /dev/null +++ b/Sim02/simtimer.c @@ -0,0 +1,231 @@ +// Program Information //////////////////////////////////////////////////////// +/** + * @file SimpleTimer.c + * + * @brief Implementation file for using a timer with micro-second precision + * + * @author Michael Leverington + * + * @details Implements member methods for timing + * + * @version 3.00 (02 February 2017) Update to simulator timer + 2.00 (13 January 2017) Update to C language + * 1.00 (11 September 2015) + * + * @Note Requires SimpleTimer.h. + * + */ + +// Precompiler directives ///////////////////////////////////////////////////// + +#ifndef SIMTIMER_C +#define SIMTIMER_C + +// Header files /////////////////////////////////////////////////////////////// + +#include "simtimer.h" + +// Constants ///////////////////////////////////////////////////////////////// + +const char RADIX_POINT = '.'; + +void runTimer( int milliSeconds ) + { + struct timeval startTime, endTime; + int startSec, startUSec, endSec, endUSec; + int uSecDiff, mSecDiff, secDiff, timeDiff; + + gettimeofday( &startTime, NULL ); + + startSec = startTime.tv_sec; + startUSec = startTime.tv_usec; + + timeDiff = 0; + + while( timeDiff < milliSeconds ) + { + gettimeofday( &endTime, NULL ); + + endSec = endTime.tv_sec; + endUSec = endTime.tv_usec; + uSecDiff = endUSec - startUSec; + + if( uSecDiff < 0 ) + { + uSecDiff = uSecDiff + 1000000; + + endSec = endSec - 1; + } + + mSecDiff = uSecDiff / 1000; + secDiff = ( endSec - startSec ) * 1000; + timeDiff = secDiff + mSecDiff; + } + } + +double accessTimer( int controlCode, char *timeStr ) + { + static Boolean running = False; + static int startSec = 0, endSec = 0, startUSec = 0, endUSec = 0; + static int lapSec = 0, lapUSec = 0; + struct timeval startData, lapData, endData; + double fpTime = 0.0; + + switch( controlCode ) + { + case ZERO_TIMER: + gettimeofday( &startData, NULL ); + running = True; + + startSec = startData.tv_sec; + startUSec = startData.tv_usec; + + fpTime = 0.000000000; + lapSec = 0.000000000; + lapUSec = 0.000000000; + + timeToString( lapSec, lapUSec, timeStr ); + break; + + case LAP_TIMER: + if( running == True ) + { + gettimeofday( &lapData, NULL ); + + lapSec = lapData.tv_sec; + lapUSec = lapData.tv_usec; + + fpTime = processTime( startSec, lapSec, + startUSec, lapUSec, timeStr ); + } + + else + { + fpTime = 0.000000000; + } + break; + + case STOP_TIMER: + if( running == True ) + { + gettimeofday( &endData, NULL ); + running = False; + + endSec = endData.tv_sec; + endUSec = endData.tv_usec; + + fpTime = processTime( startSec, endSec, + startUSec, endUSec, timeStr ); + } + + // assume timer not running + else + { + fpTime = 0.000000000; + } + break; + } + + return fpTime; + } + +double processTime( double startSec, double endSec, + double startUSec, double endUSec, char *timeStr ) + { + double secDiff = endSec - startSec; + double uSecDiff = endUSec - startUSec; + double fpTime; + + fpTime = (double) secDiff + (double) uSecDiff / 1000000; + + if( uSecDiff < 0 ) + { + uSecDiff = uSecDiff + 1000000; + secDiff = secDiff - 1; + } + + timeToString( secDiff, uSecDiff, timeStr ); + + return fpTime; + } + + +/* This is a bit of a drawn-out function, but it is written + to force the time result to always be in the form x.xxxxxxx + when printed as a string; this will not always be the case + if the time is presented as a floating point number +*/ +void timeToString( int secTime, int uSecTime, char *timeStr ) + { + int low, high, index = 0; + char temp; + + while( uSecTime > 0 ) + { + timeStr[ index ] = (char) ( uSecTime % 10 + '0' ); + uSecTime /= 10; + + index++; + + } + + while( index < 6 ) + { + timeStr[ index ] = '0'; + + index++; + } + + timeStr[ index ] = RADIX_POINT; + + index++; + + if( secTime < 10 ) // single digit in display + { + timeStr[ index ] = (char) ( secTime % 10 + '0' ); + + index++; + + timeStr[ index ] = SPACE; + + index++; + + secTime = 0; + } +/* + if( secTime == 0 ) + { + timeStr[ index ] = '0'; + + index++; + } +*/ + while( secTime > 0 ) + { + timeStr[ index ] = (char) ( secTime % 10 + '0' ); + + secTime /= 10; + + index++; + } + + timeStr[ index ] = NULL_CHAR; + + low = 0; high = index - 1; + + while( low < high ) + { + temp = timeStr[ low ]; + timeStr[ low ] = timeStr[ high ]; + timeStr[ high ] = temp; + + low++; high--; + } + } + +#endif // ifndef SIMTIMER_C + + + + + diff --git a/Sim02/simtimer.h b/Sim02/simtimer.h new file mode 100644 index 0000000..8c1969b --- /dev/null +++ b/Sim02/simtimer.h @@ -0,0 +1,45 @@ +// Program Information //////////////////////////////////////////////////////// +/** + * @file SimpleTimer.h + * + * @brief Header file for micro-second precision timer + * + * @author Michael Leverington + * + * @details Specifies all member methods of the SimpleTimer + * + * @version 2.00 (13 January 2017) + * 1.00 (11 September 2015) + * + * @Note None + */ + +// Precompiler directives ///////////////////////////////////////////////////// + +#ifndef SIMTIMER_H +#define SIMTIMER_H + +// Header files /////////////////////////////////////////////////////////////// + +#include +#include +#include +#include "OS_SimDriver.h" + +// Global Constants ////////////////////////////////////////////////////////// + +enum TIMER_CTRL_CODES { ZERO_TIMER, LAP_TIMER, STOP_TIMER }; + +extern const char RADIX_POINT; +extern const char SPACE; + +// Function Prototyp ///////////////////////////////////////////////////////// + +void runTimer( int milliSeconds ); +double accessTimer( int controlCode, char *timeStr ); +double processTime( double startSec, double endSec, + double startUSec, double endUSec, char *timeStr ); +void timeToString( int secTime, int uSecTime, char *timeStr ); + +#endif // ifndef SIMTIMER_H + diff --git a/Sim02/simulator.c b/Sim02/simulator.c index 15bb4dc..fea9eee 100644 --- a/Sim02/simulator.c +++ b/Sim02/simulator.c @@ -15,6 +15,29 @@ Dependencies: ??? */ void runSim(ConfigDataType *configPtr, OpCodeType *metaDataMstrPtr) { + // initialize function/variables + // need a FILE * for file operations + // need two working pointers, one for master loop, one for internal loop + // currentTime variable that stores the time. + // create the process list with createProcessList + // function holds master loop, loops until sys end opcode found OR PCB List != NULL + // will have a loop that goes from app start to app end for a PCB + // (checks to see if the next instruction is NOT app end), using getNextProcess? + // this will getNextOpCode + // this will checkForIO and run the IO operations, outputting to FILE * and/or monitor + // checkForIO will need the FILE * passed, will need timer access, and ??? + // this will checkForCPU and run the CPU operations, outputting to FILE * and/or monitor + // checkForCPU will need the FILE * passed, will need timer access, and ??? + // + // deallocate the process list with destroyProcessList printf("runSim called here"); // void function, no return. -} \ No newline at end of file +} + + // getNextProcess/scheduler/dispatcher run here, loads/"runs" the process + // getNextOpCode, not needed for Sim02 apparently, keep in mind. + // checkForIO, I think this gets passed the current process and runs the IO ops + // checkForCPU, I think this gets passed the current process and runs the CPU ops + // checkForMemory, I think this gets passed the current process + // and runs mem ops (not needed for Sim02) + // cpuIdler (not needed for Sim02) \ No newline at end of file diff --git a/Sim02/simulator.h b/Sim02/simulator.h index 2962751..e4ab7be 100644 --- a/Sim02/simulator.h +++ b/Sim02/simulator.h @@ -4,6 +4,7 @@ #include "StandardConstants.h" #include "configops.h" #include "metadataops.h" +#include "simtimer.h" // data structures @@ -19,7 +20,17 @@ typedef struct ProcessControlBlockStruct { int uniquePid; PROCESS_STATES process_state; - // + // need a process start ptr for where the process starts. + // this will be a mini loop within the master loop that goes until it + // hits the app end command. + // it may hold the next opcode, since you don't need to traverse backward + // have an IO cycle count here + // have a CPU cycle count here + // maybe have a total cycle count here + // time left could be calculated from these. + // potentially could change the cycles or have a 'left' variable to + // see how many are left. + // also need a time left state here? } ProcessControlBlock; /* @@ -33,6 +44,9 @@ Device Output/Device: none Dependencies: ??? */ // need a function (or functions) to handle FILE I/O? +// runSim function will have a FILE * + // will have a function that gets the FILE * and + // adds whatever operation occurred /* Name: ??? @@ -44,7 +58,20 @@ Device Input/Device: none Device Output/Device: none Dependencies: ??? */ -// need a function to ??? +// need a function for the global/local timer (given??? may need to just import) + +// need a function for scheduler/dispatcher + // this could use a switch statement to tell which scheduling method to choose from. + // Sim02 only requires FCFS working atm. + +// need a function called createProcessList +// this makes a linked list of PCBs, loads the first instruction after app start +// and ... + +// need a function called destroyProcessList +// deallocated the ll of PCBs recursively, frees the rest of the struct. + +// /* Name: runSim diff --git a/Sim02/testfile-dnw.mdf b/Sim02/testfile-dnw.mdf new file mode 100644 index 0000000..6fdd099 --- /dev/null +++ b/Sim02/testfile-dnw.mdf @@ -0,0 +1,86 @@ +Start Program Meta-Data Code: + +# starting the master loop +sys start + +# process 0 start +app start, 0 +# process 0 I/O (run HDD for 18 cycles) +dev in, hard drive, 18 +# process 0 CPU (run CPU for 9 cycles 3 times) +cpu process, 9 +cpu process, 9 +cpu process, 9 +# process 0 I/O (run monitor for 60 cycles) +dev out, monitor, 60 +# process 0 end +app end + +# P0 total cycles ran: 105 + +# process 1 start +app start, 0 +# process 1 I/O (run sound for 40 cycles, HDD for 30 cycles, sound for 25 cycles) +dev in, sound signal, 40 +dev in, hard drive, 30 +dev in, sound signal, 25 +# process 1 CPU (run CPU for 6 cycles) +cpu process, 6 +# process 1 I/O (run USB for 10 cycles) +dev out, usb, 10 +# process 1 end +app end + +# P1 total cycles ran: 111 + +# process 2 start +app start, 0 +# process 2 I/O (run video for 70 cycles) +dev in, video signal, 70 +# process 2 CPU (run CPU for 10 cycles) +cpu process, 10 +# process 2 I/O (run monitor for 70 cycles, HDD for 18 cycles) +dev out, monitor, 70 +dev in, hard drive, 18 +# process 2 CPU (run CPU for 9 cycles) +cpu process, 9 +# process 2 end +app end + +# P2 total cycles ran: 177 + +# process 3 start +app start, 0 +# process 3 I/O (run sound for 35 cycles, monitor for 100 cycles, keyboard for 50 cycles) +dev in, sound signal, 35 +dev out, monitor, 100 +dev in, keyboard, 50 +# process 3 CPU (run CPU for 9 cycles) +cpu process, 9 +# process 3 I/O (run video for 49 cycles) +dev out, video signal, 49 +# process 3 end +app end + +# P3 total cycles ran: 243 + +# process 4 start +app start, 0 +# process 4 I/O (run keyboard for 90 cycles, sound for 40 cycles, serial for 32 cycles) +dev in, keyboard, 90 +dev out, sound signal, 40 +dev out, serial, 32 +# process 4 CPU (run CPU for 10 cycles) +cpu process, 10 +# process 4 I/O (run HDD for 15 cycles) +dev in, hard drive, 15 +# process 4 end +app end + +# P4 total cycles ran: 187 + +# master loop ends +sys end + +End Program Meta-Data Code. +