Exception Cause(EIINTn) = EIIC – Exception Cause Code Base Address
EIINT Offset = EIINTn x 0x10 + 0x100
RBASE 혹은 EBASE + EIINT Offset
RINT가 0이라고 가정, RINT가 1이면 걍 0x100임
자! 이제 어떻게 인터럽트 핸들러가 실행되는 걸까? 상세 설명을 보시라
A. 장치로 인터럽트가 들어왔다고 치자. 그러면 EIIC 라는 레지스터에 Exception Cause Code가 뜬다.
B. Exception Cause(EIINTn) = EIIC value – Exception Cause Code Base Address
User Int라고 가정하자. 아래 표를 보면 EIINT 0 – 511까지 총 512개가 있고 Exception Cause Code는 0x1000 – 0x11FF임을 알 수 있다. 즉 Exception Cause Code Base Address이 0x1000이다. (당연한 내용이지만 0x11FF – 0x1000 = 0x200 즉 512)
만약 EIIC에 값이 0x1007로 들어왔다면 EIIC Offset = 0x1007 – 0x1000 = 7임을 알 수 있다.
아래는 그냥 참고용이다 Exception Cause Code의 시작 주소가 각기 다른 것을 확인하시라
근데 생각해보니까 르네사스 칩의 메뉴얼을 봐야할 정도면 굳이 이런 내용 없어도 알아서 다 파악할 수 있는 능력을 가졌을텐데 내가 여기에 이런걸 적고 있는게 의미가 있는걸까 급 후회가 되기도 하지만 블로그에 헛소리가 너무 많으니 그걸 치우기 위해 뭔가 있어보이는 내용을 적어본다.
아래의 내용은 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가 있는 곳이므로 그곳으로 이동
나름 이제 대기업에 댕기기도 하고 엄청 유명한 회사는 아니지만 그래도 울 나라 100대 대기업 뭐 이런곳 목록에는 들어가니까 내가 적는 팁이 뭔가 도움이 많이 될 수도 있지 않을까 싶어서 적어본다.
나는 간간히 실무 면접관으로 들어가고 있다. 내가 엄청 뛰어나거나 프로페셔널한 모습을 많이 갖고 있지는 않다고 생각하나 그간 오랜시간 쌓아올린 직무에 대한 경험이 있어 초보자들을 어느정도 평가하기에는 충분한 능력을 가지고 있다고 회사 측에서는 생각해서 면접관으로 보내고 있는 것은 아닐까 ㅎㅎ
사실 이런 팁을 안 적는게 면접관 입장에서는 더 좋지만 요즘 취업하기도 힘든데 면접자들이 자신이 의도하지 않은 행동으로 엉뚱한 오해를 사서 마이너스 점수를 받는 그런 부분을 구제해보고 싶기도 하기에 적어보도록 한다.
이 내용들은 필수적인 크리티컬한 포인트는 아니다.
하지만 만약 평가 통과 라인이 80점인데 79.99999인 상태에서 통과 시킬지 아니면 떨굴지 논의를 해야하는 상황이 될 때 의외로 큰 판단 요소가 될 수도 있지 않나 싶다.
네카라쿠배 같이 코테 능력을 3대 500찍어버리는 괴물 집단에는 안 어울리는 팁이 될 수 있다.
그리고 코테의 고득점이 당락에 큰 영향을 미치는 직무/회사인 경우 이 팁들은 그닥 도움이 안 될 수도 있다.
여튼 참고하기 바란다.
결론부터 적자
1. 깔끔하게 코드를 작성하자
2. 의미있는 함수명, 변수명을 쓰자
3. 결국 해내지 못했어도 최대한 노력한 흔적을 남겨보자
1. 깔끔하게 코드를 작성하자.
점수는 잘 나온 케이스는 별 상관이 없을텐데 점수가 많이 안나왔는데 포폴이 나쁘지 않은 지원자가 있었다.
그래서 면접관들이 면접을 볼지 말지 고민을 했는데 와...코드의 상태가 너무 심했다.
거의 뭐 원래 코드를 이렇게 작성했었는지 스타일이 그런지 뭔지 모르겠는데 도저히 정리가 안되고 정렬도 안되는 더러운 코드가 그려져 있었다.
팀장님께서는 하나를 보면 열을 안다고 이 사람의 실무 성격도 비슷하지 않을까 싶어서 면접으로 넘어가지 않고 그냥 떨궜다. 왜냐고?
코딩이 뭐냐
바로 프로그래밍 렝귀지로 만드는 구조적인 글이다.
신문사에 기고할 견습 작가를 구하는데 오마이갇 글을 똥같이 드럽게 문맥 문단 없이 써내면 그걸 과연 채용할까...?
어떻게든 돌아만 가면 되게 만들면 되지 않냐라는건 학부생 때 과제 낼 때의 이야기
2. 의미있는 함수명, 변수명을 쓰자
위와 관련 있는 이야기
이번에는 감탄이 나올 정도로 코드를 잘 정리해서 썼다.
네이밍 룰도 이미 알고 있는 것 같고 일부 코딩룰도 알고 있는 것이 느껴졌다.
매우 높은 가점이 정해졌다는 훈훈한 이야기
3. 결국 해내지 못했어도 최대한 노력한 흔적을 남겨보자
이런 사람도 있었다.
문제를 모르는 건 있을 수 있어
그런데 문제를 풀 수 있는 시간이 있는데 그 제한 시간을 거의 안 쓰고 10분만에 gg치고 나갔다.
아니...롤도 15분은 해보잖아. 10분 gg는 뭐니?
회사 업무를 하면 정말 청천벽력 같은 알지도 못하는 일이 담당자로 지정될 때가 있다.
그럼 제가요? 이걸해요? 회사 때려칩니다. 하고 gg를 치는게 맞을까?
이런 케이스도 이의 연장이라 볼 수 있다.
제한 시간 동안 정말 최대한 뭐라도 테스트 해보고 노력한 흔적이라도 보였어야 하지 않았나 싶다.
코드가 안돌아가? 그래도 작은 요소라도 시험해보고 따라가봤던 모든 흔적을 남겨봐라
이 지원자는 면접을 볼까말까 애매한 상황이었는데 이것 때문에 팀장님의 분노로 탈락 시켜버렸다.
4. 기타 참고
위에는 일부로 안적었다. ㅋㅋ
여기까지 글을 읽는 자에게 복이 있나니
코테 망했다고 너무 낙담하지 말자
직무에 따라서 포폴이 죽여주면 코테 무시하고 직권으로 면접 볼 수 있도록 신청하는 케이스도 있다.