Scheduler_example12_Priority.ino 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. /**
  2. * This is a test of TaskScheduler layered priority funtionality
  3. *
  4. * Current test employs three priority layers:
  5. * Base scheduler runs tasks t1, t2 and t3
  6. * High priority scheduler runs tasks t4 and t5
  7. * Highest priority scheduler runs tasks t6 and t7
  8. *
  9. * Sequence of task scheduling (not execution!) is:
  10. * 6, 7, 4, 6, 7, 5, 1, 6, 7, 4, 6, 7, 5, 2, 6, 7, 4, 6, 7, 5, 3 = one base scheduler pass
  11. *
  12. * Scheduling overhead (at 20 micros per one pass) is: (B + B * H + B * H * C) * T = (3 + 3 * 2 + 3 * 2 * 2) * 18 = 378 micros
  13. * where
  14. * B - number of tasks in the base scheduler's chain
  15. * H - number of tasks in the high priority scheduler's chain
  16. * C - number of tasks in the critical priority scheduler's chain
  17. * T - scheduling overhead for 1 pass (~15-18 microseconds)
  18. *
  19. * Actual task execution order:
  20. Scheduler Priority Test
  21. Task: 600: 0 Start delay = 0
  22. Task: 700: 10 Start delay = 10
  23. Task: 40: 21 Start delay = 21
  24. Task: 50: 31 Start delay = 31
  25. Task: 1: 43 Start delay = 41
  26. Task: 2: 53 Start delay = 53
  27. Task: 3: 63 Start delay = 63
  28. Task: 600: 500 Start delay = 0
  29. Task: 40: 510 Start delay = 10
  30. Task: 600: 1000 Start delay = 0
  31. Task: 700: 1010 Start delay = 10
  32. Task: 40: 1021 Start delay = 21
  33. Task: 50: 1032 Start delay = 32
  34. Task: 1: 1043 Start delay = 43
  35. Task: 600: 1500 Start delay = 0
  36. Task: 40: 1510 Start delay = 10
  37. Task: 600: 2000 Start delay = 0
  38. Task: 700: 2011 Start delay = 11
  39. Task: 40: 2022 Start delay = 22
  40. Task: 50: 2032 Start delay = 32
  41. Task: 1: 2043 Start delay = 43
  42. Task: 2: 2054 Start delay = 54
  43. Task: 600: 2500 Start delay = 0
  44. Task: 40: 2510 Start delay = 10
  45. Task: 600: 3000 Start delay = 0
  46. Task: 700: 3010 Start delay = 10
  47. Task: 40: 3021 Start delay = 21
  48. Task: 50: 3032 Start delay = 32
  49. Task: 1: 3043 Start delay = 43
  50. Task: 3: 3053 Start delay = 53
  51. Task: 600: 3500 Start delay = 0
  52. Task: 40: 3510 Start delay = 10
  53. Task: 600: 4000 Start delay = 0
  54. Task: 700: 4011 Start delay = 11
  55. Task: 40: 4022 Start delay = 22
  56. Task: 50: 4032 Start delay = 32
  57. Task: 1: 4043 Start delay = 43
  58. Task: 2: 4054 Start delay = 54
  59. Task: 600: 4500 Start delay = 0
  60. Task: 40: 4510 Start delay = 10
  61. Task: 600: 5000 Start delay = 0
  62. Task: 700: 5010 Start delay = 10
  63. Task: 40: 5021 Start delay = 21
  64. Task: 50: 5031 Start delay = 31
  65. Task: 1: 5043 Start delay = 43
  66. Task: 600: 5500 Start delay = 0
  67. Task: 40: 5511 Start delay = 11
  68. Task: 600: 6000 Start delay = 0
  69. Task: 700: 6010 Start delay = 10
  70. Task: 40: 6022 Start delay = 22
  71. Task: 50: 6032 Start delay = 32
  72. Task: 1: 6043 Start delay = 43
  73. Task: 2: 6053 Start delay = 53
  74. Task: 3: 6065 Start delay = 65
  75. */
  76. #define _TASK_SLEEP_ON_IDLE_RUN
  77. #define _TASK_PRIORITY
  78. #define _TASK_WDT_IDS
  79. #define _TASK_TIMECRITICAL
  80. #include <TaskScheduler.h>
  81. Scheduler r;
  82. Scheduler hpr;
  83. Scheduler cpr;
  84. // Callback methods prototypes
  85. void tCallback();
  86. // Tasks
  87. Task t1(1000, TASK_FOREVER, &tCallback, &r); //adding task to the chain on creation
  88. Task t2(2000, TASK_FOREVER, &tCallback, &r);
  89. Task t3(3000, TASK_FOREVER, &tCallback, &r);
  90. Task t4(500, TASK_FOREVER, &tCallback, &hpr); //adding task to the chain on creation
  91. Task t5(1000, TASK_FOREVER, &tCallback, &hpr); //adding task to the chain on creation
  92. Task t6(500, TASK_FOREVER, &tCallback, &cpr); //adding task to the chain on creation
  93. Task t7(1000, TASK_FOREVER, &tCallback, &cpr); //adding task to the chain on creation
  94. void tCallback() {
  95. Scheduler &s = Scheduler::currentScheduler();
  96. Task &t = s.currentTask();
  97. Serial.print("Task: "); Serial.print(t.getId());Serial.print(":\t");
  98. Serial.print(millis()); Serial.print("\tStart delay = "); Serial.println(t.getStartDelay());
  99. delay(10);
  100. if (t.getId() == 3) Serial.println();
  101. }
  102. void setup () {
  103. Serial.begin(115200);
  104. Serial.println("Scheduler Priority Test");
  105. t4.setId(40);
  106. t5.setId(50);
  107. t6.setId(600);
  108. t7.setId(700);
  109. r.setHighPriorityScheduler(&hpr);
  110. hpr.setHighPriorityScheduler(&cpr);
  111. r.enableAll(true); // this will recursively enable the higher priority tasks as well
  112. }
  113. void loop () {
  114. r.execute();
  115. }