Advertisement
teplofizik

main.c (10)

Aug 13th, 2012
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.95 KB | None | 0 0
  1. // ***********************************************************
  2. // **                    NyaOS Sample                       **
  3. // ***********************************************************
  4. // http://teplofizik.diary.ru/p179620030.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. // Процесс 3 - моргание светодиода
  39. int Process3(uint32_t Argument)
  40. {
  41.     while(1)
  42.     {
  43.         LedOn(Argument);
  44.        
  45.         Delay(500);
  46.        
  47.         LedOff(Argument);
  48.        
  49.         Delay(500);
  50.     }
  51. }
  52.  
  53. // Процесс 2 - работа с событием "нажатие кнопки"
  54. int Process2(uint32_t Argument)
  55. {
  56.     while(1)
  57.     {
  58.         // Получим номер светодиода через код события (я сделал их тождественными, см. наверху)
  59.         uint32_t Led = WaitForEvent(BUTTON_EVENT);
  60.        
  61.         // По нажатию кнопки мигнёт светодиод 1
  62.         // По отпускнию кнопки мигнёт светодиод 3
  63.        
  64.         LedOn(Led);
  65.        
  66.         Delay(100);
  67.        
  68.         LedOff(Led);
  69.     }
  70. }
  71.  
  72. // Процесс 1 - опрос кнопки и генерирование события
  73. int Process1(uint32_t Argument)
  74. {
  75.     int ButtonPressed = 0;
  76.    
  77.     // Настроим кнопку
  78.     ButtonInit();
  79.    
  80.     // Зарегистрируем событие EVT_SW1 на переменную MyEvent без маскирования
  81.     RegisterEvent(BUTTON_EVENT, &MyEvent);
  82.    
  83.     while(1)
  84.     {
  85.         Delay(10);
  86.        
  87.         if(ButtonGet())
  88.         {
  89.             LedOn(0);
  90.            
  91.             // Событие по нарастающему фронту сигнала
  92.             if(ButtonPressed == 0)
  93.             {
  94.                 // Передадим 1
  95.                 FireEvent(BUTTON_EVENT, BUTTON_ONDOWN);
  96.             }
  97.            
  98.             ButtonPressed = 1;
  99.         }
  100.         else
  101.         {
  102.             LedOff(0);
  103.            
  104.             // Событие по спадающему фронту сигнала
  105.             if(ButtonPressed == 1)
  106.             {
  107.                 // Передадим 3
  108.                 FireEvent(BUTTON_EVENT, BUTTON_ONUP);
  109.             }
  110.            
  111.             ButtonPressed = 0;
  112.         }
  113.     }
  114. }
  115.  
  116. int main(void)
  117. {
  118.     LedInit();
  119.    
  120.     // Инициализация и настройка ОС
  121.     nyaos_Init();
  122.    
  123.     // Процесс 1 - опрос кнопки и генерирование события
  124.     nyaos_AddProcess("Process1", &Process1, 0, 0);
  125.    
  126.     // Процесс 2 - работа с событием "нажатие кнопки"
  127.     nyaos_AddProcess("Process2", &Process2, 0, 0);
  128.    
  129.     // Процесс 3 - моргание светодиода 2 (передача через аргумент)
  130.     nyaos_AddProcess("Process3", &Process3, 2, 0);
  131.    
  132.     // Запуск ОС
  133.     nyaos_Start();
  134. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement