How does FreeRTOS allocate more service time (CPU cycles) to higher priority level task?

GolamMostafa
Posts: 19
Joined: Sun Jul 23, 2023 12:30 am

How does FreeRTOS allocate more service time (CPU cycles) to higher priority level task?

Postby GolamMostafa » Sun Aug 27, 2023 2:55 pm

I have been experimenting with the following setup (Fig-1) and the sketch to understand the mechanism of FreeRTOS in allocating more time to Task11 (with higher priority level 2) than Tasks10 with priority level 1. Would appreciate you explain this mechanism.
Sketch:
  1. TaskHandle_t Task10Handle;
  2. TaskHandle_t Task11Handle;
  3.  
  4. void setup()
  5. {
  6.   Serial.begin(115200);
  7.   analogReadResolution(12);
  8.  
  9.   xTaskCreatePinnedToCore(Task10, "Task-10", 2048, NULL, 1, &Task10Handle, 1);
  10.   xTaskCreatePinnedToCore(Task11, "Task-11", 2048, NULL, 2, &Task11Handle, 1);
  11. }
  12.  
  13. void loop() {}
  14.  
  15. void Task10(void *pvParameters)
  16. {
  17.   while (true)
  18.   {
  19.     int analogValue34 = analogRead(34);
  20.     Serial.print("ADC1_6: "); Serial.println(analogValue34);
  21.     vTaskDelay(pdMS_TO_TICKS(1000)); //
  22.   }
  23. }
  24.  
  25. void Task11(void *pvParameter)
  26. {
  27.   while (true)
  28.   {
  29.     int analogValue35 = analogRead(35);
  30.     Serial.print("ADC1_7: "); Serial.println(analogValue35);
  31.     vTaskDelay(pdMS_TO_TICKS(1000)); //
  32.   }
  33. }
Attachments
esp32InterTaskNotification.png
esp32InterTaskNotification.png (20.52 KiB) Viewed 2074 times

ESP_Sprite
Posts: 9052
Joined: Thu Nov 26, 2015 4:08 am

Re: How does FreeRTOS allocate more service time (CPU cycles) to higher priority level task?

Postby ESP_Sprite » Mon Aug 28, 2023 12:49 am

It won't. Given different priorities, FreeRTOS always allocates 100% of the time to the highest-priority task that is not blocking: it will always run that task until the task runs into something that de-schedules it (like the vTaskDelay in your example). See also here.

GolamMostafa
Posts: 19
Joined: Sun Jul 23, 2023 12:30 am

Re: How does FreeRTOS allocate more service time (CPU cycles) to higher priority level task?

Postby GolamMostafa » Mon Aug 28, 2023 3:33 pm

Thanks for the reply.

GolamMostafa
Posts: 19
Joined: Sun Jul 23, 2023 12:30 am

Re: How does FreeRTOS allocate more service time (CPU cycles) to higher priority level task?

Postby GolamMostafa » Tue Sep 05, 2023 8:01 am

I have prepared and tested the following three tasks sketch that blinks three LEDs concurrently at different blink rates. Are there anything exaggerate particulalry on the definition of Tick Time and Time Slice (Fig-2)?

Schematic:
esp32-3led.png
esp32-3led.png (11.07 KiB) Viewed 1765 times
Figure-1

Task State Diagram:
taskStateDiag.png
taskStateDiag.png (36.71 KiB) Viewed 1776 times
Figure-2:

Sketch:
  1. TaskHandle_t Task10Handle;
  2. TaskHandle_t Task11Handle;
  3.  
  4. #define LED 2     //BLU
  5. #define LED10 21  //RED
  6. #define LED11 22  //GRN
  7.  
  8. void setup()
  9. {
  10.   Serial.begin(115200);
  11.   pinMode(LED, OUTPUT);
  12.   pinMode(LED10, OUTPUT);
  13.   pinMode(LED11, OUTPUT);
  14.  
  15.   xTaskCreatePinnedToCore(Task10, "Task-10", 2048, NULL, 2, &Task10Handle, 1);//RED LED10
  16.   xTaskCreatePinnedToCore(Task11, "Task-11", 2048, NULL, 3, &Task11Handle, 1);//GRN LED11
  17. }
  18.  
  19. void loop()//BLU
  20. {
  21.   digitalWrite(LED, HIGH);
  22.   vTaskDelay(1500);
  23.   digitalWrite(LED, LOW);
  24.   vTaskDelay(1500);
  25. }
  26.  
  27. void Task10(void *pvParameters)//RED
  28. {
  29.   while (true)
  30.   {
  31.     digitalWrite(LED10, HIGH);
  32.     vTaskDelay(500);
  33.     digitalWrite(LED10, LOW);
  34.     vTaskDelay(500);
  35.   }
  36. }
  37.  
  38. void Task11(void *pvParameters)//GRN
  39. {
  40.   while (true)
  41.   {
  42.     digitalWrite(LED11, HIGH);
  43.     vTaskDelay(250);
  44.     digitalWrite(LED11, LOW);
  45.     vTaskDelay(250);
  46.   }
  47. }

Who is online

Users browsing this forum: No registered users and 131 guests