Advertisement
teplofizik

nyaos.h (10)

Aug 13th, 2012
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.22 KB | None | 0 0
  1. // ***********************************************************
  2. // **                    NyaOS Sample                       **
  3. // ***********************************************************
  4. // http://teplofizik.diary.ru/p179620030.htm
  5.  
  6. // Файл описания функций и главных структур ОС.
  7.  
  8. #include "nyaos_config.h"
  9. #include <stdint.h>
  10.  
  11. #ifndef __NYAOS_H
  12. #define __NYAOS_H
  13.  
  14.     #define E_PROCESS_CREATED    0 // Процесс успешно создан.
  15.     #define E_PROCESS_MAX_COUNT  1 // Процессов слишком много. Нет свободных слотов.
  16.    
  17.     // Описание регистров в стеке после входа в прерывание
  18.     typedef struct
  19.     {
  20.         uint32_t  R0;  // Регистры общего назначения
  21.         uint32_t  R1;
  22.         uint32_t  R2;
  23.         uint32_t  R3;
  24.        
  25.         uint32_t  R12;
  26.        
  27.         uint32_t  LR;   // Регистр с адресом возврата
  28.         uint32_t  PC;   // Регистр-указатель команды
  29.        
  30.         uint32_t  CPSR; // Регистр статуса
  31.     } TInterruptStackFrame;
  32.  
  33.     // Контекст процесса
  34.     // Связанная величина: CONTEXT_SIZE (nyaos_core.s)
  35.     typedef struct
  36.     {
  37.         uint32_t     SP;        // Указатель стека процесса. Там сохранятся
  38.                                 // R0-R3, R12, LR, PC, CPSR
  39.        
  40.         uint32_t     Rother[8]; // Остальные регистры: R4-R11
  41.     } TProcessContext;
  42.    
  43.     // Флаги процессов
  44.     #define F_DELAY         (1UL << 0)  // Выполняется программная задержка
  45.     #define F_EVENT         (1UL << 1)  // Выполняется ожидание события
  46.    
  47.     // Запись о процессе
  48.     typedef struct
  49.     {
  50.         uint32_t                   PID;       // Идентификатор процесса
  51.         uint32_t                   Flags;     // Флаги
  52.         uint32_t                   Event;     // Событие
  53.         char *                     Name;      // Название процесса
  54.         volatile TProcessContext * Context;   // Контекст
  55.     } TProcess;
  56.  
  57.     // Определение функции процесса
  58.     // Аргументы: 1
  59.     //  Argument: передаётся из функции создания процесса
  60.     // Результат: код завершения.
  61.     typedef int (* TProcessFunc(uint32_t Argument));
  62.    
  63.     // Идентификатор события
  64.     typedef uint32_t EVENT;
  65.    
  66.     // Событие
  67.     typedef struct
  68.     {
  69.         EVENT    EventID; // Идентификатор события
  70.        
  71.         uint32_t Event;   // Адрес переменной
  72.     } TEvent;
  73.    
  74.     // Инициализация ОС
  75.     // Аргументы: нет
  76.     // Результат: нет
  77.     void nyaos_Init(void);
  78.        
  79.     // Запуск диспетчера ОС
  80.     void nyaos_Start(void);
  81.    
  82.     // Получить запись зарегистрированного события по идентификатору
  83.     // Аргументы: 1
  84.     //  Event: идентификатор события
  85.     // Результат: указатель на запись, если такая есть или ноль
  86.     volatile TEvent * nyaos_GetEvent(EVENT Event);
  87.        
  88.     // Добавить процесс
  89.     // Аргументы: 4
  90.     //  Name: имя процесса
  91.     //  EntryPoint: точка входа;
  92.     //  Argument: аргумент, которй будет передан в функцию;
  93.     //  Flags: параметры создания процесса.
  94.     // Результат: код ошибки
  95.     int nyaos_AddProcess(char * Name, void * EntryPoint, uint32_t Argument, uint32_t Flags);
  96.  
  97.     // Задержка
  98.     // Аргументы: 1
  99.     //  Value: счётчик, величина задержки
  100.     // Результат: нет
  101.     void delay(uint32_t Value);
  102.    
  103.    
  104.     // Инициализация выводов, подключённых к светодиодам
  105.     // Аргументы: нет
  106.     // Результат: нет
  107.     void LedInit(void);
  108.    
  109.     // Зажечь светодиод по его номеру
  110.     // Аргументы: 1
  111.     //  Index - номер светодиода, от 0 до 3
  112.     // Результат: нет
  113.     void LedOn(uint32_t Index);
  114.    
  115.     // Погасить светодиод по его номеру
  116.     // Аргументы: 1
  117.     //  Index - номер светодиода, от 0 до 3
  118.     // Результат: нет
  119.     void LedOff(uint32_t Index);
  120.    
  121.    
  122.    
  123.     // API
  124.     // Программная задержка
  125.     // Аргументы: 1
  126.     //  Milliseconds: величина задержки в миллисекундах
  127.     // Результат: нет
  128.     __svc(0) void Delay(uint32_t Milliseconds);
  129.    
  130.     // Ожидание события
  131.     // Аргументы: 1
  132.     //  Event: идентификатор события
  133.     // Результат: 0xFFFFFFFF, если такого события нет. Иначе же вернёт маскированное  
  134.     // содержимое регистра события (которое наблюдаем)
  135.     __svc(1) uint32_t WaitForEvent(EVENT Event);
  136.    
  137.     // Зарегистрировать событие
  138.     // Аргументы: 3
  139.     //  Event: идентификатор события
  140.     //  Value: адрес переменной, за которой наблюдаем.
  141.     // Результат: код ошибки (0 - добавилось, иначе ошибка).
  142.     __svc(2) uint32_t RegisterEvent(EVENT Event, volatile uint32_t * Value);
  143.    
  144.     // Сигнализировать событие
  145.     // Аргументы: 2
  146.     //  Event: код события
  147.     //  Value: значение для передачи
  148.     // Результаты: код ошибки, 0 если всё нормально.
  149.     __svc(3) uint32_t FireEvent(EVENT Event, uint32_t Value);
  150.  
  151. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement