Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ***********************************************************
- // ** NyaOS Sample **
- // ***********************************************************
- // http://teplofizik.diary.ru/p179620030.htm
- // API
- #include "nyaos.h"
- // Максимальное количество зарегистрированных событий
- extern const uint32_t EventMaxCount;
- // Текущий процесс
- extern volatile uint32_t CurrentProcess;
- // Таблица процессов
- extern volatile TProcess ProcessTable[PROCESS_MAX_COUNT];
- // Таблица контекстов
- extern volatile TProcessContext ContextTable[PROCESS_MAX_COUNT];
- // Таблица зарегистрированных событий
- extern volatile TEvent EventTable[EVENT_MAX_COUNT];
- // Инициализация задержки
- void swi_Delay(uint32_t Milliseconds)
- {
- volatile TProcess * Process = &ProcessTable[CurrentProcess];
- Process->Event = Milliseconds;
- Process->Flags |= F_DELAY;
- }
- // Инициализация ожидания события
- uint32_t swi_WaitForEvent(EVENT Event)
- {
- volatile TProcess * Process = &ProcessTable[CurrentProcess];
- // Найти в таблице событие...
- volatile TEvent * E = nyaos_GetEvent(Event);
- // Если такого нет - выходим.
- if(!E) return 0xFFFFFFFF;
- // Скопипастим параметры
- Process->Event = E->Event;
- Process->Flags |= F_EVENT;
- // Этот результат перезапишется
- return 0;
- }
- // Зарегистрировать событие
- // Аргументы: 3
- // Event: идентификатор события
- // Value: адрес переменной, за которой наблюдаем.
- // Mask: маска для проверки
- // Результат: код ошибки (0 - добавилось, иначе ошибка).
- uint32_t swi_RegisterEvent(EVENT Event, volatile uint32_t * Value, uint32_t Mask)
- {
- volatile TEvent * E = 0;
- int i;
- // Найдём свободный слот
- for(i = 0; i < EventMaxCount; i++)
- {
- E = &EventTable[i];
- if(E->EventID == 0) break;
- }
- // Нет свободных слотов
- if(i == EventMaxCount) return 1;
- E->EventID = Event;
- E->Event = (uint32_t)Value;
- return 0;
- }
- // Сигнализировать событие
- // Аргументы: 2
- // Event: код события
- // Value: значение для передачи
- // Результаты: код ошибки, 0 если всё нормально.
- uint32_t swi_FireEvent(EVENT Event, uint32_t Value)
- {
- volatile TEvent * E = 0;
- int i;
- // Найдём свободный слот
- for(i = 0; i < EventMaxCount; i++)
- {
- E = &EventTable[i];
- if(E->EventID == Event)
- {
- *(uint32_t *)E->Event = Value;
- return 0;
- }
- }
- // Не нашли события
- return 1;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement