RT-thread เบื้องต้น

Introduction

    ประสิทธิภาพแบบเรียลไทม์ของระบบหมายถึงการตอบสนองที่ถูกต้องต่อเหตุการณ์ภายนอกในระยะเวลาที่แน่นอน ในระหว่าง "เวลา" นี้ ระบบจะประมวลผลบางอย่าง เช่น การวิเคราะห์ข้อมูลป้อนเข้า การคำนวณ การประมวลผล และอื่นๆ และนอกเวลานี้ ระบบอาจไม่ได้ใช้งานและทำงานสำรอง ยกตัวอย่างเทอร์มินัลมือถือ: เมื่อโทรศัพท์โทรเข้า ระบบควรจะดังขึ้นในเวลาที่เหมาะสมเพื่อแจ้งให้โฮสต์ของการโทรและถามว่าจะรับสายหรือไม่และเมื่อโทรศัพท์ไม่ได้โทรเข้าผู้คนสามารถใช้เพื่อ ทำงานอย่างอื่น เช่น ฟังเพลง เล่นเกม เป็นต้น

RT-thread Architecture

Source: https://www.rt-thread.io/document/site/tutorial/quick-start/introduction/introduction/
ในกรณีนี้ แนวคิดของ IoT OS ได้ถูกยกขึ้น IoT OS หมายถึงแพลตฟอร์มซอฟต์แวร์ที่อิงตามเคอร์เนลของระบบปฏิบัติการ (เช่น RTOS, Linux เป็นต้น) และรวมถึงส่วนประกอบมิดเดิลแวร์ที่ค่อนข้างสมบูรณ์ เช่น ระบบไฟล์ ไลบรารีกราฟิก เป็นต้น มีการบริโภคต่ำและมีปริมาณสูง ความปลอดภัย ปฏิบัติตาม Communication Protocol และมีความสามารถในการเชื่อมต่อบนคลาวด์ RT-Thread เป็นระบบปฏิบัติการ IoT

RT-thread Kernal

source: https://www.rt-thread.io/document/site/tutorial/quick-start/introduction/introduction/


  • Object management
  • Real-time scheduler
  • thread management
  • Inter-thread communication
    • Mailbox
    • Message queue
    • signal
  • Inter-thread Synchronization
    • Semaphore
    • Muxtex
    • Event
  • Clock management
  • Memory management
    • Memory heap
    • Memory Pool
  • Device management   

thread control block

source: https://www.rt-thread.io/document/site/tutorial/quick-start/introduction/introduction/

แผนภาพสถาปัตยกรรมหลักของ RT-Thread เคอร์เนลอยู่ด้านบนของเลเยอร์ฮาร์ดแวร์ เคอร์เนลประกอบด้วยไลบรารีเคอร์เนลและการใช้งานเคอร์เนลแบบเรียลไทม์ ไลบรารีเคอร์เนลเป็นชุดย่อยของการนำฟังก์ชันที่คล้ายกับไลบรารี C ไปใช้ชุดเล็กเพื่อให้แน่ใจว่าเคอร์เนลสามารถทำงานได้อย่างอิสระ ไลบรารี C ในตัวจะแตกต่างกันบ้างขึ้นอยู่กับคอมไพเลอร์ เมื่อใช้คอมไพเลอร์ GNU GCC จะมีการใช้งานไลบรารี C มาตรฐานมากขึ้น การใช้งานเคอร์เนลแบบเรียลไทม์รวมถึงการจัดการอ็อบเจ็กต์ การจัดการเธรดและตัวกำหนดเวลา การจัดการการสื่อสารระหว่างเธรด การจัดการนาฬิกา การจัดการหน่วยความจำ ฯลฯ อาชีพทรัพยากรขั้นต่ำของเคอร์เนลคือ 3KB ROM, 1.2KB RAM

switching thread state

source: https://www.rt-thread.io/document/site/tutorial/quick-start/introduction/introduction/

เธรดเข้าสู่สถานะเริ่มต้น (RT_THREAD_INIT) โดยการเรียกใช้ฟังก์ชัน rt_thread_crate/init(); เธรดในสถานะเริ่มต้นเข้าสู่สถานะพร้อม (RT_THREAD_READY) โดยการเรียกใช้ฟังก์ชัน rt_thread_startup(); เธรดในสถานะพร้อมถูกกำหนดโดยตัวกำหนดเวลาและเข้าสู่สถานะกำลังทำงาน (RT_THREAD_RUNNING) เมื่อเธรดที่รันเรียกใช้ฟังก์ชันเช่น rt_thread_delay(), rt_sem_take(), rt_mutex_take() หรือ rt_mb_recv() หรือไม่สามารถรับทรัพยากร เธรดจะเข้าสู่สถานะถูกระงับ (RT_THREAD_SUSPEND) หากเธรดในสถานะถูกระงับรอจนกว่าจะหมดเวลาและยังไม่ได้รับทรัพยากร หรือเธรดอื่นๆ ที่ปล่อยทรัพยากร เธรดจะกลับสู่สถานะพร้อม

RT-thread memory distribution

source: https://www.rt-thread.io/document/site/tutorial/quick-start/introduction/introduction/
MCU ทั่วไปมีพื้นที่เก็บข้อมูลที่มีแฟลชบนชิปและ RAM บนชิป RAM เทียบเท่ากับหน่วยความจำ และ Flash เทียบเท่ากับฮาร์ดดิสก์ คอมไพเลอร์แบ่งโปรแกรมออกเป็นหลายส่วน ซึ่งถูกเก็บไว้ในพื้นที่หน่วยความจำต่างๆ ของ MCU  

 Clock Management

RT-Thread timer มีกลไกการจับเวลาสองประเภท: 
1.ประเภทแรกเป็นตัวจับเวลาแบบ one-shot ซึ่งจะทริกเกอร์เหตุการณ์ตัวจับเวลาเพียงครั้งเดียวหลังจากเริ่มต้นแล้วตัวจับเวลาจะหยุดโดยอัตโนมัติ 
2.ตัวจับเวลาทริกเกอร์เป็นระยะ ซึ่งจะทริกเกอร์เหตุการณ์ตัวจับเวลาเป็นระยะๆ จนกว่าผู้ใช้จะหยุดเอง ผู้ใช้ไม่ได้กดหยุด การดำเนินการจะดำเนินการต่อไปเรื่อยๆ

RT-Thread สามารถแบ่งออกเป็นโหมด ก็คือ HARD_TIMER และโหมด SOFT_TIMER
source: https://www.rt-thread.io/document/site/programming-manual/timer/timer/

  • HARD_TIMER: เมื่อเริ่ม function ของ timer timeout ในโหมด HARD_TIMER จะทำงานในบริบท interrupt context และสามารถระบุได้ด้วยพารามิเตอร์ RT_TIMER_FLAG_HARD_TIMER เมื่อเริ่มต้น/สร้างตัวจับ
  • SOFT_TIMER: โหมด SOFT_TIMER สามารถกำหนดค่าได้ และเมื่อเปิดใช้งานโหมดนี้ ระบบจะสร้าง timer thread จากนั้น function timer timeout ของโหมด SOFT_TIMER จะถูกดำเนินการในบริบทของเธรดตัวจับเวลา และสามารถระบุได้โดยใช้พารามิเตอร์ RT_TIMER_FLAG_SOFT_TIMER เมื่อเริ่มต้น/สร้างตัวจับเวลา

Inter-thread Synchronization

source:https://www.rt-thread.io/document/site/programming-manual/ipc1/ipc1/
    ในระบบเรียลไทม์แบบมัลติเธรด หลายครั้งที่งานสำเร็จได้ผ่านการทำงายของเธรดหลาย ๆ Thread ดังนั้น Thread หลาย Thread เหล่านี้ทำงานร่วมกันเพื่อทำงานโดยไม่มีข้อผิดพลาด จึงทำให้เกิด critical section มีหลายวิธีในการ  enter/exit the critical section
  1. Call rt_hw_interrupt_disable() เข้าสู่ critical section และ rt_hw_interrupt_enable() ในการ exit the critical section
  2. Call rt_enter_critical()  เข้าสู่ critical section และ rt_exit_critical() ในการ exit the critical section
ในการทำ threadsynchronization จะใช้

Semaphores  

แต่ละ semaphore object มีค่า semaphore และเธรดที่รอคิว Semaphore value สอดคล้องกับจำนวนอินสแตนซ์ที่แท้จริงของ semaphore object และจำนวน number of resources หากค่าสัญญาณเป็น 5 แสดงว่ามี semaphore instances(resources) 5 รายการที่ใช้ได้ ถ้าจำนวน semaphore instances เป็นศูนย์ เธรดที่ใช้สำหรับสัญญาณจะถูกระงับในคิวรอของสัญญาณ โดยรอ semaphore instances ที่พร้อมใช้งาน
Schematic diagram of semaphore
source: https://www.rt-thread.io/document/site/programming-manual/ipc1/ipc1/
    Semaphore Control Block เป็นโครงสร้างข้อมูลที่ใช้โดยระบบปฏิบัติการเพื่อจัดการสัญญาณ ซึ่งแสดงโดย struct rt rt_semaphore และ rt_sem_t แสดงถึงหมายเลขอ้างอิงของสัญญาณ และการใช้งานในภาษา C เป็นตัวชี้ไปยัง semaphore control block

mutex

    ความแตกต่างระหว่าง mutex และ semaphore คือ เธรดที่มี mutex มีความเป็นเจ้าของ mutex นั้น mutex รองรับการเข้าถึงแบบ recursive access และป้องกันthread priority ของเธรดจากการr eversing และ mutex สามารถปล่อยได้โดยเธรดที่ถือไว้เท่านั้น ในขณะที่ semaphore สามารถปล่อยโดยเธรดใดก็ได้
Schematic diagram of mutex
source: https://www.rt-thread.io/document/site/programming-manual/ipc1/ipc1/#mutex-working-mechanism

    mutex control block เป็นโครงสร้างข้อมูลที่ระบบปฏิบัติการใช้เพื่อจัดการ mutexes ซึ่งแสดงโดย struct rt rt_mutex และ rt_mutex_t แสดงถึงหมายเลขอ้างอิงของ mutex

Event Set

    จะคล้ายกับ Event Grop ใน FreeRTOS
  • Event ใช้สำหรับการ synchronization เท่านั้นและไม่มี transfer functionality
  • Event  เกี่ยวข้องกับเธรดเท่านั้น และ Event ต่าง ๆ เป็นอิสระจากกัน แต่ละเธรดสามารถมี 32 event และ recorded with a 32-bit unsigned integer
  • Events ไม่มีการเข้า queue
  • ใช้ logical AND และ logical OR ในการตรวจสอบหรือสร้าง event
source: https://www.rt-thread.io/document/site/programming-manual/ipc1/ipc1/#event


source: https://www.rt-thread.io/document/site/programming-manual/ipc1/ipc1/#event
    event set control block คือโครงสร้างข้อมูลที่ระบบปฏิบัติการใช้เพื่อจัดการเหตุการณ์ ซึ่งแสดงโดยโครงสร้าง rt_event และ  rt_event_t แสดงถึงหมายเลขอ้างอิงของ event set

Inter-thread Communication

    ในการเขียน bare-metal programming ตัวแปร global variables มักใช้สำหรับการสื่อสารระหว่างฟังก์ชันต่างๆ ตัวอย่างเช่น บางฟังก์ชันอาจเปลี่ยนค่าของ global variables เนื่องจากการดำเนินการบางอย่าง ฟังก์ชันอื่นอ่าน global variables และจะดำเนินการที่เกี่ยวข้องเพื่อให้เกิดการสื่อสารและการทำงานร่วมกันตามค่าตัวแปรส่วนกลางที่อ่าน

Mailbox

source: https://www.rt-thread.io/document/site/programming-manual/ipc2/ipc2/#mailbox
    ใช้สำหรับการสื่อสารระหว่างเธรด ซึ่งมีลักษณะพิเศษคือโอเวอร์เฮดที่ต่ำและประสิทธิภาพสูง แต่ละข้อความในเมลบ็อกซ์สามารถเก็บได้  4 bytes
    Mailbox Control Block ใน RT-Thread Mailbox Control เป็นโครงสร้างข้อมูลที่ใช้โดยระบบปฏิบัติการเพื่อจัดการกล่องจดหมาย แสดงโดยโครงสร้าง rt_mailbox และ rt_mailbox_t แสดงถึงหมายเลขอ้างอิงของกล่องจดหมาย

Message Queue

    Message Queuing เป็นอีกวิธีหนึ่งในการสื่อสารระหว่างเธรดที่ใช้กันทั่วไป ซึ่งเป็นส่วนขยายของ mailbox ใช้งานได้หลากหลายโอกาส เช่น การแลกเปลี่ยนข้อความระหว่างเธรด
source: https://www.rt-thread.io/document/site/programming-manual/ipc2/ipc2/#message-queue
  • หนึ่งเธรดขึ้นไปสามารถรับข้อความจาก message queueได้
  • เป็นไปตามหลักการเข้าก่อนออกก่อน (FIFO) Message Queue Control Block ใน RT-Thread บล็อกควบคุมคิวข้อความเป็นโครงสร้างข้อมูลที่ใช้โดยระบบปฏิบัติการเพื่อจัดการคิวข้อความ ซึ่งแสดงโดยโครงสร้าง struct rt_messagequeue และ  rt_mq_t แสดงถึงหมายเลขอ้างอิงของคิวข้อความ
source: https://www.rt-thread.io/document/site/programming-manual/ipc2/ipc2/#message-queue
    message queue control block เป็นโครงสร้างที่มีพารามิเตอร์สำคัญที่เกี่ยวข้องกับ message queue และมีบทบาทสำคัญในการนำฟังก์ชันของ message queueไปใช้ interfaces ที่เกี่ยวข้องของ message queue แสดงในรูป การดำเนินการกับคิวข้อความประกอบด้วย: create a message queue - send a message - receive a message - delete a message queue.

Signal

source: https://www.rt-thread.io/document/site/programming-manual/ipc2/ipc2/#signal

    คือการจำลองกลไกการขัดจังหวะ เมื่อพูดถึงหลักการ เธรดที่รับสัญญาณจะคล้ายกับ processor ที่ได้รับคำขอ interrupt และ signal ใช้สำหรับการสื่อสารแบบ asynchronous ใน RT-Thread และถูกใช้ในการแจ้งเตือน Thread ว่าเกิดการ asynchronous ได้เกิดขึ้นหรือไม่
    การทำงานของสัญญาณ ได้แก่ install signal, block signal, unblock signal, send signal, และรอ signal interfaces ของสัญญาณแสดงในรูปต่อไปนี้

source: https://www.rt-thread.io/document/site/programming-manual/ipc2/ipc2/#signal

RT-Thread API

source: https://www.rt-thread.io/document/site/tutorial/quick-start/introduction/introduction/

thread create

thread delay



Suspend  and resume thread


Control thread


Conclusion

    RT-thread ถือเป็น Platform IoT ที่มีส่วนประกอบระดับกลางที่สมบูรณ์เเละระบบนิเวศของ Hardware เเละ Software ที่ยอมเยี่ยม โดยมีองค์ประกอบพื้นฐานที่สำคัญเกือบทั้งหมดที่จำเป็นสำหรับอุปกรณ์ IoT เช่น โปรโตคอลเครือข่าย ระบบไฟล์ การจัดการพลังงานต่ำ เป็นต้น รองรับเครื่องมือรวบรวมกระแสหลักทั้งหมดเช่น GCC, Keil, IAR ฯลฯ และอินเทอร์เฟซมาตรฐานที่หลากหลาย เช่น POSIX, CMSIS, สภาพแวดล้อมแอปพลิเคชัน C++, Micropython และ Javascript ง่ายสำหรับนักพัฒนาในการพอร์ตแอปพลิเคชันที่หลากหลาย . RT-Thread ยังให้การสนับสนุนเชิงพาณิชย์ที่ดีเยี่ยมสำหรับสถาปัตยกรรม CPU หลักทั้งหมด เช่น ARM Cortex-M/R/A, RISC-V, MIPS, X86, Xtensa เป็นต้น








ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

FreeRTOS Ping Pong Game (ESP32)