Interrupt System

자 이제 가장 중요한 인터럽트의 시작이다

얘네는 또 지들만의 고유한 용어를 사용한다.

Service Request Nodes(SRNs) 

Service Request는 특이하게도 interrupt request 혹은 DMA request로 정의 된다.

 

Conventional architectures generally take a long time to service interrupt requests, and they are normally handled by loading a new Program Status (PS) from a vector table in data memory. In the TriCore architecture, service requests jump to vectors in code memory to reduce response time. The entry code for the ISR is a block within a vector of code blocks. Each code block provides an entry for one interrupt source.

이 부분 잘 이해가 안가는데?

인터럽트 핸들러 들어가는 prologue/epilogue쪽 코드가 단순한 branch로 구성되어 있고 program status는 변경되지 않는다는 의미일까? 이건 타겟보드 혹은 컴파일된 바이너리의 어셈레벨 진행되는 코드를 보고 내용을 추가해야 할 것 같다.

 

이전 내용에서는 CSA(Context Save Areas)가 있어서 save/restore context를 할 수 있다고 했는데 여기에 interrupt가 포함되는 거 아닌가? 그러면 기존의 conventional architecture랑 동일한 게 아닌감?

 

이 부분관련해서는 내용 추가가 필요할 것 같다.

 

Interrupt Priority

중요한  부분이다. 당연히 interrupt의 nested를 지원한다.

ICU(Interrupt Control Unit) 은 어떤 인터럽트 소스가 승리할 지(처리될지) arbitration 을 하는데 이건 당연히 prioriryt number based로 진행 된단다.

 

각 인터럽트 타입들은(Service Request) 당연히 Priority Number랑(SRPN) assign이 되어있다.

interrupt pirority는 255 level

 

너무 졸려서 더이상 진행 불가

나머지 내용은 다음에 이어서 추가 작성하는 걸로......

 

Figure 5-1 Block Diagram of a Typical TriCore Interrupt System 관한 내용을 리뷰하고 있었음

 

 

Posted by 쵸코케키

tricore 아키텍쳐에 대해 써보려고 한다.

정확히 벤치를 돌려보지는 않았는데 체감 성능은 Cortex M7은 가야 맞짱이 가능하지 않나 싶다.

벤치를 돌려본게 아니라 진짜 성능이 그렇게 나오는지는 모르것고 일단 줜나 빠르고 줜나....비싸다.

Aurix 3G TC4x 시리즈 나오면 가격이 얼마나 갈까

시간 되면 V850 

 

여튼 tricore에 대해 설명해둔 자료도 없고 공부하는 식으로 정리를 해보려고 한다.

 

레지스터

The PCXI, PSW and PC registers are crucial to the procedure for storing and restoring a task’s context

PCXI - Previous Context Information register

PSW -Program Status Word

 

Registers [0H - 7H] are referred to as the ‘lower registers’

and registers [8H - FH] are called the ‘upper registers’.

 

Registers A[0], A[1], A[8], and A[9] are defined as system global registers.

These are not included in either the upper or lower context

 

and are not saved and restored across calls or interrupts.

They are normally used by the operating system to reduce system overhead

그럼 그냥 스크래치 용으로 써도 되는건가?

 

Memory Model

The architecture can access up to 4 GBytes (address width is 32-bits) of unified program and I/O memory. The address space is divided into 16 regions or segments [0H - FH], each of 256 MBytes. The upper four bits of an address select the specific segment.

 

Tasks and Contexts

A task is an independent thread of control. There are two types: Software Managed Tasks (SMTs) and Interrupt Service Routines (ISRs).

그냥 task 수행되는 걸 SMT라고 하고 인터럽트 처리되는 건 ISR이라고 하나보다

근데 왜 하필 이름을 SMT라고......

 

SMT는 당연히 여러가지 모드가 있다.

User-0 Mode

Used for tasks that do not access peripheral devices. This mode cannot enable or disable interrupts.

신기하네요. ARM Cortex에는 이런식으로 제한된 모드가 없어요. MPU를 써서 뭐 막아부리는게 아니면

 

User-1 Mode

Used for tasks that access common, unprotected peripherals. Typically this would be a read orwrite access to serial port, a read access to timer, and most I/O status registers. Tasks in this mode may disable interrupts for a short period.

 

Supervisor Mode

Permits read/write access to system registers and all peripheral devices. Tasks in this mode may disable interrupts

 

Individual modes are enabled or disabled primarily through the I/O mode bits in the Processor Status Word (PSW).

 

Context Save Areas

아...이런 이름 쓰지 말지. 타사의 HW랑 너무 중복 되네요 Save Area 이런거 용어로 쓰지 말자

The architecture uses linked lists of fixed-size Context Save Areas (CSAs). A CSA consists of 16 words of memory storage(64Bytes ㄷㄷㄷ), aligned on a 16-word boundary. Each CSA can hold exactly one upper or one lower context. CSAs are linked together through a Link Word

upper/lower context라는 용어가 나왔는데 일단 넘어가자

 

Context switching occurs when an event or instruction causes a break in program execution. The CPU then needs to resolve this event before continuing with the program.The events and instructions which cause a break in program execution are :

• Interrupt or service requests

• Traps

• Function calls

 

Posted by 쵸코케키

아파트 고층에다가 건물 배치상 바람골에 위치해서 거의 항상 빌딩풍이 강하게 부는 곳에 살고 있음

마침 미세먼지 매우 좋음으로 뜨는 날씨에 바람도 잘 불고 비도 상당히 많이 오길래 뒷 베란다에서 한 번 구이를 해보기로 함

 

비오는 날이면 연기가 창문으로 나가도 곧바로 없어질 것 같았고 다른 집이 베란다 창문을 닫아놓을 것으로 생각하여 시도해봤음

뒷베란다쪽은 확장형 집은 요리하는 부엌쪽이고 비확장형은 세탁기, 보일러 있는 다양도 실이라 배치상 민폐나 문제도 없을 것이라 판단함

 

캠핑 때 보니까 챠콜에서 거의 연기가 안나서 해볼만할 것 같았음

챠콜은 웨버사꺼로 9개만 사용함

 

결론적으로 다음에는 하지 말아야겠다는 뼈아픈 교훈을 얻음

1. 챠콜이 하얗게 구워지면 연기가 안나는데 챠콜에 착화하는 30분 동안 연기가 장난 아니다

베란다에 화재 경보기가 있었는데 진짜 간떨어지는 줄 알았음

 

2. 베란다는 창문 열어도 어느정도 밀폐가 되어있어서 이/일산화탄소 때문에 건강에 많이 안 좋았음

 

3. 고기 구울 때 미세하게 연기가 계속 나옴

아예 안나오는 건 아님

 

4. 가장 큰 문제는 고기에서 나오는 기름이 증기화 되어서 베란다 전체에 다 퍼졌다는 점이다

집에서 삽겹살을 구워먹으면 부엌 바닥 전체가 미끌거리는거 아실련지?

그것처럼 고기를 숯불/챠콜에 구우면 소고기임에도 불구하고 유증이 베란다 바닥 세탁기, 건조기 보일러, 오븐....오만가지곳에 다 퍼져서 미끌미끌 거리는 검은 먼지들이 가득해졌다

바닥은 세제로 닦아냈고 건조기, 세탁기, 오븐은 알콜로 싹다 닦아냈다

그런데 그래도 닦아낼 수 없는 물건들은 챠콜재 + 기름으로 덮혀서 만지기가 좀 거북한 상태

 

5. 탄내

베란다에서 불냄새가 안 없어진다

살려줘

 

 

결론: 절대 비추

숯불구이는 밖에서

 

Posted by 쵸코케키

결론부터 요약

Direct Vector Method

  1. EIIC 값 확인
  2. Exception Cause(EIINTn) = EIIC – Exception Cause Code Base Address
  3. EIINT Offset = EIINTn x 0x10 + 0x100
  4. 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의 시작 주소가 각기 다른 것을 확인하시라

C. EIINTn Offset 을 구해보자

EIINTn priority 0이 0x100부터 시작이다. 그러니까 아까 예시의 7번은 0x170이 되겠다

이걸 공식화 하면 0x100 + Exception Cause x 0x10

 

D. 마무리

PSW.EBV 값에 따라 RBASE 혹은 EBASE 값에 이전 단계에서 구한 EIINTn Offset을 더하면 끝

Table Reference Method는요?

설명하기 귀찮다

INTBP + Exception Cause x 4 하면 된다.

 

startup 코드에서 미리 INTBP 설정하는 거 잊지 말고오오~~~~

Posted by 쵸코케키

cortex 시리즈도 그렇고 pipeline은 기본 탑재 되어있다.

pipeline에 대한 개념은 대충 다 알고 있으리라 본다.

pipeline에 대한 이해는 정말 간단한 프로그램을 어셈으로 짜놓고 nop 최적화 같은거 하면 정말 쉽게 깨닫게 된다.

이 작업을 하고 있으면 뭔가 자신이 굉장히 하이테크의 정점에 다가선듯한 기분을 체험해볼 수 있으며 그 날은 이야 내가 인생을 허비한 것이 아니라 제대로 살았구나라고 머리속 모든 것이 긍정적으로 변하는 그런 날이 될 수 있다.

바로 직전에 롤에서 10데스하는 핵트롤을 하다가 도저히 오늘은 게임 하는 날이 아닌가보다 하고 공부를 시작했다고 하더라도 말이다.

 

여튼 pipeline에 의해 barrier 가 필요하다. 

이걸 Renesas에서는 어떻게 제공하고 있는가?

 

 

SYNCE는 FPI 소수점 관련 내용

SYNCI는 instruction(Synchronize memory for instruction writers)

SYNCM은 memory(memeory, register) load/store

SYNCP는 memory load만(synchronize pipeline)

 

SYNCI 항목에는 Calculation Instruction이라고 적혀있는데 Appendix A를 보면 연산과 관련된 작업 외 PSW, MPU 등 기타 시스템 관련 레지스터 작업 관련해서도 보장함을 알 수 있다.

 

Posted by 쵸코케키

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

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

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

 

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

 

아래의 내용은 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 쵸코케키

예전에는 NO였다 but 최근에는 YES다

BT가 필요하면 동글 사서 끼면 되지 않냐고? 그게 문제가 있다.

 

USB 3.0 슬롯 신호랑 BT 신호랑 간섭이 가서 BT동글을 사서 USB 3.0 허브 슬롯에 끼면 통신이 불가능하거나 USB 장치가 뚝뚞 끊기거나 그런 문제가 생길 수 있다.

 

BT 동글 대충 택배비 더하면 만원 살짝 넘는다.

그냥 메인보드 살때 돈 조금 더 내서 BT 옵션 달린 거로 사는게 나은 거 같다

최소한 위에서 언급한 간섭을 어느정도 피할 수 있을 수도 있다.

 

또한 최근에는 무선 기기가 많아지면서 자신이 생각지도 못했던 무선 기기를 연결해야 할 수도 있는 상황이 발생하는 경우가 있다

 

마이크나 키보드, 마우스, 이어폰이나 휴대폰이나 등등

그렇기 때문에 얼마 돈을 더 주더라도 메인보드에 블루투스 옵션을 추가할 수 있다면 그걸 선택하길 권장하고 싶다

Posted by 쵸코케키

텐키를 사용하다가 텐키리스를 사용하면 은근 불편하다

텐키쪽 엔터랑 -/+ 같은 키가 문제인 거 같다

 

일단 텐키가 없어서 공간이 많이 절약 되기 때문에 그 자리에 마우스를 넣고 사용하면 공간 활용 용이성은 점수를 줄 만큼 만족스러운 것 같다.

 

단점은 위에서 말한 것 처럼 엔터가 없어서 자꾸 방향키를 클릭하는 문제가 있고(이건 습관을 다시 들이면 될듯)

-/+ 키 조합 단축키에 애로사항이 생기는 이슈가 있는데 예를 들어 ctrl + -/+로 확대 축소를 하는 프로그램이 있는 경우 좀 골치아 아파진다

 

결론?

이런 소소한 불편함이 있음에도 불구하고 공간이 줄어서 얻는 이득도 무시할 수 없을만큼 좋기 때문에 한 번 사용해보기를 추천하고 싶다

 

키보드 사용 경력이 짧고 텐키 이용 빈도가 낮은 사람이라면 ㅊㅊㅊ

(저는 텐키 사용 경력이 30년이 넘어서 ㅋㅋㅋ)

Posted by 쵸코케키

윈도우에서 배치파일, makefile로 빌드 시스템 구축해볼까 하는 분들을 위해....

결론: 추천하지 않음

 

이유

1. 윈도우 batchfile 즉 cli에는 아주 기가 맥힌 버그가 종종 있다. 하나가 아니다 문제는 그런 것들이 꼭 급할 때 갑자기 뿅! 하고 튀어나온다. 유니코드 한글 문자열 처리 버그 환경 변수 버그 등등 검색해도 나오지 않는 잡 버그들이 좀 있다.

파워쉘은 안써봐서 모르겠다. 근데 사용자 수가 적은 파워쉘을 써서 개발하느니(심지어 기본 탑재가 아니라 설치하려면 권한도 받아야 한다!!) 걍 파이썬 같은 거 배워서 쓰겠다.

 

2. 윈도우용 makefile에 오묘한 버그가 있다.

linux용 makefile에는 없는 버그로 일부 문법 처리가 이상하게 된다

그리고 멀티코어 빌드가 잘 안된다 되는 놈도 있고 안 되는 놈도 있고 되긴 했는데 이상하게 되는 놈도 있고 각양각색이라 신뢰를 못하겠다

 

3. 윈도우용 gnu util(binutils)도 버그가 있다.

이건 태생적으로 어쩔 수가 없다. 리눅스에서 돌아가라고 만든 걸 윈도우에서 만들어 놨으니 가끔 오작동 하는건 양해해야지

 

4. 윈도우용 gnu util의 문법이 다르다!

linux에서 잘 되는 문법 그대로 윈도우에서 쓰면 다르게 동작할 때가 있다

awk 같은 애들...

 

5. 지럴 콜라보

234가 콜라보로 지럴얨병을 할 때가 있다

 

6. 배치파일은 확장성이 매우 구리다

함수 처리, 문자열 파싱하다보면(for 루프로 문자열 파싱을 해야한다 for루프로!!!!) 빌게이츠를 암살하고 싶어질 것이다.

 

 

근데 어쩔 수 없이 구축하려고 한다면 윈도우 batch file 쓰지 말고 파이썬 스크립트 같은 걸 추천한다.

꽤 방대한 량의 batch file 빌드 시스템을 약 2주 가량 파이썬으로 변환 작업 했는데 결과가 매우 만족스럽다.

파이썬 스크립트 쓰면 최소한 1, 3, 4, 5, 6의 문제는 해결되고 2번만 남으니 적당히 커버가 가능하다

Posted by 쵸코케키

급한 분들을 위해 정답부터 일단 작성

 

예시: 파일들이 여러개 있는데 그 중에서 wind라는 글자가 들어가지만 md5라는 글자가 들어가지 않는 파일 목록을 가져오고 싶다.

import re

 

strings = ('windFix.bin', 'windFix.bin.md5', 'windFix2.bin', 'ccccddd.cfg')

p = re.compile('wind.+[^md5]$')

for i in strings:

    m = p.search(i)

    if m:

        print(m.group(0))

 

주목할만한 점

1. ^로 제외하고 싶은 단어를 넣음

2. $로 문자열 끝을 지정

 

그냥 제외만 하고 싶은데요?

'^((?!md5).)*$'

열라 복잡하네

 

여기서 테스트 가능하다 - https://www.regextester.com/15 

 

Match string not containing string - Regex Tester/Debugger

Regex Tester requires a modern browser. Please update your browser to the latest version and try again.

www.regextester.com

 

 

기타 참고 - 파일목록 가져오기

import glob

 

path = 'c:\\fw\\.......'

fileList = glob.glob(path)

for i in fileList:

    print(i)

    #m = p.search(i)

    .....생략

 

기타 참고 2

ooo 혹은 xxx는 필수로 들어가고 zzz는 없어야 한다면?

('wind.+[ooo|xxx][^zzz]$')

 

Posted by 쵸코케키

블로그 이미지
chocokeki
쵸코케키

공지사항

Yesterday
Today
Total

달력

 « |  » 2024.4
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

최근에 올라온 글

최근에 달린 댓글

글 보관함