Title Image

Blog Logo

🌱 Interrupt & Interrupt Latency (Độ trễ ngắt)

🌱 Interrupt & Interrupt Latency (Độ trễ ngắt)

    Về Interrupt thì mình đã giới thiệu khá nhiều qua những bài viết trước đây:

    Bài viết này sẽ chia sẻ về các loại Interrupt và khái niệm Interrupt Latency (Độ trễ ngắt).

    👉 Các loại Interrupt

    Ngắt là một tín hiệu được gửi tới Processor, khi có một công việc nào đó đột xuất/khẩn cấp xảy ra và cần thực hiện ngay lập tức. Vì vậy, để phân loại ngắt, chúng ta có thể phân loại theo nguồn gây ra ngắt. Mình chia làm 2 loại chính như sau:

  1. Hardware Interrupt
    Là tín hiệu ngắt mà các bộ ngoại vi gửi đến Processor. Và ngoại vi thì chúng ta có rất nhiều: External Interrupt (từ Pin), UART Interrupt (TX, RX, Error), CAN, SPI, I2C, ... 
    Khi Hardware Interrupt xảy ra, chương trình sẽ nhảy vào Interrupt Service Routine - ISR do người dùng lập trình.
  2. Software Interrupt
    Là một Instruction (Câu lệnh) mà chương trình gửi đến Processor. Câu lệnh này có thể là cố ý hoặc vô tình gây ra ngắt, nên mình chia làm 2 loại nhỏ hơn:
    1. Instruction Set - Loại sử dụng lệnh để cố tình nhảy vào ngắt. Chẳng hạn, call để Reset_Handler để thực hiện Soft-Reset Vi điều khiển. Hoặc call SVC_Handler để thực hiện Context Switch trong RTOS.
    2. Exception/Trap - Loại này thì chỉ là vô tình thôi 😂 Nhưng nó rất nguy hiểm với chương trình!! Chẳng hạn, truy cập vào vùng nhớ không được cho phép dẫn đến Hard_Fault/Mem_Fault.

    👉 So sánh 2 loại: 

    💬 Giống nhau: 

  • Đều là Interrupt 😆

    💬 Khác nhau:

  • Thời điểm xảy ra - Hardware Interrupt thì thuộc loại Asynchronus, tức là nó có thể xảy ra bất cứ lúc nào trong chương trình (Ví dụ sau khi setup External Interrupt thì chúng ta không thể đoán được khi nào User bấm nút!!). Trong khi Software Interrupt thì phụ thuộc vào chương trình, và nếu thiết kế chương trình tốt thì chúng ta có thể chủ động được khi nào nó xảy ra.
  • Số lượng - Harware Interrupt giới hạn bởi số line ngắt do nhà sản xuất cung cấp. Trong khi có đến hàng trăm/nghìn Software Interrupt khác nhau tùy vào người lập trình.

    👉 Khái niệm Interrupt Latency - Độ trễ Ngắt

    Nói đến Hardware Interrupt, thì Hardware đã tối ưu hóa thời gian, và khi một cờ ngắt dựng lên, Processor sẽ đưa chương trình nhảy đến ISR nếu nó là ưu tiên cao nhất. Nhìn chung độ trễ là rất thấp và việc đồng bộ đã có Hardware giúp chúng ta. 

    Vì vậy khái niệm Interurpt Latency - Độ trễ ngắt chủ yếu áp dụng với Software Interrupt.

    💬 Interrupt Latency đề cập đến khoảng thời gian từ lúc Interrupt đến, cho đến khi Interrupt đó bắt đầu thực hiện. 

    Đối với các ứng dụng thông thường không yêu cầu chặt chẽ về mặt thời gian, Interrupt Latency hầu như không được chú ý nhiều. Tuy nhiên đối với các ứng dụng yêu cầu thời gian thực (RTOS), thì việc phục vụ ISR của ngắt trong 1 thời gian cụ thể là rất quan trọng. 

Interrupt

    Mình tìm hiểu được một số trường hợp liên quan đến Interrupt Latency dưới đây:

  1. Operating system (OS) Interrupt Latency
    Khi truy cập một số dữ liệu quan trọng, OS cần Disable các ngắt. Thời gian tối đa Disable các ngắt gọi là OS Interrupt Latency. OS làm điều này không thường xuyên, nhưng đôi khi nó cũng có thể gây một số vấn đề: ví dụ như không phát hiện được Interrupt từ các Tasks.
  2. Low-level interrupt-related operations
    Cái này thì giống như chương trình thông thường của chúng ta thôi. Nhưng điều cần quan tâm là khi số lượng ngắt nhiều lên, có thể xảy ra trường hợp Nested Interrupt (Các ngắt lồng nhau). 

    Interrupt

    Khi đó một số ngắt có thể có Latency lớn do có ưu tiên thấp hơn. Hoặc nhiều ngắt lồng nhau, quá trình Stacking - Unstacking có thể dẫn đến mất thiều thời gian và ảnh hưởng đến hiệu suất chương trình.
  3. Enabling the ISR to interact with the RTOS
    Một ISR có thể tương tác với RTOS thông qua các system call (chẳng hạn Semaphore Post). Cần đảm bảo ISR sẽ được hoàn tất trước khi có bất kỳ Context Switch nào xảy ra (vì Context Switch sử dụng  SVC_Handler có độ ưu tiên thường cao hơn các Interrupt. 
    Để giải quyết thì cần vô hiệu hóa mức độ ưu tiên trước khi call đến ISR (Chẳng hạn để SVC là mức ưu tiên thấp nhất). 
  4. Context switching
    Phần này mình nói khá rõ trong bài viết rồi nên mọi người click vào xem nhé 😁

    Trên đây là một số nội dung về Interrupt và Interrupt Latency để các bạn có thể biết đến và tiếp cận khái niệm này. Ở bài viết sau, mình sẽ cùng các bạn tìm hiểu về các đo đạc Interrupt Latency này thực tế diễn ra như thế nào?!

    Chúc các bạn học tốt 😊

Measure Interrupt Latency

Đăng nhận xét

0 Nhận xét