FreeRTOS API Direct To Task Notifications

  • 29 Replies
  • 561 Views

*

Offline tha

  • *****
  • 3160
    • View Profile
Re: FreeRTOS API Direct To Task Notifications
« Reply #1 on: December 18, 2021, 06:15:09 am »
https://www.freertos.org/xTaskNotifyGive.html

xTaskNotifyGive / xTaskNotifyGiveIndexed
[RTOS Task Notification API]

task.h

 BaseType_t xTaskNotifyGive( TaskHandle_t xTaskToNotify );

 BaseType_t xTaskNotifyGiveIndexed( TaskHandle_t xTaskToNotify,
                                    UBaseType_t uxIndexToNotify );


แต่ละ task มี an array of 'task notifications' (หรือเพียงแค่ 'notifications'), แต่ละของมันมี a state และ a 32-bit value. A direct to task notification เป็น an event ที่ส่งโดยตรงไปยัง a task ที่สามารถปลดบล็อก the receiving task, และเลือกที่จะอัปเดตหนึ่งใน the receiving task’s notification values ได้หลายวิธี. ตัวอย่างเช่น, a notification อาจเขียนทับหนึ่งใน the receiving task's notification values, หรือเพียงแค่เซ็ตบิตอย่างน้อยหนึ่งบิตในหนึ่งใน the receiving task's notification values.

*

Offline tha

  • *****
  • 3160
    • View Profile
Re: FreeRTOS API Direct To Task Notifications
« Reply #2 on: December 18, 2021, 07:53:59 am »
xTaskNotifyGive() เป็น a macro ที่มุ่งหมายสำหรับใช้เมื่อ a task notification กำลังถูกใช้เป็น a light weight and faster binary หรือ counting semaphore ซึ่งเลือกได้. FreeRTOS semaphores ถูกให้โดยใช้ the xSemaphoreGive() API function, xTaskNotifyGive() จะเทียบเท่าที่ใช้หนึ่งใน the receiving RTOS task’s notification values แทนที่ a semaphore.

xTaskNotifyGive() and xTaskNotifyGiveIndexed() เป็นมาโครที่เทียบเท่ากัน - ความแตกต่างเพียงอย่างเดียวคือ xTaskNotifyGiveIndexed() สามารถดำเนินการกับ task notification ใดๆภายใน the array และ xTaskNotifyGive() ดำเนินการกับ the task notification ที่ array index 0 เสมอ.

เมื่อ a task notification value กำลังถูกใช้เป็น a binary or counting semaphore equivalent ดังนั้น the task ที่กำลังถูกแจ้งเตือนควรรอสำหรับ the notification โดยใช้ the ulTaskNotifyTake() API function แทนที่จะเป็น the xTaskNotifyWait() API function.

*

Offline tha

  • *****
  • 3160
    • View Profile
Re: FreeRTOS API Direct To Task Notifications
« Reply #3 on: December 18, 2021, 09:01:59 am »
Note: แต่ละ notification ภายใน the array ทำงานโดยอิสระ – a task สามารถบล็อกเฉพาะกับ notification หนึ่งรายการภายใน the array ในแต่ละครั้งเท่านั้นและจะไม่ถูกปลดบล็อกโดย a notification ที่ส่งไปยัง array index อื่นใดๆ.

xTaskNotifyGive() ต้องไม่ถูกเรียกจาก an interrupt service routine. ใช้ vTaskNotifyGiveFromISR() แทน

configUSE_TASK_NOTIFICATIONS ต้องถูกเซ็ตเป็น 1 ใน FreeRTOSConfig.h (หรือทิ้งไว้ไม่กำหนด) สำหรับมาโครเหล่านี้มีให้ใช้ประโยชน์. The constant configTASK_NOTIFICATION_ARRAY_ENTRIES เซ็ตจำนวนของ indexes ในแต่ละ task's array ของ task notifications.

*

Offline tha

  • *****
  • 3160
    • View Profile
Re: FreeRTOS API Direct To Task Notifications
« Reply #4 on: December 18, 2021, 10:02:07 am »
Backward compatibility information: (ข้อมูลความเข้ากันได้ย้อนหลัง)

ก่อนถึง FreeRTOS V10.4.0 แต่ละ task มี a single "notification value", และทุก task notification API functions ทำงานกับค่านั้น. การแทนที่ the single notification value ด้วย an array of notification values ทำให้จำเป็นต้องมีชุดใหม่ของ API functions ที่สามารถระบุที่อยู่ notifications ภายใน the array. xTaskNotifyGive() เป็น the original API function, และยังคงเข้ากันได้ย้อนหลังโดยทำงานกับ the notification value ที่ index 0 ใน the array เสมอ. การเรียก xTaskNotifyGive() เทียบเท่ากับการเรียก xTaskNotifyGiveIndexed() ที่มี the uxIndexToNotify parameter เซ็ตเป็น 0.

*

Offline tha

  • *****
  • 3160
    • View Profile
Re: FreeRTOS API Direct To Task Notifications
« Reply #5 on: December 18, 2021, 10:44:57 am »
Parameters:

     xTaskToNotify       The handle of the RTOS task ที่กำลังถูกแจ้งเตือน, และมี notification value ของมันที่เพิ่มขึ้น.

                                      เพื่อได้รับ a task's handle สร้าง the task โดยใช้ xTaskCreate() และทำการใช้ของ the pxCreatedTask parameter, หรือสร้าง
                                      the task โดยใช้ xTaskCreateStatic() และเก็บ the returned value, หรือใช้ the task's name ในการเรียกไปยัง
                                       xTaskGetHandle().

                                      The handle ของ the currently executing RTOS task ถูกส่งคืนกลับโดย the xTaskGetCurrentTaskHandle() API function.

     uxIndexToNotify   The index ภายใน the target task's array ของ notification values ที่ the notification จะถูกส่ง.

                                      uxIndexToNotify ต้องน้อยกว่า configTASK_NOTIFICATION_ARRAY_ENTRIES. xTaskNotifyGive() ไม่มี parameter นี้และ
                                      ส่ง notifications ไปยัง index 0 เสมอ.

Returns:

     xTaskNotifyGiveIndexed() เป็น a macro ที่เรียก xTaskNotifyIndexed() ที่มี the eAction parameter เซ็ตไปยัง eIncrement, ดังนั้นการเรียกทั้งหมดจะ
     ส่งคืนกลับ pdPASS.

Example usage:

[ตัวอย่างเพิ่มเติมถูกอ้างอิงจาก the main RTOS task notifications page]
(ตัวอย่างโค้ดดูในลิ้งค์เอานะครับ)
https://www.freertos.org/xTaskNotifyGive.html

*

Offline tha

  • *****
  • 3160
    • View Profile
Re: FreeRTOS API Direct To Task Notifications
« Reply #6 on: December 18, 2021, 02:15:54 pm »
https://www.freertos.org/vTaskNotifyGiveFromISR.html

vTaskNotifyGiveFromISR / vTaskNotifyGiveIndexedFromISR
[RTOS Task Notification API]

task.h

void vTaskNotifyGiveFromISR( TaskHandle_t xTaskToNotify,
                              BaseType_t *pxHigherPriorityTaskWoken );

 void vTaskNotifyGiveIndexedFromISR( TaskHandle_t xTaskHandle,
                                     UBaseType_t uxIndexToNotify,
                                     BaseType_t *pxHigherPriorityTaskWoken );


Versions ของ xTaskNotifyGive() and xTaskNotifyGiveIndexed() ที่สามารถถูกใช้จาก an interrupt service routine (ISR). ดู the documentation page สำหรับ the xTaskNotifyGive() API function สำหรับคำอธิบายของการทำงานของมันและ the necessary configuration parameters, ตลอดจน backward compatibility information.

Parameters:

     xTaskToNotify                          The handle of the RTOS task ที่กำลังถูกแจ้งเตือน, และมี notification value ของมันที่เพิ่มขึ้น.

                                                        เพื่อได้รับ a task's handle สร้าง the task โดยใช้ xTaskCreate() และทำการใช้ของ the pxCreatedTask
                                                        parameter,  หรือสร้าง the task โดยใช้ xTaskCreateStatic() และเก็บ the returned value, หรือใช้ the task's
                                                        name ในการเรียกไปยัง xTaskGetHandle().

                                                        The handle ของ the currently executing RTOS task ถูกส่งคืนกลับโดย the xTaskGetCurrentTaskHandle()
                                                        API function.

     uxIndexToNotify                       The index ภายใน the target task's array ของ notification values ที่ the notification จะถูกส่ง.

                                                        uxIndexToNotify ต้องน้อยกว่า configTASK_NOTIFICATION_ARRAY_ENTRIES.

                                                        xTaskNotifyGiveFromISR() ไม่มี parameter นี้และส่ง notifications ไปยัง index 0 เสมอ.

     pxHigherPriorityTaskWoken  *pxHigherPriorityTaskWoken ต้องถูกเริ่มต้นเป็น 0.

                                                        vTaskNotifyGiveFromISR() จะเซ็ต *pxHigherPriorityTaskWoken เป็น pdTRUE ถ้าการส่ง the notification
                                                        เป็นเหตุให้ a task ปลดบล็อก, และ the unblocked task มี a priority สูงกว่า the currently running task.

                                                        ถ้า vTaskNotifyGiveFromISR() เซ็ตค่านี้เป็น pdTRUE ดังนั้น a context switch ควรถูกร้องขอก่อน the interrupt
                                                        จะถูกออก. ดูตัวอย่างข้างล่าง.

                                                       pxHigherPriorityTaskWoken เป็น an optional parameter และสามารถถูกเซ็ตเป็น NULL.

Example usage:

[ตัวอย่างเพิ่มเติมถูกอ้างอิงจาก the main RTOS task notifications page]
(ตัวอย่างโค้ดดูในลิ้งค์เอานะครับ)

*

Offline tha

  • *****
  • 3160
    • View Profile
Re: FreeRTOS API Direct To Task Notifications
« Reply #7 on: December 18, 2021, 03:16:38 pm »
https://www.freertos.org/ulTaskNotifyTake.html

ulTaskNotifyTake / ulTaskNotifyTakeIndexed
[RTOS Task Notification API]

task.h

uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit,
                            TickType_t xTicksToWait );
 
 uint32_t ulTaskNotifyTakeIndexed( UBaseType_t uxIndexToWaitOn,
                                   BaseType_t xClearCountOnExit,
                                   TickType_t xTicksToWait );


แต่ละ task มี an array of 'task notifications' (หรือเพียงแค่ 'notifications'), แต่ละของมันมี a state และ a 32-bit value. A direct to task notification เป็น an event ที่ส่งโดยตรงไปยัง a task ที่สามารถปลดบล็อก the receiving task, และเลือกที่จะอัปเดตหนึ่งใน the receiving task’s notification values ได้หลายวิธี. ตัวอย่างเช่น, a notification อาจเขียนทับหนึ่งใน the receiving task's notification values, หรือเพียงแค่เซ็ตบิตอย่างน้อยหนึ่งบิตในหนึ่งใน the receiving task's notification values.

ulTaskNotifyTake() เป็น a macro ที่มุ่งหมายสำหรับใช้เมื่อ a task notification กำลังถูกใช้เป็น a light weight and faster binary หรือ counting semaphore ซึ่งเลือกได้. FreeRTOS semaphores ถูกได้รับโดยใช้ the xSemaphoreTake() API function, ulTaskNotifyTake() จะเทียบเท่าที่ใช้ a notification values แทนที่ a semaphore.

ulTaskNotifyTake() and ulTaskNotifyTakeIndexed() เป็นมาโครที่เทียบเท่ากัน - ความแตกต่างเพียงอย่างเดียวคือ ulTaskNotifyTakeIndexed() สามารถดำเนินการกับ task notification ใดๆภายใน the array และ ulTaskNotifyTake() ดำเนินการกับ the task notification ที่ array index 0 เสมอ.

เมื่อ a task กำลังใช้ a notification value เป็น a binary or counting semaphore  tasks อื่นๆและ interrupts ควรส่ง notifications ถึงมันโดยใช้อย่างใดอย่างหนึ่ง the xTaskNotifyGive() macro, หรือ the xTaskNotify() function ที่มี the function’s eAction parameter ที่เซ็ตไปยัง eIncrement (ทั้งสองเทียบเท่ากัน).

ulTaskNotifyTake() สามารถอย่างใดอย่างหนึ่ง เคลียร์ the task’s notification value เป็นศูนย์เมื่อออก, ซึ่งในกรณีนี้ the notification value ทำหน้าที่เหมือน a binary semaphore, หรือลด the task’s notification value เมื่อออก, ซึ่งในกรณีนี้ the notification value ทำหน้าที่เหมือน a counting semaphore มาก.

An RTOS task สามารถใช้ ulTaskNotifyTake() เพื่อ [เลือกได้] บล็อกเพื่อรอสำหรับ a task’s notification value. The task ไม่ได้ใช้ CPU time ใดๆในขณะที่มันอยู่ใน the Blocked state.