FreeRTOS API RTOS Kernel Control

Started by tha, December 16, 2021, 09:56:56 AM

Previous topic - Next topic

tha

Detailed Description

taskYIELD

task. h

taskYIELD() ถูกใช้เพื่อร้องขอ a context switch ไปยัง task อื่น. อย่างไรก็ตาม, ถ้าไม่มี tasks อื่นใดที่มี a higher หรือ equal priority เทียบกับ the task ที่เรียก taskYIELD() ดังนั้น the RTOS scheduler จะเลือก the task ที่เรียก taskYIELD() นั้นให้รันอีกครั้ง.

ถ้า configUSE_PREEMPTION ถูกเซ็ตเป็น 1 ดังนั้น the RTOS scheduler จะทำการรัน the highest priority task ที่สามารถรันได้เสมอ, ดังนั้นการเรียก taskYIELD() จะไม่ส่งผลให้เกิดการสวิทช์ไปยัง a higher priority task.

tha

taskDISABLE_INTERRUPTS()

task. h

ถ้า the port ที่ใช้รองรับค่าคงที่ configMAX_SYSCALL_INTERRUPT_PRIORITY (หรือ configMAX_API_CALL_INTERRUPT_PRIORITY) , ดังนั้น taskDISABLE_INTERRUPTS จะอย่างใดอย่างหนึ่ง ปิดการใช้งาน interrupts ทั้งหมด, หรือบัง (ปิดการใช้งาน) interrupts สูงถึง the configMAX_SYSCALL_INTERRUPT_PRIORITY setting. เช็ค the implementation ของ taskDISABLE_INTERRUPTS สำหรับ the port ที่ใช้.

ถ้า the port ที่ใช้ไม่รองรับค่าคงที่ configMAX_SYSCALL_INTERRUPT_PRIORITY ดังนั้น taskDISABLE_INTERRUPTS() จะปิดการใช้งานแบบโกลบอล maskable interrupts ทั้งหมด.

โดยปกติมาโครนี้จะไม่ถูกเรียกโดยตรง และ taskENTER_CRITICAL() and taskEXIT_CRITICAL() ควรถูกใช้แทน.


tha

taskENABLE_INTERRUPTS()

task. h

มาโครที่เปิดการใช้งาน microcontroller interrupts.

โดยปกติมาโครนี้จะไม่ถูกเรียกโดยตรง และ taskENTER_CRITICAL() and taskEXIT_CRITICAL() ควรถูกใช้แทน.

tha

https://www.freertos.org/taskENTER_CRITICAL_taskEXIT_CRITICAL.html

taskENTER_CRITICAL()
taskEXIT_CRITICAL()

[RTOS Kernel Control]

task. h

void taskENTER_CRITICAL( void );
void taskEXIT_CRITICAL( void );


Critical sections ถูกเข้าสู่โดยการเรียก taskENTER_CRITICAL(), และที่ออกภายหลังโดยการเรียก taskEXIT_CRITICAL().

The taskENTER_CRITICAL() and taskEXIT_CRITICAL() macros จัดให้มี a basic critical section implementation ที่ทำงานโดยเพียงแค่ปิดการใช้งาน interrupts, อย่างใดอย่างหนึ่ง แบบโกลบอล, หรือสูงถึง a specific interrupt priority level. ดู the vTaskSuspendAll() RTOS API function สำหรับข้อมูลเกี่ยวกับการสร้าง a critical section โดยไม่มีการปิดการใช้งาน interrupts.

ถ้า the FreeRTOS port ที่กำลังถูกใช้ไม่ทำการใช้ the configMAX_SYSCALL_INTERRUPT_PRIORITY kernel configuration constant (เรียกอีกอย่างว่า  configMAX_API_CALL_INTERRUPT_PRIORITY), ดังนั้นการเรียก taskENTER_CRITICAL() จะปล่อยให้ interrupts ถูกปิดการใช้งานแบบโกลบอล. ถ้า the FreeRTOS port ที่กำลังถูกใช้ทำการใช้ the configMAX_SYSCALL_INTERRUPT_PRIORITY kernel configuration constant, ดังนั้นการเรียก taskENTER_CRITICAL() จะปล่อยให้ interrupts ที่และต่ำกว่า the interrupt priority ที่เซ็ตโดย configMAX_SYSCALL_INTERRUPT_PRIORITY ถูกปิดการใช้งาน, และ higher priority interrupt ทั้งหมดเปิดการใช้งาน.

Preemptive context switches จะเกิดขึ้นภายใน an interrupt เท่านั้น, ดังนั้นจะไม่เกิดขึ้นเมื่อ interrupts ถูกปิดการใช้งาน. ดังนั้น, the task ที่เรียก taskENTER_CRITICAL() จะได้รับการประกันว่ายังคงอยู่ใน the Running state จนกระทั่ง the critical section ถูกออก, เว้นแต่ the task พยยายาม block หรือ yield อย่างชัดแจ้ง (ซึ่งมันไม่ควรทำจากภายใน a critical section).

การเรียกไปยัง taskENTER_CRITICAL() and taskEXIT_CRITICAL() ถูกออกแบบเพื่อซ้อน. ดังนั้น, a critical section จะถูกออกเฉพาะเมื่อหนึ่งการเรียกไปยัง taskEXIT_CRITICAL() ถูกปฏิบัติสำหรับทุกๆการเรียกก่อนหน้าไปยัง taskENTER_CRITICAL().

Critical sections ต้องสั้นมาก มิฉะนั้นจะส่งผลเสียต่อ interrupt response times. ทุกๆการเรียกไปยัง taskENTER_CRITICAL() จะต้องถูกจับคู่อย่างใกล้ชิดกับการเรียกไปยัง taskEXIT_CRITICAL().

FreeRTOS API functions ต้องไม่ถูกเรียกจากภายใน a critical section.

taskENTER_CRITICAL() and taskEXIT_CRITICAL() ต้องไม่ถูกเรียกจาก an interrupt service routine (ISR) - ดู taskENTER_CRITICAL_FROM_ISR() and taskEXIT_CRITICAL_FROM_ISR() สำหรับ interrupt safe equivalents.

Parameters:

     None   

Returns:

     None

Example usage:
(ตัวอย่างโค้ดดูในลิ้งค์เอานะครับ)

tha

https://www.freertos.org/taskENTER_CRITICAL_FROM_ISR_taskEXIT_CRITICAL_FROM_ISR.html

taskENTER_CRITICAL_FROM_ISR()
taskEXIT_CRITICAL_FROM_ISR()

[RTOS Kernel Control]

task. h

UBaseType_t taskENTER_CRITICAL_FROM_ISR( void );
void taskEXIT_CRITICAL_FROM_ISR( UBaseType_t uxSavedInterruptStatus );


เวอร์ชั่นของ taskENTER_CRITICAL() and taskEXIT_CRITICAL() ที่สามารถถูกใช้ใน an interrupt service routine (ISR).

ใน an ISR critical sections ถูกเข้าสู่โดยการเรียก taskENTER_CRITICAL_FROM_ISR(), และที่ออกภายหลังโดยการเรียก taskEXIT_CRITICAL_FROM_ISR().

The taskENTER_CRITICAL_FROM_ISR() and taskEXIT_CRITICAL_FROM_ISR() macros จัดให้มี a basic critical section implementation ที่ทำงานโดยเพียงแค่ปิดการใช้งาน interrupts, อย่างใดอย่างหนึ่ง แบบโกลบอล, หรือสูงถึง a specific interrupt priority level.

ถ้า the FreeRTOS port ที่กำลังถูกใช้รองรับ interrupt nesting ดังนั้นการเรียก taskENTER_CRITICAL_FROM_ISR() จะปิดการใช้งาน interrupts ที่และต่ำกว่า the interrupt priority ที่เซ็ตโดย the configMAX_SYSCALL_INTERRUPT_PRIORITY (หรือ configMAX_API_CALL_INTERRUPT_PRIORITY) kernel configuration constant, และปล่อยให้ interrupt priorities อื่นทั้งหมดเปิดการใช้งาน. ถ้า the FreeRTOS port ที่กำลังถูกใช้ไม่รองรับ interrupt nesting ดังนั้น taskENTER_CRITICAL_FROM_ISR() and taskEXIT_CRITICAL_FROM_ISR() จะไม่มีผลใดๆ.

