프로그래밍에서 메모리에 접근하는 명령어로, Peek은 특정 메모리 주소에 저장된 바이트 내용을 취하는 명령어이고, Poke는 특정 메모리 주소에 저장된 바이트 내용을 바꾸는 명령어이다.
int peek(char *location) {
return *location; }
void poke(char *location, char newval) {
(*location) = newval; }
current_char = mystring;
while (*current_char != '\0') {
poke(OUT_CHAR, *current_char);
while (peek(OUT_STATUS) != 0);
current_char++;
}
ex) mystring = "hello" 인 경우
*current_char = 'h'이고, null이 아니므로 poke()를 통해 OUT_CHAR에 'h' 저장. 여기서 OUT_CHAR은 출력 장치를 의미함. poke() 실행 후 peek()을 통해 출력 장치가 다음 데이터 'e' 를 받을 준비가 될 때까지 "바쁜 대기"
이러한 바쁜 대기 방식은 비효율적이다. 왜냐하면
CPU는 장치가 준비될 때까지 지속적으로 루프를 돌기 때문에 다른 작업을 수행할 수 없다.
여러 장치와의 입출력 작업을 동시에 수행하기 어렵다.
인터럽트란 CPU가 작업을 처리하고 있을 때, 입출력 하드웨어 등의 장치에 예외 상황이 발생하여 처리가 필요한 경우에 이를 CPU에 알려 처리할 수 있도록 하는 것을 말한다.
장치가 CPU의 제어 흐름을 변경할 수 있다.
인터럽트는 장치가 작업을 완료하거나 데이터 처리가 필요할 때 CPU에게 신호를 보내 작업을 중단시키고, 해당 작업을 처리할 수 있는 서브루틴을 호출하게 한다.
CPU는 다른 작업을 수행할 수 있다.
CPU는 바쁜 대기를 하지 않고 다른 작업을 수행하다가, 장치가 준비되면 인터럽트가 발생하여 작업을 처리한다. 이를 통해 CPU 자원의 효율적 사용이 가능하다.

CPU
Device
Interrupt request
Interrupt Acknowledge
Data/Address
인터럽트 발생 시 서브루틴을 호출하여 인터럽트 처리 코드 실행.
인터럽트 발생 시 CPU는 다음 명령어를 강제로 정해진 서브루틴(인터럽트 서비스 루틴, ISR) 로 변경하여 실행.
인터럽트 처리 후 원래 실행 중이던 프로그램으로 돌아갈 수 있도록, 인터럽트가 발생하기 전의 복귀 주소를 저장한다.
Priorities(우선순위):
우선순위는 어떤 인터럽트가 CPU에 의해 먼저 처리되는지를 결정한다. 높은 우선순위를 가진 인터럽트는 CPU에 더 빨리 처리된다.
Vectors:
벡터는 어떤 코드가 각 인터럽트를 처리할지를 결정한다. 각 인터럽트는 고유한 벡터를 가지고 있으며, 이 벡터는 인터럽트 서비스 루틴(ISR)로 연결된다.


Masking(마스킹): 현재 처리 중인 인터럽트보다 우선순위가 낮은 인터럽트를 무시하거나 인식하지 않는 메커니즘. 중요도가 낮은 인터럽트가 중요한 작업을 방해하지 않도록 함.
Non-maskable interrupt(비마스크 인터럽트): 가장 높은 우선순위를 가지며, 마스킹 되지 않는다. 어떠한 상황에서도 무조건 먼저 처리되어야 하는 중요한 인터럽트이다. 다른 인터럽트가 처리 중이더라도 바로 실행된다.


인터럽트 요청: 인터럽트가 발생했다면, 해당 인터럽트를 처리한다.
우선순위 확인: 현재 처리 중인 인터럽트보다 새로 발생한 인터럽트가 더 높은 우선순위를 가지는지 확인한다.
인터럽트 승인: CPU가 인터럽트 처리할 준비가 되었음을 나타냄.
벡터 확인: 벡터가 없다면 타임아웃 및 버스에러.
CPU 동작
Handler responsibility
인터럽트 지연시간은 7 ~ 13 사이클
Fast Return: 빠른 복귀 방식으로, 최소한의 작업으로 원래 프로그램으로 복귀함. 시간이 더 적게 소요되나, 정확하지 않을 수 있음.
Slow Return: 느린 복귀 방식으로, 더 많은 작업을 수행하여 완전한 상태 복구를 보장함.

ATmega2560은 외부 인터럽트 핀을 통해 여러 외부 신호를 처리한다.

ATmega2560은 유연한 인터럽트 제어 모듈을 가지고 있다.
Global Interrupt Enable bit: 모든 인터럽트를 전역적으로 제어하기 위해 상태 레지스터에 전역 인터럽트 활성화 비트(Global Interrupt Enable bit) 이 존재한다. 이 비트를 설정하면 인터럽트 처리가 가능하고, 해제하면 인터럽트가 비활성화된다.
attachInterrupt(interrupt, function, mode): 특정 핀에서 인터럽트를 설정하는 함수이다. 첫번째 인자로 인터럽트 번호, 두번째 인자로 인터럽트 발생 시 호출 함수, 세번째 인자는 인터럽트 트리거 모드(발동 조건)을 의미한다.
detachInterrupt(interrupt): 특정 인터럽트 비활성화
벡터 번호가 낮을수록 우선순위가 높다. 벡터 값이 작은 인터럽트가 먼저 처리된다.