본문 바로가기
임베디드 개발/TMS320F2838x (C28x)

TMS320F2838x ] PIE Channel Table / Interrupt / volatile / atomic

by eteo 2022. 9. 7.

 

TI 의 PIE 채널 table

 

 

행이 그룹이고 열이 채널이며 숫자가 낮을수록 더 높은 우선순위를 갖는다. 즉 여러 인터럽트가 펜딩 상태일 때 낮은 숫자 그룹의 낮은 채널 인터럽트가 먼저 실행된다.

 

테크니컬 레퍼런스 매뉴얼 153-158 페이지 더 자세한 내용을 확인할 수 있다.

 

https://www.ti.com/lit/ug/spruii0d/spruii0d.pdf?ts=1662539879473

 

 

다음은 Interrupt 전파에 대한 시퀀스 다이어그램이다.

 

CPU는 결국 한 순간에 하나의 인터럽트만 처리할 수 있으며 global interrupt mask 비트인 INTM이 cleared인 상태여야 CPU에게 인터럽트가 전파되어 PIE Vector 테이블에 등록된 인터럽트 서비스 루틴 함수가 실행된다.

 

참고로 INTM 비트는 컴파일러 내장함수인 __disable_interrupts(), __enable_interrupts()를 통해 비활성화, 활성화를 할 수 있다.

 

 

 

 

인터럽트 사용 시 또 하나 고려할 점은 volatile 키워드이다.

 

아래와 같이 main과 하나 이상의 ISR에서 동일한 전역 변수를 읽고 쓰는 경우 반드시 변수에 volatile 키워드를 붙여야 한다. 

 

volatile 키워드는 컴파일러에게 해당 변수가 코드의 흐름 외부(ISR)에서 수정될 수 있음을 전달하며, 불필요한 컴파일러 최적화를 방지하여 코드에 쓰여진 변수의 읽기/쓰기 동작을 그대로 유지하도록 보장한다.

 

volatile int flag;
int x;

interrupt void ISR(void)
{
    ...
    flag = 1;
    ...
}

int main()
{
    flag = 0;
    ...

    if (flag == 1)
        x++;

    ...
}

 

 

한편 main과 ISR에 같은 전역 변수를 읽고 쓴다면 해당 동작은 원자적일까?

 

C28x 코어는 32-bit ALU와 연산 레지스터(XAR, ACC 등)을 가지고 있으므로 단일 명령어로 16-bit 변수와 32-bit 부동소수점 및 정수형 변수를 읽고 쓸 수 있다. 

 

다만 64-bit 변수에 대한 읽기/쓰기는 원자성이 보장되지 않을 수 있으며, 만약 main에서 다중 명령을 실행하는 동안 ISR에서 해당 변수가 업데이트 되는 것이 걱정된다면 원자 연산 직전과 직후에 인터럽트를 비활성화, 활성화할수 있다.

 

관련 내용을 아래 링크에서 찾아볼 수 있다.

 

 

https://software-dl.ti.com/C2000/docs/optimization_guide/phase1/misc.html#interrupts

 

2.4.9. Other considerations — C2000™ C28x Optimization Guide

RPT instructions are not interruptible, and can potentially delay or block interrupts from executing * For example, if there is a memcpy() instruction in a background function, and the compiler generates RPT instructions for this function, that section of

software-dl.ti.com

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1172284/tms320f280049c-atomic-read-of-32-bit-int

 

TMS320F280049C: Atomic read of 32 bit int? - C2000 microcontrollers forum - C2000™︎ microcontrollers - TI E2E support forum

 

e2e.ti.com