Scheduler_example11_Priority.ino 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. /**
  2. * This is a test of TaskScheduler layered priority funtionality
  3. *
  4. * Current test employs two priority layers:
  5. * Base scheduler runs tasks t1, t2 and t3
  6. * High priority scheduler runs tasks t4 and t5
  7. *
  8. * Sequence of task scheduling (not execution!) is:
  9. * 4, 5, 1, 4, 5, 2, 4, 5, 3 = one base scheduler pass
  10. *
  11. * Scheduling overhead (at 20 micros per one pass) is: (B + B * H) * T = (3 + 3 * 2) * 18 = 162 micros
  12. * where
  13. * B - number of tasks in the base scheduler's chain
  14. * H - number of tasks in the high priority scheduler's chain
  15. * T - scheduling overhead for 1 pass (~15-18 microseconds)
  16. *
  17. * Actual task execution order:
  18. Scheduler Priority Test
  19. Task: 40: 0 Start delay = 0
  20. Task: 50: 10 Start delay = 10
  21. Task: 1: 21 Start delay = 21
  22. Task: 2: 31 Start delay = 31
  23. Task: 3: 41 Start delay = 41
  24. Task: 40: 500 Start delay = 0
  25. Task: 40: 1000 Start delay = 0
  26. Task: 50: 1010 Start delay = 10
  27. Task: 1: 1021 Start delay = 20
  28. Task: 40: 1500 Start delay = 0
  29. Task: 40: 2000 Start delay = 0
  30. Task: 50: 2011 Start delay = 11
  31. Task: 1: 2022 Start delay = 21
  32. Task: 2: 2032 Start delay = 32
  33. Task: 40: 2500 Start delay = 0
  34. Task: 40: 3000 Start delay = 0
  35. Task: 50: 3010 Start delay = 10
  36. Task: 1: 3021 Start delay = 20
  37. Task: 3: 3032 Start delay = 32
  38. Task: 40: 3500 Start delay = 0
  39. Task: 40: 4000 Start delay = 0
  40. Task: 50: 4011 Start delay = 11
  41. Task: 1: 4022 Start delay = 21
  42. Task: 2: 4032 Start delay = 32
  43. Task: 40: 4500 Start delay = 0
  44. Task: 40: 5000 Start delay = 0
  45. Task: 50: 5010 Start delay = 10
  46. Task: 1: 5021 Start delay = 20
  47. Task: 40: 5500 Start delay = 0
  48. Task: 40: 6000 Start delay = 0
  49. Task: 50: 6010 Start delay = 10
  50. Task: 1: 6022 Start delay = 21
  51. Task: 2: 6032 Start delay = 32
  52. Task: 3: 6043 Start delay = 42
  53. */
  54. #define _TASK_SLEEP_ON_IDLE_RUN
  55. #define _TASK_PRIORITY
  56. #define _TASK_WDT_IDS
  57. #define _TASK_TIMECRITICAL
  58. #include <TaskScheduler.h>
  59. Scheduler r, hpr;
  60. // Callback methods prototypes
  61. void tCallback();
  62. // Tasks
  63. Task t1(1000, TASK_FOREVER, &tCallback, &r); //adding task to the chain on creation
  64. Task t2(2000, TASK_FOREVER, &tCallback, &r);
  65. Task t3(3000, TASK_FOREVER, &tCallback, &r);
  66. Task t4(500, TASK_FOREVER, &tCallback, &hpr); //adding task to the chain on creation
  67. Task t5(1000, TASK_FOREVER, &tCallback, &hpr); //adding task to the chain on creation
  68. void tCallback() {
  69. Scheduler &s = Scheduler::currentScheduler();
  70. Task &t = s.currentTask();
  71. Serial.print("Task: "); Serial.print(t.getId());Serial.print(":\t");
  72. Serial.print(millis()); Serial.print("\tStart delay = "); Serial.println(t.getStartDelay());
  73. delay(10);
  74. if (t.getId() == 3) Serial.println();
  75. }
  76. void setup () {
  77. Serial.begin(115200);
  78. Serial.println("Scheduler Priority Test");
  79. t4.setId(40);
  80. t5.setId(50);
  81. r.setHighPriorityScheduler(&hpr);
  82. r.enableAll(true); // this will recursively enable the higher priority tasks as well
  83. }
  84. void loop () {
  85. r.execute();
  86. }