Advertisement
Guest User

aled

a guest
Nov 22nd, 2019
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.16 KB | None | 0 0
  1.  
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <time.h>
  6.  
  7. #include "cpu.h"
  8. #include "asm.h"
  9. #include "systeme.h"
  10.  
  11. /**********************************************************
  12. ** Démarrage du système (création d'un programme)
  13. ***********************************************************/
  14.  
  15. int current_process = -1; /* nu du processus courant  */
  16.  
  17. PSW system_init(void)
  18. {
  19.     PSW cpu;
  20.  
  21.     process[++current_process].cpu = cpu;
  22.     process[current_process].state = READY;
  23.  
  24.     printf("Booting\n");
  25.     /*** création d'un programme ***/
  26.  
  27.     begin(20);
  28.     /*** créer un thread ***/
  29.     sysc(R1, R1, SYSC_NEW_THREAD); /* créer un thread  */
  30.     if_gt(10);                     /* le père va en 10 */
  31.  
  32.     /*** code du fils ***/
  33.     set(R3, 1000);          /* R3 = 1000    */
  34.     sysc(R3, 0, SYSC_PUTI); /* afficher R3  */
  35.     nop();
  36.     nop();
  37.  
  38.     /*** code du père ***/
  39.     label(10);              /* set label 10   */
  40.     set(R3, 2000);          /* R3 = 1000      */
  41.     sysc(R3, 0, SYSC_PUTI); /* afficher R3    */
  42.     sysc(0, 0, SYSC_EXIT);  /* fin du thread  */
  43.     end();
  44.  
  45.     /*** valeur initiale du PSW ***/
  46.     memset(&cpu, 0, sizeof(cpu));
  47.     cpu.PC = 0;
  48.     cpu.SB = 20;
  49.     cpu.SS = 30;
  50.  
  51.     return cpu;
  52. }
  53.  
  54. void wake(){
  55.     int date = time(NULL);
  56.     for(int i = 0 ; i < MAX_PROCESS ; i++){
  57.         if(process[current_process].state == ENDORMI){
  58.             if(process[current_process].date_reveil <= date){
  59.                 process[current_process].state = READY;
  60.             }
  61.         }
  62.     }
  63. }
  64.  
  65. PSW scheduler(PSW m)
  66. {
  67. wake();
  68.     process[current_process].cpu = m;
  69.     /* sauvegarder le processus courant si il existe */
  70.     do
  71.     {
  72.         current_process = (current_process + 1) % MAX_PROCESS;
  73.     } while (process[current_process].state != READY);
  74.     /* relancer ce processus */
  75.     return process[current_process].cpu;
  76. }
  77.  
  78. PSW sysc_exit(PSW m)
  79. {
  80.     process[current_process].state = EMPTY;
  81.     for (int i = 0; i < MAX_PROCESS; i++)
  82.     {
  83.         if (process[i].state == READY)
  84.         {
  85.             return scheduler(m); //process[i].cpu;
  86.         }
  87.     }
  88.  
  89.     printf("\nEXIT\n");
  90.     halt();
  91.     exit(EXIT_SUCCESS);
  92. }
  93.  
  94. int new_thread_number(PSW cpu)
  95. {
  96.     // ça fait un shallow copy automatiquement parce que c'est dans un langage chelou
  97.     for (int i = 0; i < MAX_PROCESS; i++)
  98.     {
  99.         if (process[i].state == EMPTY)
  100.         {
  101.             process[i].cpu = cpu;
  102.             process[i].state = READY;
  103.             return i;
  104.         }
  105.     }
  106.     return -1;
  107. }
  108.  
  109. PSW new_thread(PSW cpu)
  110. {
  111.  
  112.     int thread_number = new_thread_number(cpu);
  113.     PSW new_psw = process[thread_number].cpu;
  114.     new_psw.AC = 1;
  115.  
  116.     return new_psw;
  117. }
  118.  
  119. PSW sleep(PSW cpu){
  120.     int sleepDuration = cpu.RI.i;
  121.     int sleepTime = time(NULL) + sleepDuration;
  122.  
  123.     process[current_process].state = ENDORMI;
  124.     process[current_process].date_reveil = sleepTime;
  125.  
  126.     return scheduler(cpu);
  127. }
  128.  
  129. /**********************************************************
  130. ** Traitement des interruptions par le système (mode système)
  131. ***********************************************************/
  132.  
  133. PSW handle_int_sysc(PSW m, short arg)
  134. {
  135.     switch (arg)
  136.     {
  137.     case SYSC_EXIT:
  138.         return sysc_exit(m);
  139.     case SYSC_PUTI:
  140.         sysc_puti(m);
  141.         break;
  142.     case SYSC_NEW_THREAD:
  143.         return new_thread(m);
  144.     case SYSC_SLEEP:
  145.         return sleep(m);
  146.     }
  147.     return m;
  148. }
  149.  
  150. PSW process_interrupt(PSW m)
  151. {
  152.     // dump_cpu(m);
  153.     switch (m.IN)
  154.     {
  155.     case INT_TRACE:
  156.         return scheduler(m);
  157.         // dump_cpu(m);
  158.         break;
  159.     case INT_SYSC:
  160.         printf("\ntraitement de l'intéruption INT_SYSC\n");
  161.         return handle_int_sysc(m, m.RI.ARG);
  162.     case INT_KEYBOARD:
  163.         break;
  164.     case INT_SEGV:
  165.         printf("\nviolation mémoire\n");
  166.         exit(EXIT_FAILURE);
  167.     case INT_INST:
  168.         printf("\ninstruction inconnue\n");
  169.         exit(EXIT_FAILURE);
  170.     default:
  171.         printf("\ndefault\n");
  172.         exit(EXIT_FAILURE);
  173.     }
  174.     // printf("\n%d", m.IN);
  175.     return m;
  176. }
  177.  
  178. void sysc_puti(PSW m)
  179. {
  180.     printf("\n%d\n", m.DR[m.RI.i]);
  181. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement