본문 바로가기
학교 공부/내장형 시스템

[내장형 시스템] 인터럽트와 ISR, IVT

by 그적 2020. 9. 11.

< 내장형 2주차 >

(이전 시간)
입출력 장치 제어 방법
- Memory Mapped
   : 0x0000부터 0xffff까지 I/O 장치를 위한 공간으로, 나머지를 메모리를 위한 공간으로 사용한다.
     메모리 주소로 I/O인지 Memory 인지 알 수 있다.
- I/O Mapped : 
   : I/O를 위한 명령어, Memory를 위한 명령어가 존재하여 명령어를 통해 판단한다.

입출력 장치 동작
- Polling
 : 주기적으로 CPU가 각각의 I/O를 체크하여 CPU에 들어갈 데이터가 있는지 확인한다.
   CPU와 주기적으로 체크 안 해도 될 I/O의 경우, CPU의 사이클이 낭비될 수 있다.
   새로운 장치가 들어올 때마다 해당 장치를 polling하는 코드가 추가되어야 하기 때문에 복잡해질 수 있다.

//  위의 것을 해결하기 위해 나온 것이 intterupt
- Interrupt
 : interrupt가 발생하면, CPU를 멈추고 I/O 장치를 실행한다.
   I/O가 interrupt가 발생할 때마다 CPU를 멈추고 가져와야 하기 때문에 CPU 개입이 필요하다.
  대용량 데이터를 보낼 때마다 CPU에게 interrupt를 걸게 되면, 오래 걸린다.

// 위의 것을 해결하기 위해 나온 것이 DMA
- DMA 


Interrupt Vector
: 해당하는 서비스 루틴이 어디에 존재하는지 알기 위해서 Interrupt Vector를 사용한다.

----------------------------------------------------------------------

- Interrupt의 기본 동작 원리와 ARM Processor 예제
- 앞라인 테이블에서 Interrupt Vector테이블이 어떻게 구성되어있는지 확인한다.

인터럽트란?
: I/O장치와 프로세스가 communication 하기 위한 방법
① 인터럽트가 발생하면, 디스크에서 read 할 데이터가 준비되었다.
② CPU에게 interrupt를 발생시켜 현재 실행 중인 프로세스를 멈추고, 인터럽트 서비스 루틴을 수행한다. 
③ 이후 인터럽트 서비스 루틴을 끝내고 본래 있던 프로세스로 돌아와서 나머지 작업을 실행한다.
   (함수 호출처럼 생각하면 된다.)

인터럽트 하드웨어 고전

이전엔 인터럽트가 발생하면, I/O장치와 프로세서가 연결된 pin을 사용하여 어떤 장치에서 인터럽트가 발생했는지 바로 알 수 있었으나 이렇게 되면, 프로세스와 연결된 pin 개수에 한계가 있기 때문에 I/O 장치 또한 한정적이게 사용할 수밖에 없다.

따라서 Interrupt Controller를 사용하여 Controller가 pin을 관리하고, 프로세서와 연결되도록 한다.


Interrupt Number
: identify -> microporcessor와 target board의 datasheet을 통해 확인해야 한다.

Interrupt 종류
- Maskable : 무시할 수 있음
- Nonmaskable : 무시할 수 없음. (reset 혹은 power failure)

Interrupt Nesting
: 비동기적이다. (언제 누가 갑자기 일어날지 모름)
  어떤 한 시점에 여러 개의 interrupt가 동시에 발생할 경우, 우선순위를 정의해둔 것에 따라서 먼저 처리함.
  뒤의 프로세스는 대기되거나 무시됨.


ISR(Interrupt Service Routine) 
: 해당하는 interrupt를 처리해주는 interrupt service routine을 실행한다.

(주의사항)
인터럽트는 block이 되면 안 된다. >> interrupt 서비스에서 block이 되면, 전체 서비스에서 block이 된다.
아주 짧게 작성되어야 한다. >> 실행 시간이 길게 되면, 사용자 프로세스는 block이 되고 있는 상태임.
- 수행 도중에는 같은 우선순위의 interrupt가 발생하더라도 뒤에 온 인터럽트는 CPU에 전달할 수 없음.
    1) top - half : h/w에 관계된, 최대한 빨리 처리해야 하는 작업
    2) bottom - half : ISR에서 처리할 필요가 없고, 시간이 오래 걸리는 작업
context save & restore(복원): 인터럽트가 발생하지 않은 것처럼 이전 프로세스를 재실행해주어야 한다.
    >> 컴파일러가 도와줄 수도 있음.

IVT(Interrupt Vector Table)
: interrupt와 해당 interrupt의 ISR과의 매핑을 제공.
1) IVT는 h/w의 특정 주소에 위치 -  ARM 프로세서의 경우 IVT는 0x00부터 한 워드씩 할당
2) IVT의 각 entry에 저장되는 값 -  실행할 ISR의 주소,  ISR로 jump하기 위한 명령어


ARM 프로세스의 동작 방법
듀얼 모드 operation 커널 모드와 듀얼모드로 나누어서 critical 실행은 커널 모드에서만 실행한다.
ARM 프로세스에서는 7개의 모드가 정의되어 있고, 어떤 종류의 작업을 처리하고 있는지 나타냄 (FIQ - 고속, IRQ - 일반적인 모드)

ARM은 37개의 32비트의 레지스터 포함 >> 범용 레지스터(30), PC(1), 상태 레지스터(6)
- CPSR : 현재 동작중인 프로세스의 상태 저장, 모든 동작 모드에서 공유
- SPSR : 이전 동작 모드의 CPRS를 복사해서 보관, 모드 간 스위치
   (ex. user모드에서 IRQ로 바뀔 때 상태 모드 값들을 저장해둠.)
- SP : 스택 포인터, 동작 모드마다 별도의 SP가 존재
- LR : 현재 실행하다가 되돌아갈 때 되돌아갈 주소를 저장하거나 예외 처리 후 되돌아갈 주소 정보 저장

 

(ARM 프로세스 예외 처리 과정)
**우리가 임베디드 시스템에서 ARM 프로세스를 이용하여 처리하지는 않지만, ARM 프로세스는 기본이 프로세스이므로 큰 틀은 다르지 않을 것이다. 

// 하드웨어 버전은 속도가 상당히 빠르다. >> 모든 인터럽트마다 공통적으로 수행되어야 함
예외 처리 순서 - 하드웨어 ver
 1) CPCR을 SPSR_<mode>에 복사
 2) CPCR의 비트 수정(동작 모드 변경, interrupt(I, F bit)를 disable 시킨다.)
 3) 되돌아갈 주소를 LR_<mode>에 저장
 4) PC 값을 IVT 내의 해당 벡터 주소로 설정한다. (-> 이후는 소프트웨어 작업)

// 인터럽트 종류에 따라서 실행되는 ISR의 내용이 다르기 때문에 소프트웨어로 구성되어 있다.
예외 처리 순서 - 소프트웨어 ver
 1) 범용 레지스터를 스택에 저장
 2) 예외 처리 코드 실행(ISR)
 3) 범용 레지스터 복원
 4) PC 값을 LR_<mode>로 복원
 5) CPRS 값을 SPSR_<mode>로부터 복원



Interrupt Latency
: 인터럽트가 반응할 때까지 걸리는 반응시간 (IVT - ISR)
 disable 되어 있을수록 latency가 느리다.

- latency를 줄이기 위한 방법 중 하나가 공통 부분을 하드웨어로 처리하게 한다.
- 임베디드 시스템을 설계하기 위해 아주 많이 고려될 사항이다.

Q. 625ms 안에 반응이 가능하냐? 가능하다. 3>2>1의 우선순위를 가질 때 최대 550ms 기다린다.
Q. 625ms 안에 반응할 수 있냐? 불가능하다. 3>2>1>4의 우선순위를 가질 때 최대 675ms를 기다려야 한다.

-------------------------------------------------------------------------------

임베디드 시스템 개발 방법론
1) 시스템의 용도 분석 후
2) 하드웨어 부분 설계
3) 소프트웨어 부분 설계
4) 시스템 통합 시험

(개발 환경 설정)
특정 기능을 수행하기 때문에 우리가 여태 사용해왔던 범용 시스템과는 다르다.
독자적으로 프로그램을 수행할 수 없는 환경일 수 있다. 즉, 개발 환경이 설치된 컴퓨터와 실제 개발하고자 하는 시스템이 별도로 존재하여 "교차개발환경"이라고 한다.

- Host System
- Target System
- Backend System // host와 target 사이에 통신 역할

교차 개발 환경에서는 Cross Compiler를 사용해야 한다.( <-> Native Compiler)
Toolchain : 교차 컴파일을 위해 필요한 cross compiler 및 각종 라이브러리이다.

임베디드 리눅스란 저성능의 프로세서와 소용량의 메모리를 가진 제한된 컴퓨팅 자원 하에서 특정 응용 프로그램의 수행에 필요한 요구 사항을 충족시킨 최적화 리눅스이다.
- 안정된 운영체제와 multitasking
- 오픈 소스

운영체제 구조
1) Monolithic 구조(전통적 운영체제) : 모든 기능들이 하나의 운영체제 코드에 포함된 상태
  - 커널 코드에 h/w 관련 코드가 포함되어 있어 다른 시스템에 이식하기 힘들다.
2) Micro-Kernel 구조
  - 커널의 기능을 최소화하여 가장 핵심적인 부분만 커널에 포함한다.
  - 기능 확장 및 수정이 용이하며, 커널 규모가 작기 때문에 이식에 용이하다.
  - 프로세스 간 메시지 전달에 따른 오버헤드가 존재한다.

최근에 나온 모든 리눅스는 micro-kernel의 확장성과 재사용성에 대한 장점을 모듈이라는 개념을 도입하여 보완하였다. 우리가 실습할 es-101 키트도 모듈로 구성되어 있다.  리눅스는 모듈 프로그램을 통해서 공식화된 절차들이 존재하기 때문에 커널이 모듈로써 구성할 수 있게 된다

리눅스 부팅 과정
① ROM BIOS에 의해 시스템의 이상 유무를 점검하고 하드웨어를 초기화시킨다.
   >> 기본적인 power on test
② bootloader를 메모리에 적재한다. 부트로더가 커널(주소로 가서 커널)을 실행
③ 커널 실행 후 커널은 최초 프로세스인 /sbin/init 실행
④ init 프로세스에 의해 운영체제 초기화




댓글