rtos.h 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. /******************************************************************************************
  2. * За основу взят планировщик задач с сайта ChipEnable.ru *
  3. * http://chipenable.ru/index.php/programming-avr/item/110-planirovschik.html *
  4. * *
  5. * Доработал Шибанов Владимир aka KontAr *
  6. * Дата: 26.03.2014 *
  7. * *
  8. * Изменения: *
  9. * - добавлен однократный вызов задачи *
  10. * - добавлено удаление задачи по имени *
  11. * - при повторном добавлении задачи обновляются ее переменные *
  12. * - добавлен указатель на "хвост" списка *
  13. * - функции РТОС скорректированы с учетом "хвоста" *
  14. ******************************************************************************************
  15. * shilov, 2015.04.07 *
  16. * совместил с модулем милисекундных задержек на таймере *
  17. ******************************************************************************************/
  18. #pragma once
  19. #ifndef RTOS_H
  20. #define RTOS_H
  21. #include <avr/io.h>
  22. #define MAX_TASKS 10 // Количество задач
  23. /**
  24. * Будем использовать таймер 0, период -- 1 мсек
  25. */
  26. #define TIMER_HZ 1000
  27. #define TIMER_PRESCALER 64
  28. #define TIMER_CNT (0x100 - (F_CPU / TIMER_PRESCALER / TIMER_HZ))
  29. #define TIMER_TCCR TCCR0
  30. #define TIMER_TCNT TCNT0
  31. #define TIMER_TIMSK TIMSK
  32. #define TIMER_CSB ((0<<CS02)|(1<<CS01)|(1<<CS00))
  33. #define TIMER_INT (1<<TOIE0)
  34. #define TIMER_OVF_VECT TIMER0_OVF_vect
  35. /**
  36. * Структура задачи
  37. */
  38. typedef struct task
  39. {
  40. void (*pFunc) (void); // указатель на функцию
  41. uint16_t delay; // задержка перед первым запуском задачи
  42. uint16_t period; // период запуска задачи
  43. uint8_t run; // флаг готовности задачи к запуску
  44. } task;
  45. /**
  46. * Прототипы фукнций
  47. */
  48. void RTOS_Init (void);
  49. void RTOS_SetTask (void (*taskFunc)(void), uint16_t taskDelay, uint16_t taskPeriod);
  50. void RTOS_DeleteTask (void (*taskFunc)(void));
  51. void RTOS_DispatchTask (void);
  52. void RTOS_Timer (void);
  53. void tdelay_ms(uint16_t msek);
  54. inline void tdelay_us(uint16_t usek) {
  55. usek = usek + TCNT1;
  56. while (TCNT1 < usek) {};
  57. }
  58. #endif