Advertisement
teplofizik

main.c (11)

Aug 14th, 2012
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.62 KB | None | 0 0
  1. // ***********************************************************
  2. // **                    NyaOS Sample                       **
  3. // ***********************************************************
  4. // http://teplofizik.diary.ru/p179655647.htm
  5.  
  6. #include "nyaos.h"
  7. #include <stm32f4xx.h>
  8.  
  9. volatile int A = 0;
  10.  
  11. // Идентификатор события (число любое, но уникальное)
  12. #define BUTTON_EVENT  0x100
  13.  
  14. // Дам номера кодам события BUTTON_EVENT тождественные номерам светодиодов, которыми
  15. // будем моргать по наступлении события
  16. #define BUTTON_ONDOWN 1
  17. #define BUTTON_ONUP   3
  18.  
  19. // Какое-то событие
  20. volatile uint32_t MyEvent = 0;
  21.  
  22. // Инициализация выводов, подключённых к кнопке
  23. // Аргументы: нет
  24. // Результат: нет
  25. void ButtonInit(void)
  26. {
  27.     RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
  28. }
  29.  
  30. // Инициализация выводов, подключённых к кнопке
  31. // Аргументы: нет
  32. // Результат: 0, если кнопка отпущена, 1, если нажата.
  33. uint32_t ButtonGet(void)
  34. {
  35.     return (GPIOA->IDR & 0x00000001);
  36. }
  37.  
  38. // Ведомый процесс, выполняющий моргание светодиода и завершающийся
  39. int SlaveProcess(uint32_t Argument)
  40. {
  41.     LedOn(Argument);
  42.        
  43.     Delay(100);
  44.        
  45.     LedOff(Argument);
  46.    
  47.     Delay(300);
  48.  
  49.     // Выход из процесса с кодом ошибки 0
  50.     // Аналогично можно сделать с помощью ExitProcess(0);
  51.     return 0;
  52. }
  53.  
  54. // Процесс 3 - моргание светодиода
  55. int Process3(uint32_t Argument)
  56. {
  57.     while(1)
  58.     {
  59.         LedOn(Argument);
  60.        
  61.         Delay(500);
  62.        
  63.         LedOff(Argument);
  64.        
  65.         Delay(500);
  66.     }
  67. }
  68.  
  69. // Процесс 2 - работа с событием "нажатие кнопки"
  70. int Process2(uint32_t Argument)
  71. {
  72.     while(1)
  73.     {
  74.         // Получим номер светодиода через код события (я сделал их тождественными, см. наверху)
  75.         uint32_t Led = WaitForEvent(BUTTON_EVENT);
  76.        
  77.         // По нажатию кнопки мигнёт светодиод 1
  78.         // По отпускнию кнопки мигнёт светодиод 3
  79.        
  80.         // Процесс 4 - моргнуть светодиодом через отдельный процесс
  81.         // Учтите! Пока он ждёт, он может пропускать события.
  82.         uint32_t ExitCode = CreateProcess("SlaveProcess", &SlaveProcess, Led, CP_F_WAIT_FOR_EXIT);
  83.     }
  84. }
  85.  
  86. // Процесс 1 - опрос кнопки и генерирование события
  87. int Process1(uint32_t Argument)
  88. {
  89.     int ButtonPressed = 0;
  90.    
  91.     // Настроим кнопку
  92.     ButtonInit();
  93.    
  94.     // Зарегистрируем событие EVT_SW1 на переменную MyEvent без маскирования
  95.     RegisterEvent(BUTTON_EVENT, &MyEvent);
  96.    
  97.     while(1)
  98.     {
  99.         Delay(10);
  100.        
  101.         if(ButtonGet())
  102.         {
  103.             LedOn(0);
  104.            
  105.             // Событие по нарастающему фронту сигнала
  106.             if(ButtonPressed == 0)
  107.             {
  108.                 // Передадим 1
  109.                 FireEvent(BUTTON_EVENT, BUTTON_ONDOWN);
  110.             }
  111.            
  112.             ButtonPressed = 1;
  113.         }
  114.         else
  115.         {
  116.             LedOff(0);
  117.            
  118.             // Событие по спадающему фронту сигнала
  119.             if(ButtonPressed == 1)
  120.             {
  121.                 // Передадим 3
  122.                 FireEvent(BUTTON_EVENT, BUTTON_ONUP);
  123.             }
  124.            
  125.             ButtonPressed = 0;
  126.         }
  127.     }
  128. }
  129.  
  130. int main(void)
  131. {
  132.     LedInit();
  133.    
  134.     // Инициализация и настройка ОС
  135.     nyaos_Init();
  136.    
  137.     // Процесс 1 - опрос кнопки и генерирование события
  138.     nyaos_AddProcess("Process1", &Process1, 0, 0);
  139.    
  140.     // Процесс 2 - работа с событием "нажатие кнопки"
  141.     nyaos_AddProcess("Process2", &Process2, 0, 0);
  142.    
  143.     // Процесс 3 - моргание светодиода 2 (передача через аргумент)
  144.     nyaos_AddProcess("Process3", &Process3, 2, 0);
  145.    
  146.     // Запуск ОС
  147.     nyaos_Start();
  148. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement