Advertisement
teplofizik

nyaos_core.s (9)

Aug 11th, 2012
184
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; ***********************************************************
  2. ; **                    NyaOS Sample                       **
  3. ; ***********************************************************
  4. ; http://teplofizik.diary.ru/p179560849.htm
  5.  
  6.     AREA    |.text|, CODE, READONLY
  7.  
  8.             EXPORT nyaos_Stub
  9.             EXPORT nyaos_Start
  10.            
  11.             EXPORT SysTick_Handler
  12.            
  13.             IMPORT ProcessTable
  14.             IMPORT ContextTable
  15.             IMPORT CurrentProcess
  16.             IMPORT ProcessMaxCount
  17.             IMPORT Started
  18.            
  19.             GET system.inc
  20.  
  21. CONTEXT_SIZE    EQU  (9 * 4)
  22. PROCESS_SIZE    EQU  (4 * 4)
  23.  
  24. ; Диспетчер
  25. ; Переключение задач
  26. SysTick_Handler PROC
  27.                 ; Запомним код выхода в обычный режим
  28.                 MOV R12, LR
  29.                
  30.                 MOV32 R0, Started
  31.                 LDR   R1, [R0]
  32.                
  33.                 ; Если не начинали...
  34.                 CMP   R1, #0
  35.                 BEQ   _sysh_start
  36.                
  37.                 ; Загрузим адрес таблицы контекстов
  38.                 MOV32 R0, ContextTable
  39.                
  40.                 ; Загрузим номер текущего процесса (по таблице)
  41.                 MOV32 R1, CurrentProcess
  42.                 LDR   R1, [R1] ; Прочитаем номер процесса
  43.                 MOV   R3, R1   ; Запомним номер
  44.                 ; Выберем нужную запись
  45.                 MOV   R2, #CONTEXT_SIZE
  46.                 MUL   R1, R1, R2
  47.                 ADD   R1, R1, R0
  48.                
  49.                 ; Сохраним состояние старших регистров
  50.                 STR   SP,  [R1, #0x00]
  51.                 STR   R4,  [R1, #0x04]
  52.                 STR   R5,  [R1, #0x08]
  53.                 STR   R6,  [R1, #0x0C]
  54.                 STR   R7,  [R1, #0x10]
  55.                 STR   R8,  [R1, #0x14]
  56.                 STR   R9,  [R1, #0x18]
  57.                 STR   R10, [R1, #0x1C]
  58.                 STR   R11, [R1, #0x20]
  59.                
  60.                 B _sysh_loadptable
  61. _sysh_start
  62.                 ; Начали...
  63.                 MOV   R1, #1
  64.                 STR   R1, [R0]
  65.                
  66.                 ; Текущий Process: 0
  67.                 MOV   R3, #0
  68.                
  69. _sysh_loadptable
  70.                 ; Запомним номер процесса
  71.                 MOV   R0, R3
  72.                
  73.                 ; Загрузим таблицу процессов
  74.                 MOV32 R2, ProcessTable
  75.                 ; И размер одной записи...
  76.                 MOV   R5, #PROCESS_SIZE
  77.                
  78.                 ; Загрузим ограничение на количество
  79.                 MOV32 R4, ProcessMaxCount
  80.                 LDR   R4, [R4]
  81.                
  82.                 ; Ищем свободный PID
  83. _sysh_next
  84.                 ADD   R0, #1
  85.                
  86.                 ; Проверим на границу диапазона
  87.                 CMP   R0, R4
  88.                 ; Загрузим 1, если вылезли (0 для Idle)
  89.                 IT    EQ
  90.                 MOVEQ R0, #1
  91.                
  92.                 ; Сравним с номером, с которого начинали
  93.                 CMP   R0, R3
  94.                 ; Если он - загрузим процесс Idle (0).
  95.                 ITT   EQ
  96.                 MOVEQ R0, #0
  97.                 BEQ   _sysh_found
  98.                
  99.                 ; Нет, не он. Проверим PID
  100.                
  101.                 ; Считаем смещение до элемента
  102.                 MOV R6, R0
  103.                 MUL R6, R6, R5
  104.                 ADD R6, R2
  105.                
  106.                 ; Грузим PID
  107.                 LDR R6, [R6, #0]
  108.                
  109.                 ; Если ноль, ищем дальше.
  110.                 CMP R6, #0
  111.                 BEQ _sysh_next
  112.                
  113. _sysh_found     ; Процесс выбран
  114.  
  115.                 ; Сохраним номер выбранного процесса
  116.                 MOV32 R1, CurrentProcess
  117.                 STR   R0, [R1]
  118.                
  119.                 ; Выбираем контекст
  120.                 MOV32 R1, ContextTable
  121.                 MOV   R2, #CONTEXT_SIZE
  122.                 MUL   R2, R0, R2
  123.                 ADD   R1, R2
  124.                
  125.                 ; Загружаем регистры и указатель стека
  126.                 LDR   SP,  [R1, #0x00]
  127.                 LDR   R4,  [R1, #0x04]
  128.                 LDR   R5,  [R1, #0x08]
  129.                 LDR   R6,  [R1, #0x0C]
  130.                 LDR   R7,  [R1, #0x10]
  131.                 LDR   R8,  [R1, #0x14]
  132.                 LDR   R9,  [R1, #0x18]
  133.                 LDR   R10, [R1, #0x1C]
  134.                 LDR   R11, [R1, #0x20]
  135.                
  136.                 ; Выход из прерывания уже по новому PC
  137.                 BX  R12
  138.                 ENDP
  139.  
  140. ; Заглушка на всякий случай, если вдруг какому-либо процессу захочется выйти с помощью записи LR в PC.
  141. ; В дальнейшем может быть добавлен код для каноничного завершения такого процесса с ошибкой.
  142. ; Аргументы: нет
  143. ; Результаты: нет
  144. nyaos_Stub   PROC
  145.              B .
  146.              ENDP
  147.            
  148. ; Запуск ОС
  149. ; Аргументы: нет
  150. ; Результаты: нет
  151. nyaos_Start PROC
  152.             ; Диспетчер ещё не работал
  153.             MOV32 R1, Started
  154.             MOV   R0, #0
  155.             STR   R0, [R1]
  156.            
  157.             ; Разрешить прерывания от таймера
  158.             MOV R0, #1
  159.             BL  SysTickInterruptEnable
  160.            
  161.             ; По прерыванию выполнение перейдёт к процессу
  162. __mainloop
  163.  
  164.             ; На очередной круг
  165.             B __mainloop
  166.            
  167.             ENDP
  168.  
  169.     END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement