void PrefsDialog::initLayout(QFileInfoList & languages, QList<Platform *> platforms) { m_tabWidget = new QTabWidget(); m_general = new QWidget(); m_breadboard = new QWidget(); m_schematic = new QWidget(); m_pcb = new QWidget(); m_code = new QWidget(); m_tabWidget->setObjectName("preDia_tabs"); m_tabWidget->addTab(m_general, tr("General")); m_tabWidget->addTab(m_breadboard, m_viewInfoThings[0].viewName); m_tabWidget->addTab(m_schematic, m_viewInfoThings[1].viewName); m_tabWidget->addTab(m_pcb, m_viewInfoThings[2].viewName); m_tabWidget->addTab(m_code, tr("Code View")); QVBoxLayout * vLayout = new QVBoxLayout(); vLayout->addWidget(m_tabWidget); initGeneral(m_general, languages); initBreadboard(m_breadboard, &m_viewInfoThings[0]); initSchematic(m_schematic, &m_viewInfoThings[1]); initPCB(m_pcb, &m_viewInfoThings[2]); initCode(m_code, platforms); m_platforms = platforms; QDialogButtonBox * buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); buttonBox->button(QDialogButtonBox::Ok)->setText(tr("OK")); connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); vLayout->addWidget(buttonBox); this->setLayout(vLayout); }
/*inicializar el pcb*/ void initPCB(...) { //Inicializa el primer nodo del PCB pcb[0].offset = FP_OFF(filosofo1); pcb[0].quantum = quantum; pcb[0].id = 'A'; pcb[0].status = 1; pcb[0].stcPtr = 0; //Inicializa el segundo nodo del PCB pcb[1].offset = FP_OFF(filosofo2); pcb[1].quantum = quantum; pcb[1].id = 'B'; pcb[1].status = 2; //Inicializa el tercer nodo del PCB pcb[2].offset = FP_OFF(filosofo3); pcb[2].quantum = quantum; pcb[2].id = 'C'; pcb[2].status = 2; //Inicializa el cuarto nodo del PCB pcb[3].offset = FP_OFF(filosofo4); pcb[3].quantum = quantum; pcb[3].id = 'D'; pcb[3].status = 2; //Inicializa el quinto nodo del PCB pcb[4].offset = FP_OFF(filosofo5); pcb[4].quantum = quantum; pcb[4].id = 'D'; pcb[4].status = 2; //Guarda el SP de nuestro programa asm mov stackPointer,sp stackPointerAux = stackPointer; //Realiza un corrimiento en la pila para el primer proceso stackPointerAux = stackPointerAux - 512; indexOffset = pcb[1].offset; //Direccion del proceso i //Guarda todo el contexto del proceso 1 asm { mov SP, stackPointerAux pushf push cs push indexOffset push ax push bx push cx push dx push es push ds push si push di push bp mov stackPointerAux, SP mov SP, stackPointer }; //Guarda en el PCB el SP donde se encuentran el contexto del proceso pcb[1].stcPtr = stackPointerAux; //Realiza un corrimiento en la pila para el segundo proceso stackPointerAux = stackPointerAux - 1024; indexOffset = pcb[2].offset; //Guarda todo el contexto del proceso 2 asm { mov sp,stackPointerAux pushf push cs push indexOffset push ax push bx push cx push dx push es push ds push si push di push bp mov stackPointerAux, SP mov SP, stackPointer }; //Guarda en el PCB el SP donde se encuentran el contexto del proceso pcb[2].stcPtr = stackPointerAux; //Realiza un corrimiento en la pila para el tercer proceso stackPointerAux = stackPointerAux - 1536; indexOffset = pcb[3].offset; //Guarda todo el contexto del proceso 3 asm { mov sp,stackPointerAux pushf push cs push indexOffset push ax push bx push cx push dx push es push ds push si push di push bp mov stackPointerAux, SP mov SP, stackPointer }; //Guarda en el PCB el SP donde se encuentran el contexto del proceso pcb[3].stcPtr = stackPointerAux; //Realiza un corrimiento en la pila para el tercer proceso stackPointerAux = stackPointerAux - 2048; indexOffset = pcb[4].offset; //Guarda todo el contexto del proceso 3 asm { mov sp,stackPointerAux pushf push cs push indexOffset push ax push bx push cx push dx push es push ds push si push di push bp mov stackPointerAux, SP mov SP, stackPointer }; pcb[4].stcPtr = stackPointerAux; indexProcess = 0; quantumProcess =pcb[indexProcess].quantum; } /*Procemiento que reemplaza la interrupcion del timer con nuestro codigo fuente.*/ void main() { clrscr(); initPCB(); prev=getvect(8); //Guarda la interrupci¢n antigua del timer setvect(8,myTimer); //Inserta con nuestro c¢digo la interrupcion del time filosofo1(); clrscr(); while(1) {} } /*Codigo fuente de nuestra interrupcion del timer*/ void interrupt myTimer(...) { disable(); //Apaga las demás interrupciones (*prev)(); //Llama al antiguo c¢digo de interrupcion //Espera una tecla y verifica si es la tecla Enter if(kbhit() && getch() == 0xD) { //Devuelve la interrupción original setvect(8,prev); exit(0); } if (quantumProcess > 0 && pcb[indexProcess].status == 1) { quantumProcess--; } else { if ( pcb[indexProcess].status == 1) { pcb[indexProcess].status = 2; } //Salva el SP del proceso que se quedo sin quantum asm mov stackPointer, SP pcb[indexProcess].stcPtr = stackPointer; indexProcess = (indexProcess + 1) % N; stackPointer = pcb[indexProcess].stcPtr; quantumProcess = pcb[indexProcess].quantum; if(pcb[indexProcess].status == 2) { pcb[indexProcess].status = 1; } //Mueve el SP a donde esta el contexto del nuevo proceso que va ejecutar asm mov sp,stackPointer //Cambio de proceso. f = 0; mutex = 1; } enable(); //Activa las demás interrupciones }
/*inicializar el pcb*/ void initPCB(...) { //Inicializa el primer nodo del PCB pcb[0].offset = FP_OFF(processA); pcb[0].quantum = quantum; pcb[0].id = 'A'; pcb[0].status = 1; pcb[0].stcPtr = 0; //Inicializa el segundo nodo del PCB pcb[1].offset = FP_OFF(processB); pcb[1].quantum = quantum; pcb[1].id = 'B'; pcb[1].status = 2; //Guarda el SP de nuestro programa asm mov stackPointer,sp stackPointerAux = stackPointer; //Realiza un corrimiento en la pila para el primer proceso stackPointerAux = stackPointerAux - 512; indexOffset = pcb[1].offset; //Direccion del proceso i //Guarda todo el contexto del proceso 1 asm { mov SP, stackPointerAux pushf push cs push indexOffset push ax push bx push cx push dx push es push ds push si push di push bp mov stackPointerAux, SP mov SP, stackPointer }; //Guarda en el PCB el SP donde se encuentran el contexto del proceso pcb[1].stcPtr = stackPointerAux; indexProcess = 0; quantumProcess =pcb[indexProcess].quantum; } /*Procemiento que reemplaza la interrupcion del timer con nuestro codigo fuente.*/ void main() { clrscr(); initPCB(); prev=getvect(8); //Guarda la interrupci¢n antigua del timer setvect(8,myTimer); //Inserta con nuestro c¢digo la interrupcion del time actualProcess = 1; processA(); clrscr(); while(1) {} }