르네사스에 대한 정보가 아예 없어 안타까워서 정리해본다.

나도 잘 모르는 내용이다. 간단하게 인터럽트 핸들러 설정 관련 글을 정리해본다.

틀렸는데요? -> 아주 좋은 지적이다. 좀 자세히 알려다오.

 

근데 생각해보니까 르네사스 칩의 메뉴얼을 봐야할 정도면 굳이 이런 내용 없어도 알아서 다 파악할 수 있는 능력을 가졌을텐데 내가 여기에 이런걸 적고 있는게 의미가 있는걸까 급 후회가 되기도 하지만 블로그에 헛소리가 너무 많으니 그걸 치우기 위해 뭔가 있어보이는 내용을 적어본다.

 

아래의 내용은 REN_r01us0165ej0120-rh850g3kh_MAS_20171026.pdf 라는 전혀 직관적이지 않은 더러운 파일명을 가진 메뉴얼을 요약한 것이다.

그냥 홈페이지에 회원 가입해서 다운 받을 수 있는 파일이다.

 

Basic System Register들 중에 여러가지가 있겠다만 PSW라는 놈이 있다.

ARM도 이런놈 있는거 알쟤?

 

PSW(Program Status Word)

현재 instruction execution result를 기록해두는 즉 status flag들을 모아둔 register

15번째 bitfield가 EBV

 

EBV

reset vector, exception vector 동작 관련 flag

RBASE, EBASE와 연관이 있다.

데이터 시트 뭐의 약자인지 안 나와있다. Exception Base Vector?

 

Exception

unusual event 즉 CPU 입장에서 아...나는 이제 망했구나 진짜 큰 일이 발생했구나 싶을 때 발생하는 이벤트

exception handler가 발동 된다.

 

언제 발생하는지에 대한 예시 목록이 있는데 예를 들면 뭐 이렇다.

Reset 발생하면 Reset 이라는 Exception이 발생하고 FPU exception, User Interrupt Exception, System Error, Memory Protection Exception 등등

FENMI, FEINT, EIINT 이런 중요한 3형제가 있는데 일단 넘어가자 여기서 힘 다 빼면 안된다

 

Interrupt Priority Order & Mask

일단 넘어가자

대충 어떤 개념인지는 알 것이라 생각된다.

뭔가 어떤 값을 설정하면 Priority 가 있고 Masking으로 인터럽트 허용 여부를 결정할 수 있겠지

집중력을 아껴야 한다

 

Exception Handler Address

서론 끝나고 드디어 도착  이제부터 중요하다.

높은 성능 향상 목적을 위해 이렇게 디자인 했다고는 하는데 진짜 왜 이렇게 디자인 했을까 싶은 생각이 드는 파트인데 뭔가 다 이유가 있지 않을까 아직 내가 시야가 좁아서 그런건가 싶은 부분이다. 일단 내용을 그대로 옮겨보자.

 

exception이 발생하면 handler를 실행해야 한다.

이 handler의 address는 2가지 방법이 있다.

 

1. Direct Vector Method

2. Table Reference Method

 

A. Direct Vector Method

CPU는 exception cause offset + Base Address 를 사용한다.

exception cause offset이라는건 exception list 가 표로 있는데 각 exception의 원인(cause)마다 offset이 할당 되어 있다.

 

위의 표가 전부다.

PSW.EBV 의 값에 따라 BASE address를 RBASE/EBASE register에서 참조할지 

그리고 RINT(RBASE/EBASE 내부에 있는 flag)의 값에 따라 offset이 결정된다.

위의 표가 이해 된다면 이하의 글은 읽지 않고 그냥 넘어가도 ok

 

Base Address

PSW.EBV = 0 : RBASE에 있는 address

PSW.EBV = 1 : EBASE에 있는 address

 

주의 사항: 몇몇의 exception은 항상 RBASE를 사용한다.

 

RINT는 R/EBASE에 있는 bitfield인데 이 flag가 1인 경우 EIINT (user interrupt)가 0x100 offset 주소로 handling 된다.

 

RBASE의 주소와 EBASE의 주소는 동일하게 설정할 수도 있고 다르게 설정할 수도 있다.

아래 그림의 INTPRx는 EIINTn과 같다

RINT = 1의 용도 : user interrupt 를 모두 0x100에서 처리하기 때문에 특정 상황에서 메모리를 적게 사용할 수 있다.

 

B. Table Reference Method

direct vector method는 각 interrupt priority level마다 하나의 user interrupt exception handler를 사용할 수 밖에 없음

여러 인터럽트와 연결된 채널은 동일한 priority와 같은 handler를 사용할 수 밖에 없음

이 문제를 해결해주는 방법임

 

direct vector method가 사용 되는 케이스

1. PSW.EBV = 0 && RBASE.RINT = 1

2. PSW.EBV = 1 && RBASE.RINT = 1

3. 인터럽트 채널 세팅이 Table Reference Method로 설정 되어있지 않음

 

위의 케이스 외는 table reference method로 동작한다.

Table Reference Method의 handler address = INTBP register + 채널 offset 내부의 값(int 채널 번호 x 4Bytes)

아래의 그림이 더 쉬운 이해를 도와줄 것이다.

 

INTBP부터 시작해서 레지스터들이 엄청나게 많은데(거의 뭐 메가 단위?) 거기에 각 interrupt handler 주소를 넣어서 

세팅할 수 있음

 

그래서 exception이후 interrupt handler 동작이 조금 느림

exception -> table reference를 함(INBTP + 채널 offset)의 레지스터 값을 read -> 그 값이 handler가 있는 곳이므로 그곳으로 이동

C. 그러면 왜 디자인을 이렇게 나누었는가? 용도는?

다음주에 추가해보도록 하겠다.

더이상 에너지가 없다.

 

그림으로 상상 해보자

 

Posted by 쵸코케키

블로그 이미지
chocokeki
쵸코케키

공지사항

Yesterday
Today
Total

달력

 « |  » 2024.12
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

최근에 올라온 글

최근에 달린 댓글

글 보관함