Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ***********************************************************
- // ** NyaOS Sample **
- // ***********************************************************
- // http://teplofizik.diary.ru/p179620030.htm
- // Файл описания функций и главных структур ОС.
- #include "nyaos_config.h"
- #include <stdint.h>
- #ifndef __NYAOS_H
- #define __NYAOS_H
- #define E_PROCESS_CREATED 0 // Процесс успешно создан.
- #define E_PROCESS_MAX_COUNT 1 // Процессов слишком много. Нет свободных слотов.
- // Описание регистров в стеке после входа в прерывание
- typedef struct
- {
- uint32_t R0; // Регистры общего назначения
- uint32_t R1;
- uint32_t R2;
- uint32_t R3;
- uint32_t R12;
- uint32_t LR; // Регистр с адресом возврата
- uint32_t PC; // Регистр-указатель команды
- uint32_t CPSR; // Регистр статуса
- } TInterruptStackFrame;
- // Контекст процесса
- // Связанная величина: CONTEXT_SIZE (nyaos_core.s)
- typedef struct
- {
- uint32_t SP; // Указатель стека процесса. Там сохранятся
- // R0-R3, R12, LR, PC, CPSR
- uint32_t Rother[8]; // Остальные регистры: R4-R11
- } TProcessContext;
- // Флаги процессов
- #define F_DELAY (1UL << 0) // Выполняется программная задержка
- #define F_EVENT (1UL << 1) // Выполняется ожидание события
- // Запись о процессе
- typedef struct
- {
- uint32_t PID; // Идентификатор процесса
- uint32_t Flags; // Флаги
- uint32_t Event; // Событие
- char * Name; // Название процесса
- volatile TProcessContext * Context; // Контекст
- } TProcess;
- // Определение функции процесса
- // Аргументы: 1
- // Argument: передаётся из функции создания процесса
- // Результат: код завершения.
- typedef int (* TProcessFunc(uint32_t Argument));
- // Идентификатор события
- typedef uint32_t EVENT;
- // Событие
- typedef struct
- {
- EVENT EventID; // Идентификатор события
- uint32_t Event; // Адрес переменной
- } TEvent;
- // Инициализация ОС
- // Аргументы: нет
- // Результат: нет
- void nyaos_Init(void);
- // Запуск диспетчера ОС
- void nyaos_Start(void);
- // Получить запись зарегистрированного события по идентификатору
- // Аргументы: 1
- // Event: идентификатор события
- // Результат: указатель на запись, если такая есть или ноль
- volatile TEvent * nyaos_GetEvent(EVENT Event);
- // Добавить процесс
- // Аргументы: 4
- // Name: имя процесса
- // EntryPoint: точка входа;
- // Argument: аргумент, которй будет передан в функцию;
- // Flags: параметры создания процесса.
- // Результат: код ошибки
- int nyaos_AddProcess(char * Name, void * EntryPoint, uint32_t Argument, uint32_t Flags);
- // Задержка
- // Аргументы: 1
- // Value: счётчик, величина задержки
- // Результат: нет
- void delay(uint32_t Value);
- // Инициализация выводов, подключённых к светодиодам
- // Аргументы: нет
- // Результат: нет
- void LedInit(void);
- // Зажечь светодиод по его номеру
- // Аргументы: 1
- // Index - номер светодиода, от 0 до 3
- // Результат: нет
- void LedOn(uint32_t Index);
- // Погасить светодиод по его номеру
- // Аргументы: 1
- // Index - номер светодиода, от 0 до 3
- // Результат: нет
- void LedOff(uint32_t Index);
- // API
- // Программная задержка
- // Аргументы: 1
- // Milliseconds: величина задержки в миллисекундах
- // Результат: нет
- __svc(0) void Delay(uint32_t Milliseconds);
- // Ожидание события
- // Аргументы: 1
- // Event: идентификатор события
- // Результат: 0xFFFFFFFF, если такого события нет. Иначе же вернёт маскированное
- // содержимое регистра события (которое наблюдаем)
- __svc(1) uint32_t WaitForEvent(EVENT Event);
- // Зарегистрировать событие
- // Аргументы: 3
- // Event: идентификатор события
- // Value: адрес переменной, за которой наблюдаем.
- // Результат: код ошибки (0 - добавилось, иначе ошибка).
- __svc(2) uint32_t RegisterEvent(EVENT Event, volatile uint32_t * Value);
- // Сигнализировать событие
- // Аргументы: 2
- // Event: код события
- // Value: значение для передачи
- // Результаты: код ошибки, 0 если всё нормально.
- __svc(3) uint32_t FireEvent(EVENT Event, uint32_t Value);
- #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement