FreeRTOS

Started by tha, October 08, 2021, 08:24:01 AM

Previous topic - Next topic

tha

The event semaphore task

The event semaphore task ใช้ the FreeRTOS xSemaphoreTake() API function เพื่อรอสำหรับ the semaphore ที่ถูกให้โดย the RTOS tick hook function. The task เพิ่ม the ulCountOfReceivedSemaphores variable แต่ละครั้งที่ the semaphore ถูกรับ. ตามที่ the semaphore ถูกให้ทุกๆ 500ms (ทึกทักเอาว่า a tick frequency ที่ 1KHz), ค่าของ ulCountOfReceivedSemaphores จะเพิ่มขึ้น 2 ในแต่ละวินาที.

NOTE: A semaphore ถูกใช้สำหรับวัตถุประสงค์เป็นตัวอย่าง. ใน a real application มันควรใช้ a direct to task notification ดีกว่า, ซึ่งจะเร็วกว่าและใช้ RAM น้อยลง.

tha

The idle hook (or callback) function

The idle hook function สอบถามจำนวนของ FreeRTOS heap space ที่เป็นอิสระพร้อมใช้งาน. ดู vApplicationIdleHook() ใน the code.

The malloc failed and stack overflow hook (or callback) functions

สอง hook functions นี้ถูกจัดให้มีเป็นตัวอย่าง, แต่ไม่ได้บรรจุฟังชันใดๆ.

Source Code

ค้นหาสำหรับ TODO ใน the source files เพื่อวางในที่ๆการแก้ไขอาจถูกต้องการ.
(ตัวอย่างโค้ดดูในลิ้งค์เอานะครับ)
https://www.freertos.org/Hardware-independent-RTOS-example.html

tha

https://www.freertos.org/porting-a-freertos-demo-to-different-hardware.html

Modifying a FreeRTOS Demo
เพื่อใช้ compiler อื่นหรือรันบน hardware อื่น

เพจนี้เกี่ยวกับอะไร

[โปรดดู "Creating a new FreeRTOS project"]

FreeRTOS ได้รวม demo applications จำนวนมากไว้แล้ว - แต่ละตัวมีเป้าหมายที่:

     1. A specific microcontroller.
     2. A specific development tool (compiler, debugger, etc.).
     3. A specific hardware platform (prototyping or evaluation board).

เหล่านี้ถูกทำเป็นเอกสารภายใต้ 'Supported Devices' ในกรอบเมนูทางด้านซ้าย.

ขออภัย เป็นไปไม่ได้ที่จะจัดให้มี a demo project สำหรับทุกชุดของ microcontroller, compiler and evaluation board - ดังนั้นอาจเป็นไปได้ว่า a demo application ไม่มีที่ตรงกันกับการเซ็ตอัฟที่ต้องการของคุณจริงๆ. หน้านี้จัดทำเอกสารวิธีที่ demo applications ที่มีอยู่สามารถถูกแก้ไขหรือถูกรวมเพื่อให้ตรงดีขึ้นกับ the setup ที่คุณต้องการ.

โดยทั่วไปเป็นงานง่ายที่เอา an existing demo สำหรับ evaluation board หนึ่งและแก้ไขมันไปรันบนอีกบอร์ดหนึ่ง - และซับซ้อนกว่าเล็กน้อยเท่านั้นในการเอา a demo สำหรับ compiler หนึ่งและแก้ไขมันไปใช้กับอีก compiler หนึ่ง. หน้านี้จัดให้มีคำแนะนำเกี่ยวกับเหล่านี้และ porting type activities ที่คล้ายกัน. มันไม่ง่ายนัก อย่างไรก็ตาม ในการใช้ a FreeRTOS port และแปลงมันเพื่อรันบน processor core architecture ที่แตกต่างจากเดิมโดยสิ้นเชิง, และยังไม่ได้ถูกรองรับ.  หน้านี้จึงไม่ครอบคุมหัวข้อของการสร้าง RTOS ports ใหม่อย่างสมบูรณ์, นอกจากนี้ยังมีหน้าแยกต่างหากซึ่งให้คำแนะนำเกี่ยวกับวิธีที่การพัฒนาดังกล่าวถูกเข้าใกล้.


