{
char a;
a = 0x80;
printf("%x\n", a>>1);
}
위와 같이 했을 때 a의 결과 값이 어떻게 나올까요?
상식적으로는 당연히 0b1100 0000 결과가 나와야합니다.
하지만 펌웨어에서는 종종 컴파일러가 char를 unsigend char로 기본으로 잡고 있는 경우가 많습니다.
따라서 결과는 컴파일러의 환경 설정에 따라서 0b1100 000도 될수 있고 0b0100 0000도 될 수 있습니다.

Nested Interrupt란 Interrupt가 발생이 되고 그에 대응되는 Interrupt Service Routine(ISR)을 실행중에 해당 Interrupt나 혹은 다른 Interrupt가 발생되는 경우 먼저 발생된 ISR을 다 마치지 않고 새로 발생된 ISR을 처리하는 것을 말합니다.
대부분의 MCU에서는 Nested Interrupt를 고려하실 필요가 없습니다. NEC의 경우 Nested Interrupt가 된다고 얘기를 듣기는 했는데 확인해본바는 없습니다.
일반적으로 많이 쓰는 ATMEGA의 경우 역시 Nested Interrupt가 기본적으로 지원되지 않습니다.
하지만 여기서 나름이 반전이 있습니다. 제가 ATMEGA를 주로 써서 ATMEGA에 대해서만 한정지어 말씀드리자면은 ATEMGA의 경우 ISR 첫 부분에 자동적으로 글로벌 인터럽트를 DISABLE 시켜주는 코드가 삽입되게 됩니다. 그리고 ISR 마치는 시점에서 글로벌 인터럽트를 ENABLE 시켜줍니다.
이를 다시 말하자면 사용자가 ISR 함수 첫 부분에 글로벌 인터럽트를 ENABLE만 시켜준다면 Nested Interrupt를 사용할 수 있는 것입니다.
하지만 Nested Interrupt를 사용하게 되는 경우에는 ISR 간에 데이터 공유문제가 발생되기 때문에 시스템이 매우 복잡해질 요소가 있습니다. 복잡도의 증가는 버그의 증가로 나타나겠죠.
따라서 대부분의 MCU에서는 Nested Interrupt를 설정해서 쓰는 경우를 본적도 없고 들은 적도 별로 없습니다. 심지어 Nested Interrupt에 대해서 인지하지 못하고 계신 개발자 분들도 많습니다.
이처럼 Nested Interrupt는 예전 스승님이셨던 연구소장님 말씀처럼 “그냥 이런게 있다.” 라고 알고 넘어가는 수준이면될 듯한 내용입니다.
최근 덧글