Advertisement
teplofizik

nyaos_api.c (10)

Aug 13th, 2012
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.15 KB | None | 0 0
  1. // ***********************************************************
  2. // **                    NyaOS Sample                       **
  3. // ***********************************************************
  4. // http://teplofizik.diary.ru/p179620030.htm
  5.  
  6. // API
  7.  
  8. #include "nyaos.h"
  9.  
  10. // Максимальное количество зарегистрированных событий
  11. extern const uint32_t           EventMaxCount;
  12.  
  13. // Текущий процесс
  14. extern volatile uint32_t        CurrentProcess;
  15.  
  16. // Таблица процессов
  17. extern volatile TProcess        ProcessTable[PROCESS_MAX_COUNT];
  18.  
  19. // Таблица контекстов
  20. extern volatile TProcessContext ContextTable[PROCESS_MAX_COUNT];
  21.  
  22. // Таблица зарегистрированных событий
  23. extern volatile TEvent          EventTable[EVENT_MAX_COUNT];
  24.  
  25. // Инициализация задержки
  26. void swi_Delay(uint32_t Milliseconds)
  27. {
  28.     volatile TProcess * Process = &ProcessTable[CurrentProcess];
  29.    
  30.     Process->Event = Milliseconds;
  31.     Process->Flags |= F_DELAY;
  32. }
  33.  
  34. // Инициализация ожидания события
  35. uint32_t swi_WaitForEvent(EVENT Event)
  36. {
  37.     volatile TProcess * Process = &ProcessTable[CurrentProcess];
  38.    
  39.     // Найти в таблице событие...
  40.     volatile TEvent * E = nyaos_GetEvent(Event);
  41.    
  42.     // Если такого нет - выходим.
  43.     if(!E) return 0xFFFFFFFF;
  44.    
  45.     // Скопипастим параметры
  46.     Process->Event      = E->Event;
  47.     Process->Flags     |= F_EVENT;
  48.    
  49.     // Этот результат перезапишется
  50.     return 0;
  51. }
  52.  
  53. // Зарегистрировать событие
  54. // Аргументы: 3
  55. //  Event: идентификатор события
  56. //  Value: адрес переменной, за которой наблюдаем.
  57. //  Mask:  маска для проверки
  58. // Результат: код ошибки (0 - добавилось, иначе ошибка).
  59. uint32_t swi_RegisterEvent(EVENT Event, volatile uint32_t * Value, uint32_t Mask)
  60. {
  61.     volatile TEvent * E = 0;
  62.     int i;
  63.    
  64.     // Найдём свободный слот
  65.     for(i = 0; i < EventMaxCount; i++)
  66.     {
  67.         E = &EventTable[i];
  68.        
  69.         if(E->EventID == 0) break;
  70.     }
  71.    
  72.     // Нет свободных слотов
  73.     if(i == EventMaxCount) return 1;
  74.    
  75.     E->EventID = Event;
  76.     E->Event   = (uint32_t)Value;
  77.    
  78.     return 0;
  79. }
  80.  
  81. // Сигнализировать событие
  82. // Аргументы: 2
  83. //  Event: код события
  84. //  Value: значение для передачи
  85. // Результаты: код ошибки, 0 если всё нормально.
  86. uint32_t swi_FireEvent(EVENT Event, uint32_t Value)
  87. {
  88.     volatile TEvent * E = 0;
  89.     int i;
  90.    
  91.     // Найдём свободный слот
  92.     for(i = 0; i < EventMaxCount; i++)
  93.     {
  94.         E = &EventTable[i];
  95.        
  96.         if(E->EventID == Event)
  97.         {
  98.             *(uint32_t *)E->Event = Value;
  99.             return 0;
  100.         }
  101.     }
  102.    
  103.     // Не нашли события
  104.     return 1;
  105. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement