// ********************************************************************** // ********************************************************************** // OS startup // // 1. Init OS // 2. Define reset longjmp vector // 3. Define global system semaphores // 4. Create CLI task // 5. Enter scheduling/idle loop // int main(int argc, char* argv[]) { // save context for restart (a system reset would return here...) int resetCode = setjmp(reset_context); superMode = TRUE; // supervisor mode switch (resetCode) { case POWER_DOWN_QUIT: // quit powerDown(0); printf("\nGoodbye!!"); return 0; case POWER_DOWN_RESTART: // restart powerDown(resetCode); printf("\nRestarting system...\n"); case POWER_UP: // startup break; default: printf("\nShutting down due to error %d", resetCode); powerDown(resetCode); return resetCode; } // output header message printf("%s", STARTUP_MSG); // initalize OS if ( resetCode = initOS()) return resetCode; // create global/system semaphores here //?? vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv charReady = createSemaphore("charReady", BINARY, 0); inBufferReady = createSemaphore("inBufferReady", BINARY, 0); keyboard = createSemaphore("keyboard", BINARY, 1); tics1sec = createSemaphore("tics1sec", BINARY, 0); tics10thsec = createSemaphore("tics10thsec", BINARY, 0); tics10secs = createSemaphore("tics10secs", COUNTING, 0); //?? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // schedule CLI task createTask("myShell", // task name P1_shellTask, // task MED_PRIORITY, // task priority argc, // task arg count argv); // task argument pointers // HERE WE GO................ // Scheduling loop // 1. Check for asynchronous events (character inputs, timers, etc.) // 2. Choose a ready task to schedule // 3. Dispatch task // 4. Loop (forever!) while(1) // scheduling loop { // check for character / timer interrupts pollInterrupts(); // schedule highest priority ready task if ((curTask = scheduler()) < 0) continue; // dispatch curTask, quit OS if negative return if (dispatcher() < 0) break; } // end of scheduling loop // exit os longjmp(reset_context, POWER_DOWN_QUIT); return 0; } // end main
// ********************************************************************** // ********************************************************************** // OS startup // // 1. Init OS // 2. Define reset longjmp vector // 3. Define global system semaphores // 4. Create CLI task // 5. Enter scheduling/idle loop // int main(int argc, char* argv[]) { // All the 'powerDown' invocations must occur in the 'main' // context in order to facilitate 'killTask'. 'killTask' must // free any stack memory associated with current known tasks. As // such, the stack context must be one not associated with a task. // The proper method is to longjmp to the 'reset_context' that // restores the stack for 'main' and then invoke the 'powerDown' // sequence. // save context for restart (a system reset would return here...) int resetCode = setjmp(reset_context); superMode = TRUE; // supervisor mode switch (resetCode) { case POWER_DOWN_QUIT: // quit powerDown(0); printf("\nGoodbye!!"); return 0; case POWER_DOWN_RESTART: // restart powerDown(resetCode); printf("\nRestarting system...\n"); break; case POWER_UP: // startup break; default: printf("\nShutting down due to error %d", resetCode); powerDown(resetCode); return 0; } // output header message printf("%s", STARTUP_MSG); // initalize OS initOS(); // create global/system semaphores here //?? vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv charReady = createSemaphore("charReady", BINARY, 0); inBufferReady = createSemaphore("inBufferReady", BINARY, 0); keyboard = createSemaphore("keyboard", BINARY, 1); tics1sec = createSemaphore("tics1sec", COUNTING, 0); tics10thsec = createSemaphore("tics10thsec", COUNTING, 0); tics10sec = createSemaphore("tics10sec", COUNTING, 0); dcChange = createSemaphore("dcChange", BINARY, 0); //?? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // schedule CLI task createTask("myShell", // task name P1_shellTask, // task MED_PRIORITY , // task priority argc, // task arg count argv); // task argument pointers // HERE WE GO................ // Scheduling loop // 1. Check for asynchronous events (character inputs, timers, etc.) // 2. Choose a ready task to schedule // 3. Dispatch task // 4. Loop (forever!) while(1) // scheduling loop { // check for character / timer interrupts pollInterrupts(); // schedule highest priority ready task if ((curTask = scheduler()) < 0) continue; // dispatch curTask, quit OS if negative return if (dispatcher() < 0) break; } // end of scheduling loop // exit os longjmp(reset_context, POWER_DOWN_QUIT); return 0; } // end main