FreeRTOS

  • 119 Replies
  • 911 Views
*

Online tha

  • *****
  • 2755
    • View Profile
Re: FreeRTOS
« Reply #48 on: October 14, 2021, 01:13:39 pm »
     •  A separate(ที่แยกต่างหาก) API ถูกจัดให้มีสำหรับในภายในของ an interrupt. การแยก the API ที่ใช้จาก an RTOS task จากที่ใช้จาก an interrupt
         service routine หมายความว่า the implementation of the RTOS API functions ไม่เสียค่าใช้จ่ายของการตรวจเช็ค call context ของพวกมันแต่ละครั้งที่
         พวกมันปฏิบัติ. การใช้ a separate interrupt API ยังหมายถึง, ในกรณีส่วนใหญ่, การสร้าง RTOS aware interrupt service routines ง่ายสำหรับผู้ใช้ปลาย
         ทางกว่าเมื่อเทียบกับ RTOS products ทางเลือกอื่น.

     •  API นั้นง่ายกว่าในทุก ๆ ด้าน

The FreeRTOS tutorial book จัดให้มี additional information เกี่ยวกับ queues, binary semaphores, mutexes, counting semaphores และ recursive semaphores, พร้อมด้วย simple worked examples ใน a set of accompanying example projects.

*

Online tha

  • *****
  • 2755
    • View Profile
Re: FreeRTOS
« Reply #49 on: October 14, 2021, 02:04:31 pm »
Blocking on Queues

Queue API functions ยอมให้ a block time ถูกระบุ.

เมื่อ a task พยายามอ่านจาก an empty queue the task จะถูกวางลงใน the Blocked state (ดังนั้นมันไม่กิน any CPU time และ tasks อื่นสามารถ run) จนกระทั่งอย่างใดอย่างหนึ่ง data กลายมาเป็นมีให้ใช้ประโยชน์ได้บน the queue, หรือ the block time หมดเวลาลง.

เมื่อ a task พยายามเขียนถึง a full queue the task  จะถูกวางลงใน the Blocked state (ดังนั้นมันไม่กิน any CPU time และ tasks อื่นสามารถ run) จนกระทั่งอย่างใดอย่างหนึ่ง space กลายมาเป็นมีให้ใช้ประโยชน์ได้ใน the queue, หรือ the block time หมดเวลาลง.

ถ้ามีมากกว่าหนึ่ง task ถูกบล็อกบน the same queue ดังนั้น the task ที่มี the highest priorityจะเป็น the task ที่ถูก unblocked ก่อน.

ดู the Queue Management section of the user documentation สำหรับรายการของ queue related API functions. ค้นหา the files ใน the FreeRTOS/Demo/Common/Minimal directory จะแสดงหลายตัวอย่างการใช้งานของพวกมัน

โปรดทราบว่า interrupts ต้องไม่ใช้ API functions ที่ไม่สิ้นสุดใน "FromISR".

*

Online tha

  • *****
  • 2755
    • View Profile
Re: FreeRTOS
« Reply #50 on: October 15, 2021, 06:39:37 am »
https://www.freertos.org/Embedded-RTOS-Binary-Semaphores.html

FreeRTOS Binary Semaphores
[Inter-task communication and synchronisation]

[See also Blocking on Multiple RTOS Objects]

The FreeRTOS tutorial book จัดให้มี additional information เกี่ยวกับ queues, binary semaphores, mutexes, counting semaphores และ recursive semaphores, พร้อมด้วย simple worked examples ใน a set of accompanying example projects.

FreeRTOS Binary Semaphores

               TIP: 'Task Notifications' สามารถจัดให้มีทางเลือกที่มีน้ำหนักเบาไปยัง binary semaphores ในหลาย ๆ สถานการณ์

Binary semaphores ถูกใช้สำหรับวัตถุประสงค์ทั้ง mutual exclusion (กันไว้สำหรับคนพิเศษ ใช่ไหม?) และ synchronisation.

Binary semaphores and mutexes มีความคล้ายคลึงกันมาก แต่มีความแตกต่างเล็กน้อย: Mutexes รวมเอา a priority inheritance mechanism, binary semaphores ไม่. สิ่งนี้ทำให้ binary semaphores เป็นตัวเลือกที่ดีกว่าในการจัดให้มีใช้ synchronisation (ระหว่าง tasks หรือระหว่าง tasks และ an interrupt), และ mutexes เป็นตัวเลือกที่ดีกว่าในการจัดให้มีใช้ simple mutual exclusion. คำอธิบายของวิธีที่ a mutex สามารถถูกใช้เป็น a mutual exclusion mechanism ถือเท่าๆกันสำหรับ binary semaphores. ส่วนย่อยนี้จะอธิบายเฉพาะการใช้ binary semaphores สำหรับ synchronisation.

Semaphore API functions ยอมให้ a block time ถูกระบุ. The block time แสดงจำนวนสูงสุดของ 'ticks' ที่ a task ควรเข้าสู่ the Blocked state เมื่อพยายามให้ 'ได้' a semaphore, หาก the semaphore ไม่มีให้ใช้ประโยชน์โดยทันที. ถ้ามีมากกว่าหนึ่ง task ถูกบล็อกบน the same semaphore ดังนั้น the task ที่มี the highest priority จะเป็น the task ที่ถูก unblocked ในครั้งถัดไปที่ the semaphore กลายมาเป็นมีให้ใช้ประโยชน์.

*

Online tha

  • *****
  • 2755
    • View Profile
Re: FreeRTOS
« Reply #51 on: October 16, 2021, 06:57:33 am »
คิดว่า a binary semaphore เป็น a queue ที่สามารถถือหนึ่ง item เท่านั้น. The queue ดังนั้นสามารถว่างเปล่าหรือเติมเท่านั้น(จึงเป็น binary). Tasks และ interrupts ที่ใช้ the queue ไม่สนใจว่าอะไรที่ the queue ถือ - พวกมันต้องการทราบเพียงว่า the queue ว่างเปล่าหรือเติม. กลไกนี้สามารถถูกหาประโยชน์จากการซิงโครไนซ์  (ตัวอย่างเช่น) a task ด้วย an interrupt.

พิจารณากรณีที่ a task ถูกใช้เพื่อบริการ a peripheral. การวนตรวจ the peripheral จะสิ้นเปลืองทรัพยากรของ CPU , และป้องกันไม่ให้ tasks อื่นๆทำงาน. ดังนั้นจึงควรที่ the task จะใช้เวลาส่วนใหญ่ใน the Blocked state ดีกว่า (ยอมให้ tasks อื่นๆทำงาน) และดำเนินการเองเฉพาะเมื่อมีบางอย่างที่ต้องทำจริงๆ เท่านั้น. สิ่งนี้ถูกทำให้สำเร็จโดยใช้ a binary semaphore โดยที่ the task Block ขณะที่พยายามให้ 'ได้' the semaphore. An interrupt routine ดังนั้นถูกเขียนขึ้นสำหรับ the peripheral ที่เพียง 'ให้' the semaphore เมื่อ the peripheral ต้องการการบริการ  The task 'ได้' the semaphore เสมอ (อ่านจาก the queue ทำให้ the queue ว่างเปล่า), แต่ไม่เคย 'ให้' มัน. The interrupt 'ให้' the semaphore เสมอ (เขียนไปยัง the queue ทำให้มันเติม) แต่ไม่เคยได้มัน. The source code ที่จัดให้มีบน the xSemaphoreGiveFromISR() documentation page จะทำให้สิ่งนี้ชัดเจนขึ้น. ดู RTOS task notifications อีกด้วย, ซึ่งสามารถถูกใช้เป็นทางเลือก binary semaphore ที่เร็วขึ้นและน้ำหนักเบาขึ้นในบางสถานะการณ์.

Task prioritisation สามารถถูกใช้เพื่อให้แน่ใจว่า peripherals ได้รับการบริการในเวลาที่เหมาะสม - การสร้าง a 'deferred interrupt' scheme อย่างมีประสิทธิภาพ. (โปรดทราบว่า  FreeRTOS มี a built in deferred interrupt mechanism อีกด้วย). อีกวิธีหนึ่งคือการใช้ a queue แทน the semaphore.  เมื่อสิ่งนี้ถูกทำ the interrupt routine สามารถจับ the data ที่เกี่ยวข้องกับ the peripheral event และส่งมันไปบน a queue ไปยัง the task. The task ปลดบล็อกเมื่อ data กลายมาเป็นมีให้ใช้ประโยชน์บน the queue, ดึงเอา the data จาก the queue, จากนั้นดำเนินการ any data processing ที่ต้องการ. แบบแผนที่สองนี้ยอมให้ interrupts คงอยู่สั้นที่สุดเท่าที่จะเป็นไปได้ โดยกระบวนการโพสต์ทั้งหมดจะเกิดขึ้นแทนภายใน a task.

ดู the Semaphores/Mutexes section ของ the user documentation สำหรับรายการของ semaphore related API functions. ค้นหา the files ใน the FreeRTOS/Demo/Common/Minimal directory จะแสดงหลายตัวอย่างของการใช้ของพวกมัน. โปรดทราบว่า interrupts ต้องไม่ใช้ API functions ที่ไม่สิ้นสุดใน "FromISR".

                                           
                                                 (ภาพดูในลิ้งค์เอานะ จะเป็นภาพเคลื่อนไหว)
การใช้ a semaphore เพื่อซิงโครไนซ์ a task กับ an interrupt. The interrupt  'ให้' the semaphore เท่านั้น, ขณะที่ the task 'ได้' the semaphore เท่านั้น.

*

Online tha

  • *****
  • 2755
    • View Profile
Re: FreeRTOS
« Reply #52 on: October 16, 2021, 10:42:57 am »
https://www.freertos.org/Real-time-embedded-RTOS-Counting-Semaphores.html

FreeRTOS Counting Semaphores
[Inter-task communication and synchronisation]

[See also Blocking on Multiple RTOS Objects]

The FreeRTOS tutorial book จัดให้มี additional information เกี่ยวกับ queues, binary semaphores, mutexes, counting semaphores และ recursive semaphores, พร้อมด้วย simple worked examples ใน a set of accompanying example projects.

FreeRTOS Counting Semaphores

               TIP: 'Task Notifications' สามารถจัดให้มีทางเลือกที่มีน้ำหนักเบาไปยัง counting semaphores ในหลาย ๆ สถานการณ์

เช่นเดียวกับ binary semaphores สามารถคิดได้ว่าเป็น queues ที่มีความยาวหนึ่ง, counting semaphores สามารถคิดได้ว่าเป็น queues ที่มีความยาวมากกว่าหนึ่ง. อีกครั้ง, ผู้ใช้ the semaphore ไม่ต้องสนใจ the data ที่เก็บไว้ใน the queue - เพียงสนใจว่า the queue ว่างเปล่าหรือไม่.

*

Online tha

  • *****
  • 2755
    • View Profile
Re: FreeRTOS
« Reply #53 on: October 16, 2021, 11:02:00 am »
     1. Counting events

         ในสถานการณ์การใช้งานนี้ an event handler จะ 'ให้' a semaphore แต่ละครั้งที่ an event เกิดขึ้น (เพิ่ม the semaphore count value), และ a handler
         task จะ 'ได้' a semaphore แต่ละครั้งที่มันประมวลผล an event (ลด the semaphore count value). The count value จึงเป็นความแตกต่างกันระหว่าง
         จำนวนของ events ที่เกิดขึ้นแล้วและจำนวนที่ถูกประมวลผลอยู่. ในกรณีนี้ขอแนะนำให้ the count value เป็นศูนย์เมื่อ the semaphore ถูกสร้าง.

*

Online tha

  • *****
  • 2755
    • View Profile
Re: FreeRTOS
« Reply #54 on: October 16, 2021, 11:17:40 am »
     2. Resource management.

         ในสถานการณ์การใช้งานนี้ the count value แสดงจำนวนของ resources ที่มีให้ใช้ประโยชน์. เพื่อให้ได้มาซึ่งการควบคุม a resource a task ต้องได้รับ a
         semaphore ก่อน - ลด the semaphore count value. เมื่อ the count value ถึงศูนย์จะไม่มี free resources. เมื่อ a task เสร็จสิ้นการใช้ the resource
         มันจะ 'ให้' the semaphore กลับ - เพิ่ม the semaphore count value. ในกรณีนี้ขอแนะนำให้ the count value เป็นเท่ากับ the maximum count
         value เมื่อ the semaphore ถูกสร้าง.

ดู the Semaphores/Mutexes section ของ the user documentation สำหรับรายการของ semaphore related API functions. ค้นหา the files ใน the FreeRTOS/Demo/Common/Minimal directory จะแสดงหลายตัวอย่างของการใช้ของพวกมัน. โปรดทราบว่า interrupts ต้องไม่ใช้ API functions ที่ไม่สิ้นสุดใน "FromISR".

*

Online tha

  • *****
  • 2755
    • View Profile
Re: FreeRTOS
« Reply #55 on: October 16, 2021, 01:19:28 pm »
https://www.freertos.org/Real-time-embedded-RTOS-mutexes.html

FreeRTOS Mutexes
[Inter-task communication and synchronisation]

[See also Blocking on Multiple RTOS Objects]

The FreeRTOS tutorial book จัดให้มี additional information เกี่ยวกับ queues, binary semaphores, mutexes, counting semaphores และ recursive semaphores, พร้อมด้วย simple worked examples ใน a set of accompanying example projects.

FreeRTOS Mutexes

Mutexes เป็น binary semaphores ที่รวมเอา a priority inheritance mechanism. ขณะที่ binary semaphores เป็นทางเลือกที่ดีกว่าสำหรับการจัดให้มีใช้ synchronisation (ระหว่าง tasks หรือระหว่าง tasks และ an interrupt), mutexes เป็นทางเลือกที่ดีกว่าสำหรับการจัดให้มีใช้ simple mutual exclusion(กันไว้สำหรับคนพิเศษ) (ด้วยเหตุนี้ 'MUT'ual 'EX'clusion).

เมื่อถูกใช้สำหรับ mutual exclusion(กันไว้สำหรับคนพิเศษ) the mutex จะทำหน้าที่เหมือน a token ที่ถูกใช้เพื่อปกป้อง a resource. เมื่อ a task ต้องการเข้าถึง the resource มันต้องได้รับ ('ได้') the token ก่อน. เมื่อมันสำเร็จกับ the resource นี้แล้วมันต้อง 'ให้' the token กลับคืน - ยอมให้ tasks อื่นมีโอกาศเข้าถึง the same resource.