การเรียกไปยัง taskENTER_CRITICAL_FROM_ISR() and taskEXIT_CRITICAL_FROM_ISR() ถูกออกแบบมาเพื่อซ้อน,  แต่ความหมายของวิธีที่มาโครถูกใช้นั้นแตกต่างจาก the taskENTER_CRITICAL() and taskEXIT_CRITICAL() equivalents.

Critical sections ต้องสั้นมาก มิฉะนั้นจะส่งผลเสียต่อ the response times ของ higher priority interrupts ที่จะซ้อน. ทุกๆการเรียกไปยัง taskENTER_CRITICAL_FROM_ISR() จะต้องถูกจับคู่อย่างใกล้ชิดกับการเรียกไปยัง taskEXIT_CRITICAL_FROM_ISR().

FreeRTOS API functions ต้องไม่ถูกเรียกจากภายใน a critical section.

Parameters:

     uxSavedInterruptStatus     taskEXIT_CRITICAL_FROM_ISR() รับ uxSavedInterruptStatus เป็น parameter เดียวของมัน. ค่าที่ใช้เป็น the
                                                    uxSavedInterruptStatus parameter ต้องเป็นค่าที่ส่งคืนกลับจากการเรียกที่ตรงกันไปยัง
                                                    taskENTER_CRITICAL_FROM_ISR().

                                                    taskENTER_CRITICAL_FROM_ISR() ไม่รับ parameters ใดๆ.

Returns:

     taskENTER_CRITICAL_FROM_ISR() ส่งคืนกลับ the interrupt mask state ตามที่มันเป็นก่อน the macro ถูกเรียก. ค่าที่ส่งคืนกลับโดย
     taskENTER_CRITICAL_FROM_ISR() ต้องถูกใช้เป็น the uxSavedInterruptStatus parameter ในการเรียกที่ตรงกันไปยัง
     taskEXIT_CRITICAL_FROM_ISR().

     taskEXIT_CRITICAL_FROM_ISR() ไม่ส่งคืนกลับ a value.

Example usage:
(ตัวอย่างโค้ดดูในลิ้งค์เอานะครับ)

tha

https://www.freertos.org/a00132.html

vTaskStartScheduler
[RTOS Kernel Control]

task. h

void vTaskStartScheduler( void );

สตาร์ท the RTOS scheduler. หลังจากการเรียก the RTOS kernel จะควบคุมครอบคลุมซึ่ง tasks ถูกปฏิบัติและเมื่อใด.

The idle task และตัวเลือก the timer daemon task ถูกสร้างโดยอัตโนมัติเมื่อ the RTOS scheduler ถูกสตาร์ท.

vTaskStartScheduler() จะส่งคืนกลับเฉพาะถ้า RTOS heap มีไม่เพียงพอให้ใช้ประโยชน์เพื่อสร้าง the idle หรือ timer daemon tasks.

ทุก the RTOS demo application projects บรรจุตัวอย่างของการใช้ vTaskStartScheduler(), ปกติอยู่ใน the main() function ภายใน main.c.


tha

https://www.freertos.org/a00133.html

vTaskEndScheduler
[RTOS Kernel Control]

task. h

void vTaskEndScheduler( void );

NOTE:  นี้ถูกจัดให้มีใช้สำหรับ the x86 Real Mode PC port.

หยุด the RTOS kernel tick. tasks ที่สร้างทั้งหมดจะถูกลบโดยอัตโนมัติและ multitasking (อย่างใดอย่างหนึ่ง preemptive หรือ cooperative) จะหยุดลง. จากนั้นการปฏิบัติจะกลับมาทำงานต่อจากจุดที่ vTaskStartScheduler() ถูกเรียก, ราวกับว่า vTaskStartScheduler() เพิ่งกลับมา.

ดู the demo application file main. c ใน the demo/PC directory สำหรับตัวอย่างที่ใช้ vTaskEndScheduler ().

vTaskEndScheduler () ต้องการ an exit function ที่ถูกกำหนดไว้ภายใน the portable layer (ดู vPortEndScheduler () ใน port. c สำหรับ the PC port). นี้จะกระทำ hardware specific operations อย่างเช่นการหยุด the RTOS kernel tick.

vTaskEndScheduler () จะเป็นเหตุให้ the resources ทั้งหมดที่จัดสรรโดย the RTOS kernel ถูกปล่อยฟรี - แต่จะไม่ปล่อยฟรี resources ที่จัดสรรโดย application tasks.