Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Messages - tha

Pages: [1] 2 3 ... 394
1
ARM Processors / Re: FreeRTOS API Semaphore / Mutexes
« on: January 16, 2022, 08:50:01 am »
https://www.freertos.org/xSemaphoreTakeFromISR.html

xSemaphoreTakeFromISR
[Semaphores]

semphr. h

xSemaphoreTakeFromISR
      (
        SemaphoreHandle_t xSemaphore,
        signed BaseType_t *pxHigherPriorityTaskWoken
      )


A version of xSemaphoreTake() ที่สามารถถูกเรียกจาก an ISR. ไม่เหมือน xSemaphoreTake(), xSemaphoreTakeFromISR() ไม่ยอมให้ a block time ถูกระบุ.

Parameters:

     xSemaphore                          The semaphore ที่กำลังถูก 'taken'. A semaphore ถูกอ้างอิงโดยตัวแปรชนิด
                                                     SemaphoreHandle_t และต้องถูกสร้างอย่างชัดแจ้งก่อนที่จะถูกใช้.

 pxHigherPriorityTaskWoken   เป็นไปได้ (แม้ว่าไม่น่าเป็นไปได้และขึ้นอยู่กับ the semaphore type) ที่ a semaphore จะมีอย่าง
                                                     น้อยหนึ่ง tasks ที่บล็อกบนมันรอเพื่อให้ the semaphore. การเรียก
                                                     xSemaphoreTakeFromISR() จะทำให้ a task ที่ถูกบล็อกรอเพื่อให้ the semaphore
                                                     ออกจาก the Blocked state. ถ้าการเรียก the API function เป็นเหตุให้ a task ออกจาก
                                                     the Blocked state, และ the unblocked task นั้นมี a priority เท่ากับสูงกว่า the
                                                     currently executing task (the task ที่ถูกอินเตอร์รัพท์), ดังนั้น, ภายใน, the API
                                                     function จะเซ็ต *pxHigherPriorityTaskWoken เป็น pdTRUE.

                                                     ถ้า xSemaphoreTakeFromISR() เซ็ต *pxHigherPriorityTaskWoken เป็น pdTRUE,
                                                     ดังนั้น a context switch ควรถูกดำเนินการก่อนที่ the interrupt จะถูกออก. นี้จะทำให้แน่ใจ
                                                     ว่า the interrupt รีเทิร์นโดยตรงไปยัง the highest priority Ready state task. The
                                                     mechanism นี้เหมือนกันกับนั่นที่ใช้ใน the xQueueReceiveFromISR() function, และ
                                                     readers ถูกอ้างอิงถึง the xQueueReceiveFromISR() documentation สำหรับคำ
                                                     อธิบายที่มากขึ้น.

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

Returns:

     pdTRUE ถ้า the semaphore ถูก taken สำเร็จ. pdFALSE ถ้า the semaphore ไม่ถูก taken สำเร็จเนื่องจากมันไม่มีให้ใช้
     ประโยชน์.

2
ARM Processors / Re: FreeRTOS API Semaphore / Mutexes
« on: January 16, 2022, 06:00:22 am »
https://www.freertos.org/a00122.html

xSemaphoreTake
[Semaphores]

 เคล็ดลับ: ในสถานการณ์การใช้งานหลายๆ สถานการณ์มันจะเร็วกว่าและ memory มีประสิทธิภาพมากขึ้นในการใช้ a direct to task
                                                        notification แทน a semaphore


semphr. h

 xSemaphoreTake( SemaphoreHandle_t xSemaphore,
                 TickType_t xTicksToWait );

Macro เพื่อรับ a semaphore. The semaphore ต้องถูกสร้างก่อนหน้าด้วยการเรียกถึง xSemaphoreCreateBinary(), xSemaphoreCreateMutex() or xSemaphoreCreateCounting().

มาโครนี้ต้องไม่ถูกเรียกจาก an ISR. xQueueReceiveFromISR() สามารถถูกใช้เพื่อเอา a semaphore จากภายใน an interrupt ถ้าต้องการ, แม้ว่าจะไม่ใช่การดำเนินการปกติก็ตาม. Semaphores ใช้ queues เป็นกลไกพื้นฐานของพวกมัน ดังนั้นฟังก์ชันจึงสามารถทำงานร่วมกันได้ในระดับหนึ่ง.

Parameters:

     xSemaphore         A handle to the semaphore ที่กำลังถูก take - ได้รับเมื่อ the semaphore ถูกสร้าง.

     xTicksToWait         เวลาเป็น ticks เพื่อรอสำหรับ the semaphore กลายมาเป็นมีให้ใช้ประโยชน์. The macro
                                    portTICK_PERIOD_MS สามารถถูกใช้เพื่อแปลงเป็น a real time. A block time เป็นศูนย์สามารถถูกใช้
                                    เพื่อวนตรวจเช็ค the semaphore.

                                     ถ้า INCLUDE_vTaskSuspend ถูกเซ็ตเป็น '1' ดังนั้นการระบุ the block time เป็น portMAX_DELAY
                                     จะเป็นเหตุให้ the task บล็อกโดยไม่มีกำหนด (โดยไม่มี a timeout).

Returns:

     pdTRUE ถ้า the semaphore ถูกได้รับแล้ว. pdFALSE ถ้า xTicksToWait หมดเวลาลงโดยไม่มี the semaphore กลายมาเป็นมีให้
     ใช้ประโยชน์.

Example usage:



3
ARM Processors / Re: FreeRTOS API Semaphore / Mutexes
« on: January 15, 2022, 06:08:39 am »
https://www.freertos.org/uxSemaphoreGetCount.html

uxSemaphoreGetCount
[Semaphores]

semphr. h

UBaseType_t uxSemaphoreGetCount( SemaphoreHandle_t xSemaphore );
   
ส่งคืนกลับจำนวนของ a semaphore.

Parameters:

     xSemaphore     The handle of the semaphore ที่กำลังถูกสอบถาม.

Returns:

     ถ้า the semaphore เป็น a counting semaphore ดังนั้น the semaphores current count value ถูกส่งคืนกลับ. ถ้า the
     semaphore เป็น a binary semaphore ดังนั้น 1 ถูกส่งคืนกลับถ้า the semaphore มีให้ใช้เป็นประโยชน์, และ 0 ถูกส่งคืนกลับถ้า
     the semaphore ไม่มีให้ใช้เป็นประโยชน์.

4
ARM Processors / Re: FreeRTOS API Semaphore / Mutexes
« on: January 15, 2022, 05:50:18 am »
https://www.freertos.org/xSemaphoreGetMutexHolder.html

xSemaphoreGetMutexHolder
[Semaphores]

semphr. h

TaskHandle_t xSemaphoreGetMutexHolder( SemaphoreHandle_t xMutex );

INCLUDE_xSemaphoreGetMutexHolder ต้องถูกเซ็ตเป็น 1 ใน FreeRTOSConfig.h สำหรับฟัชชั่นนี้มีให้ใช้เป็นประโยชน์.

ส่งคืนกลับ the handle of the task ที่เก็บ the mutex ที่ระบุโดย the function parameter, หากมี.

xSemaphoreGetMutexHolder() สามารถถูกใช้อย่างน่าเชื่อถือเพื่อตรวจสอบว่า the calling task เป็น the mutex holder หรือไม่, แต่ไม่สามารถถูกใช้ได้อย่างน่าเชื่อถือถ้า the mutex ถูกยึดโดย task อื่นนอกเหนือจาก the calling task. นี้เนื่องจาก the mutex holder อาจเปลี่ยนระหว่าง the calling task ที่กำลังเรียก the function, และ the calling task ที่กำลังทดสอบ the function's return value.

configUSE_MUTEXES ต้องถูกเซ็ตเป็น 1 ใน FreeRTOSConfig.h สำหรับ xSemaphoreGetMutexHolder() มีให้ใช้เป็นประโยชน์.

Parameters:
     
     xMutex          The handle of the mutex ที่กำลังถูกสอบถาม.

Returns:

     The handle of the task ที่ยึด the mutex ที่ระบุโดย the xMutex parameter. NULL ถูกส่งคืนกลับถ้า the semaphore ที่ส่ง
     ผ่านใน the xMutex parameter ไม่ใช่ a mutex type semaphore, หรือถ้า the mutex มีให้ใช้เป็นประโยชน์และดังนั้นไม่ถูกยึด
     โดย task ใดๆ.

5
ARM Processors / Re: FreeRTOS API Semaphore / Mutexes
« on: January 14, 2022, 10:06:37 am »
https://www.freertos.org/xSemaphoreCreateRecursiveMutexStatic.html

xSemaphoreCreateRecursiveMutexStatic
[Semaphores]

semphr. h

SemaphoreHandle_t xSemaphoreCreateRecursiveMutexStatic(
                              StaticSemaphore_t *pxMutexBuffer )


สร้าง a recursive mutex, และส่งคืนกลับ a handle ซึ่ง the mutex สามารถถูกอ้างอิง. Recursive mutexes ไม่สามารถถูกใช้ใน interrupt service routines. configUSE_RECURSIVE_MUTEXES และ configSUPPORT_STATIC_ALLOCATION ทั้งคู่ต้องถูกเซ็ตเป็น 1 ใน FreeRTOSConfig.h สำหรับ xSemaphoreCreateRecursiveMutexStatic() นี้มีให้ใช้เป็นประโยชน์.

แต่ละ recursive mutex ต้องการจำนวนน้อยๆของ RAM ที่ถูกใช้เพื่อเก็บ the recursive mutex's state. ถ้า a mutex ถูกสร้างโดยใช้ xSemaphoreCreateRecursiveMutex() ดังนั้น RAM ที่ต้องการจะถูกจัดสรรโดยอัตโนมัติจาก the FreeRTOS heap. ถ้า a recursive mutex ถูกสร้างโดยใช้ xSemaphoreCreateRecursiveMutexStatic() ดังนั้น the RAM ถูกจัดให้มีโดย the application writer, ซึ่งต้องการ parameter เพิ่มเติม, แต่ยอมให้ the RAM ถูกจัดสรรแบบคงที่ที่เวลา compile. ดู the Static Vs Dynamic allocation page สำหรับข้อมูลเพิ่มเติม.

Recursive mutexes  ถูก 'taken(เอา)' (ได้รับ) โดยใช้ the xSemaphoreTakeRecursive() และถูกให้ (ปลดปล่อย) โดยใช้ the xSemaphoreGiveRecursive() API functions ตามลำดับ. xSemaphoreTake() and xSemaphoreGive() ต้องไม่ถูกใช้.

Non-recursive mutexes ถูกสร้างโดยใช้ xSemaphoreCreateMutex() and xSemaphoreCreateMutexStatic(). A non-recursive mutex สามารถถูก 'เอา(taken)' ได้โดย a task เพียงครั้งเดียว. ความพยายามใดๆโดย a task เพื่อเอา a non-recursive mutex ที่มันถูกยึดแล้วจะล้มเหลว - และ the mutex จะถูกให้กลับในครั้งแรกที่ the task 'ให้'  the mutex.

ตรงกันข้ามกับ non-recursive mutexes, a task สามารถ 'take' a recursive mutex ได้หลายครั้ง, และ the recursive mutex จะถูกส่งคืนกลับเฉพาะหลังจาก the holding task  'given(ให้)' the mutex ในจำนวนครั้งเท่ากันที่มัน 'took(เอา)' the mutex.

เหมือน non-recursive mutexes, recursive mutexes จัดให้มีใช้ a priority inheritance algorithm. The priority of a task ที่ 'takes(เอา)' a mutex สามารถถูกทำให้พุ่งขึ้นชั่วคราวถ้าอีก task หนึ่งที่มี higher priority พยายามได้รับ the same mutex. The task ที่เป็นเจ้าของ the mutex 'inherits(สืบทอด)' the priority of the task ที่กำลังพยายาม 'take(เอา)' the same mutex. นี้หมายความว่า the mutex ต้องถูก 'given(ให้)' กลับเสมอ - มิฉะนั้น the higher priority task จะไม่สามารถได้รับ the mutex, และ the lower priority task จะไม่ 'disinherit(ละทิ้ง)' the priority.

Parameters:

     pxMutexBuffer   ต้องชี้ไปยังตัวแปรของชนิด StaticSemaphore_t, ซึ่งจะถูกใช้เพื่อเก็บ the mutex type semaphore's state.

Returns:

     ถ้า the recursive mutex ถูกสร้างสำเร็จดังนั้น a handle to the created mutex จะถูกส่งคืนกลับ. ถ้า the recursive mutex ไม่
     ถูกสร้างเนื่องจาก pxMutexBuffer เป็น NULL ดังนั้น NULL จะถูกส่งคืนกลับ.



6
ARM Processors / Re: FreeRTOS API Semaphore / Mutexes
« on: January 14, 2022, 08:23:57 am »
เหมือน non-recursive mutexes, recursive mutexes จัดให้มีใช้ a priority inheritance algorithm. The priority of a task ที่ 'takes(เอา)' a mutex สามารถถูกทำให้พุ่งขึ้นชั่วคราวถ้าอีก task หนึ่งที่มี higher priority พยายามได้รับ the same mutex. The task ที่เป็นเจ้าของ the mutex 'inherits(สืบทอด)' the priority of the task ที่กำลังพยายาม 'take(เอา)' the same mutex. นี้หมายความว่า the mutex ต้องถูก 'given(ให้)' กลับเสมอ - มิฉะนั้น the higher priority task จะไม่สามารถได้รับ the mutex, และ the lower priority task จะไม่ 'disinherit(ละทิ้ง)' the priority.

Returns:

     ถ้า the recursive mutex ถูกสร้างสำเร็จดังนั้น a handle to the created mutex จะถูกส่งคืนกลับ. ถ้า the recursive mutex ไม่
     ถูกสร้างเนื่องจาก the RAM ที่ต้องการเพื่อเก็บ the mutex ไม่สามารถถูกจัดสรรดังนั้น NULL จะถูกส่งคืนกลับ.


7
ARM Processors / Re: FreeRTOS API Semaphore / Mutexes
« on: January 14, 2022, 05:13:24 am »
Non-recursive mutexes ถูกสร้างโดยใช้ xSemaphoreCreateMutex() and xSemaphoreCreateMutexStatic(). A non-recursive mutex สามารถถูก 'เอา(taken)' ได้โดย a task เพียงครั้งเดียว. ความพยายามใดๆโดย a task เพื่อเอา a non-recursive mutex ที่มันถูกยึดแล้วจะล้มเหลว - และ the mutex จะถูกให้กลับในครั้งแรกที่ the task 'ให้'  the mutex.

ตรงกันข้ามกับ non-recursive mutexes, a task สามารถ 'take' a recursive mutex ได้หลายครั้ง, และ the recursive mutex จะถูกส่งคืนกลับเฉพาะหลังจาก the holding task  'given(ให้)' the mutex ในจำนวนครั้งเท่ากันที่มัน 'took(เอา)' the mutex.

8
ARM Processors / Re: FreeRTOS API Semaphore / Mutexes
« on: January 13, 2022, 10:38:19 am »
https://www.freertos.org/xSemaphoreCreateRecursiveMutex.html

xSemaphoreCreateRecursiveMutex
[Semaphores]

semphr. h

SemaphoreHandle_t xSemaphoreCreateRecursiveMutex( void )

สร้าง a recursive mutex, และส่งคืนกลับ a handle ซึ่ง the mutex สามารถถูกอ้างอิง. Recursive mutexes ไม่สามารถถูกใช้ใน interrupt service routines. configSUPPORT_DYNAMIC_ALLOCATION and configUSE_RECURSIVE_MUTEXES ทั้งคู่ต้องถูกเซ็ตเป็น 1 ใน FreeRTOSConfig.h สำหรับ xSemaphoreCreateRecursiveMutex() นี้มีให้ใช้เป็นประโยชน์. (configSUPPORT_DYNAMIC_ALLOCATION สามารถถูกทิ้งไว้ไม่กำหนดได้อีกด้วย (ซึ่งในกรณีนี้จะมีค่าเริ่มต้นเป็น 1).

แต่ละ recursive mutex ต้องการจำนวนน้อยๆของ RAM ที่ถูกใช้เพื่อเก็บ the recursive mutex's state. ถ้า a mutex ถูกสร้างโดยใช้ xSemaphoreCreateRecursiveMutex() ดังนั้น RAM ที่ต้องการจะถูกจัดสรรโดยอัตโนมัติจาก the FreeRTOS heap. ถ้า a recursive mutex ถูกสร้างโดยใช้ xSemaphoreCreateRecursiveMutexStatic() ดังนั้น the RAM ถูกจัดให้มีโดย the application writer, ซึ่งต้องการ parameter เพิ่มเติม, แต่ยอมให้ the RAM ถูกจัดสรรแบบคงที่ที่เวลา compile. ดู the Static Vs Dynamic allocation page สำหรับข้อมูลเพิ่มเติม.

Recursive mutexes  ถูก 'taken(เอา)' (ได้รับ) โดยใช้ the xSemaphoreTakeRecursive() และถูกให้ (ปลดปล่อย) โดยใช้ the xSemaphoreGiveRecursive() API functions ตามลำดับ. xSemaphoreTake() and xSemaphoreGive() ต้องไม่ถูกใช้.

Pages: [1] 2 3 ... 394