tha

Converting a Demo to Use a Different Evaluation Board

subsection นี้ทำเอกสารขั้นตอนที่จำเป็นเพื่อแปลง an existing demo application จาก prototyping board หนึ่งไปยังอีกบอร์ดหนึ่ง, โดยไม่มีการเปลี่ยนอย่างใดอย่างหนึ่ง the microcontroller หรือ compiler ที่ใช้. ดังตัวอย่าง, คำแนะนำเหล่านี้จะถูกใช้เพื่อแปลง the IAR SAM7S demo เป้าหมายที่ the SAM7S-EK hardware เพื่อแทนด้วยเป้าหมาย the Olimex SAM7-P64 prototyping board.

ตรวจสอบให้แน่ใจว่าแต่ละขั้นตอนเสร็จสมบูรณ์ก่อนที่จะย้ายไปขั้นตอนถัดไป:

     1. Initial compilation:

        An existing demo application ควรถูกใช้เป็น a starting point สำหรับ the conversion exercise, ดังนั้นก่อนอื่นเช็คว่าคุณสามารถคอมไพล์ the existing
        demo application ได้สำเร็จจริงๆตามที่ดาวน์โหลด - ก่อนทำการแก้ไขใดๆ. ในกรณีส่วนใหญ่ the demo application ควรคอมไพล์โดยไม่มี errors หรือ
        warnings ใดๆ.

        เว็บไซ้ท์นี้บรรจุ a documentation page for each demo application รวมอยู่ใน the FreeRTOS download. โปรดแน่ใจว่าได้อ่านสิ่งนี้อย่างครบถ้วน Build
        instructions ถูกรวมอยู่ด้วย.

     2. Modifying the LED IO:

        LEDs จัดให้มีวิธีที่ง่ายที่สุดของการได้รับการป้อนกลับที่มองเห็นว่า the demo application กำลังรันอยู่, ดังนั้นจึงเป็นประโยชน์ที่จะทำให้ LED บนแพลตฟอร์ม
        ฮาร์ดแวร์ใหม่ทำงานได้โดยเร็วที่สุด

        ไม่น่าเป็นไปได้ที่ the hardware platform ที่ the demo ที่ถูกพอร์ทมี LEDs บน IO ports เดียวกันกับ the hardware platform ที่ the demo ถูกพัฒนา
        แล้ว - ดังนั้นแก้ไขเล็กน้อยบางอย่างถูกต้องการ.

        The function vParTestInitialise() ภายใน partest.c บรรจุ the IO port mode and direction configuration. The function prvSetupHardware()
        ภายใน main.c บรรจุ more generic hardware configuration (ตัวอย่างเช่น, เปิดการใช้งาน the clock ไปยัง the IO peripheral) และอาจต้องการการ
        แก้ไขบางอย่างอีกด้วย, ขึ้นอยู่กับ the port ที่ถูกใช้.

        ทำการเปลี่ยนแปลงที่จำเป็นกับฟังก์ชันทั้งสองที่ไฮไลต์ในย่อหน้าด้านบน จากนั้นเขียนโปรแกรมง่ายๆ เพื่อตรวจสอบว่าเอาต์พุต LED ทำงานหรือไม่ โปรแกรมง่ายๆ นี้ไม่
        จำเป็นต้องใช้ FreeRTOS - สิ่งที่น่าสนใจทั้งหมดในขั้นตอนนี้คือการทำให้แน่ใจว่าไฟ LED ทำงาน - ดังนั้นสำหรับตอนนี้เอาออก the existing main() function
        และแทนมันด้วยบางสิ่งที่คล้ายกับตัวอย่างต่อไปนี้:


tha

    3. Introducing the RTOS scheduler:

        เมื่อ the LEDs ถูกทราบว่ากำลังทำงาน the dummy main() function สามารถถูกเอาออก, และ the original main() function เอากลับคืน.

        ขอแนะนำให้เริ่มต้นด้วย the simplest multitasking application เท่าที่เป็นได้. The standard 'flash test' tasks มักจะถูกใช้ตอนเริ่มต้นเป็น a
        multitasking เทียบได้กับ a 'hello world' type application.

        The standard 'flash test' tasks คือชุดของ 3 very simple tasks - แต่ละ task จะสลับ a single LED ที่ความถี่คงที่, ด้วยแต่ละ task จะใช้ a different
        frequency. tasks เหล่านี้ถูกรวมใน the demo applications เกือบทั้งหมด, และถูกสตาร์ทภายใน main() โดยการเรียกไปยัง the function
        vStartLEDFlashTasks() (หรือ vStartFlashCoRoutines() หาก the co-routine version ถูกใช้แทน). ถ้า the main() function of the demo ที่คุณ
        กำลังใช้ไม่เรียก vStartLEDFlashTasks() (หืออีกทางหนึ่ง vStartFlashCoRoutines()) ดังนั้นเพิ่มอย่างง่ายๆ the file
        FreeRTOS/Demo/Common/Minimal/Flash.c ไปยัง your build และเพิ่มการเรียกถึง vStartLEDFlashTasks() แบบแมนน้วล.

        เอาออกทุกๆ function ที่ถูกใช้ตอนเริ่มต้นหนึ่งหรือมากว่า demo tasks, นอกเหนือจากการเรียกไปยัง vStartLEDFlashTasks(). มีแนวโน้มว่า main() จะเรียกใช้
        ฟังก์ชันสามฟังก์ชันเท่านั้น:  prvSetupHardware(), vStartLEDFlashTasks(), and vTaskStartScheduler(). For example (ตาม the typical main() 
        ที่แนะนำก่อนหน้านี้):



        แอปพลิเคชั่นที่เรียบง่ายมากนี้ทำงานอย่างถูกต้องหากไฟ LED 0 ถึง 2 (รวม) อยู่ภายใต้การควบคุมของ the 'flash' tasks และแต่ละรายการมีการสลับที่ความถี่คงที่
        แต่ต่างกัน

tha

     4. Finishing off:

         เมื่อ the simple flash demo ถูกปฏิบัติคุณสามารถกู้คืน the full demo application ที่มี the demo tasks ทั้งหมดถูกสร้าง, หรืออีกทางหนึ่ง, เริ่มต้นสร้าง
         your own application tasks.

         ข้อควรจำ:

              •  ถ้า the demo application แต่เดิมไม่มีการเรียกไปยัง vTaskCreateFlashTasks(), และการเรียกไปยังฟังชั่นนี้ถูกเพิ่มแล้วแบบ manually, ดังนั้นการ
                  เรียกควรถูกเอาออกอีกครั้ง. ด้วยเหตุผลสองประการ อย่างแรก the flash tasks อาจใช้ LED outputs ที่ถูกใช้ที่อื่นแล้วภายใน the demo, และอย่างที่สอง
                  the full demo อาจใช้ the available RAM ทั้งหมดแล้ว, หมายความว่าไม่มีที่ว่างสำหรับ tasks เพิ่มเติมถูกสร้าง.

              •  The standard 'com test' tasks (ถ้าถูกรวมใน the demo) จะใช้ประโยชน์ the microcontrollers UART peripherals ตัวหนึ่ง. ตรวจสอบว่า the
                  UART ที่ใช้ใช้ได้สำหรับ the hardware ที่ซึ่งคุณได้พอร์ท the demo.

              •  ไม่น่าเป็นไปได้ที่ peripherals อย่างเช่น LCDs จะทำงานโดยไม่มีการปรับเปลี่ยน เพื่อพิจารณาสำหรับความแตกต่าง hardware หรือ interface ใดๆ.

tha

Combining or Modifying Existing Demo Projects

ส่วนย่อยนี้เน้นรายละเอียดที่ต้องการพิจารณาเพื่ออย่างใดอย่างหนึ่ง ปรับเปลี่ยนโครงการที่มีอยู่ หรือรวมโครงการที่มีอยู่สองโครงการ, ทั้งคู่มีเป้าหมายของการสร้าง a project เฉพาะเจาะจงตามความต้องการของคุณ. ตัวอย่างเช่น, คุณอาจอยากจะสร้าง an STR9 demo project ที่ใช้ the GCC compiler. ในขณะที่ the FreeRTOS download อาจไม่ (ในขณะนั้นหรือการเขียน) รวม a GCC STR9 demo, มันรวม an IAR STR9 demo, และ a GCC STR75x demo.  ข้อมูลที่จำเป็นในการสร้าง the STR9 GCC project สามารถถูกรวบรวมได้จากทั้งสอง existing project. มีสองวิธีนี้สามารถถูกทำ:

     1. เอา an existing demo project ที่ใช้ the correct compiler แต่กำหนดเป้าหมายเป็น microcontroller อื่น, และกำหนดเป้าหมายใหม่นี้ไปยัง
         microcontroller ที่ต้องการ.
     2. สร้าง a new project โดยใช้ compiler ที่คุณเลือก. เมื่อตัวเลือกนี้ถูกเอา an existing demo project สามารถถูกใช้เป็นแนวทางที่ files และการเซ็ตถูก
         ต้องการ, ถึงแม้ว่า the existing project จะใช้ compiler ที่ต่างกัน.

tha

หมายเหตุต่อไปนี้เน้นข้อมูลที่ต้องการการพิจารณาว่าวิธีใดถูกใช้:

     •  การระบุ the FreeRTOS kernel files ที่เฉพาะเจาะจงไปยัง the microcontroller ที่กำลังถูกใช้ :

         The FreeRTOS source code organization page จัดให้มีข้อมูลทั้งหมดที่ถูกต้องการเพื่อเข้าใจ the FreeRTOS directory structure.

         ส่วนใหญ่ (ถ้าไม่ใช่ทั้งหมด) the code ที่เฉพาะเจาะจงไปยัง a single port ถูกบรรจุใน a file ที่เรียกว่า
         FreeRTOS/source/portable/[compiler]/[microcontroller]/port.c และ an accompanying header file ที่เรียกว่า
         FreeRTOS/source/portable/[compiler]/[microcontroller]/portmacro.h, โดยที่ [compiler] คือชื่อของคอมไพเลอร์ที่กำลังถูกใช้งาน และ
         [microcontroller] คือชื่อตระกูลไมโครคอนโทรลเลอร์ที่กำลังถูกใช้

         สำหรับคอมไพเลอร์บางตัว the port.c and portmacro.h files คือทั้งหมดที่ถูกต้องการ. สำหรับตัวอื่น ๆ (เหล่านั้นที่มีคุณสมบัติที่ยืดหยุ่นน้อยกว่า) an
         assembler file ถูกต้องการด้วย. นี้จะถูกเรียกว่า portasm.s or portasm.asm.

         สุดท้าย, และเฉพาะเจาะจงไปยัง ARM7 GCC ports เท่านั้น, จะมี a file ที่เรียกว่า portISR.c. portISR.c ถูกใช้อีกด้วยเพือแยกออกจาก port.c ที่ code ซึ่ง
         ต้องถูกคอมไพล์เป็น ARM mode เสมอ - the code ที่ยังคงอยู่ใน port.c ดังนั้นสามารถถูกคอมไพล์เป็นอย่างใดอย่างหนึ่ง ARM หรือ THUMB mode.