고양이와 코딩
[ARM Cortex-M3 완벽 가이드] - 내맘대로 정리.. 본문
Chapter 01
ARM은 프로세서 설계를 전 세계의 선도적인 반도체 회사들의 대부분을 포함한 비즈니스 협력사들에게 라이센스를 해준다.
협력사들은 ARM의 저가이면서 저전력 프로세서 설계를 기반으로 하여 프로세서와 마이크로컨트롤러, 그리고 시스템-온-칩(SoC)를 만든다.
이러한 비즈니스 모델은 일반적으로 지적 소유권(Intellectual Property: IP) 라이센싱이라고 불린다.
→ ARM은 직접 반도체를 생산하지 않고, IP라이선스를 제공하는 비지니스 모델을 가지고 있음
즉, 반도체 회사(삼성, 퀄컴, 미디어텍, NXP ,,,)가 ARM으로부터 CPU코어(IP)를 라이선스 받아, 자신들의 칩(SoC, MCU등)에 포함시키는 방식임.
칩을 개발하는 회사들은 필요한 IP들을 라이선스로 구매하여 조합하고, 추가적으로 자신들만의 기술(이미지 프로세서, 통신 모듈 등)을 더해서 최종적인 반도체 칩을 만듬.
예를 들어:
- 퀄컴: ARM CPU 코어 + 자체 GPU(Adreno) + 5G 모뎀 등을 조합해 스냅드래곤 SoC 개발
- 삼성: ARM CPU 코어 + 자체 NPU + 자체 ISP 등을 조합해 엑시노스 SoC 개발
- NXP: ARM Cortex-M 코어를 기반으로 한 마이크로컨트롤러(MCU) 개발
즉, ARM의 IP를사용한다고 해서 모든 칩이 똑같지 않고, 각 회사가 어떤 IP를 조합하고 얼마나 최적화나느냐에 따라 성능과 특성이 달라짐
자동차: Cortex-M3의 또 다른 이상적인 어플리케이션은 자동차 분이야다. Cortex-M3 프로세서는 매우 높은 성능 효율성과 낮은 인터럽트 지연시간을 가지고 있기 때문에 실시간 시스템에서 사용이 가능하다. Cortex-M3 프로세서는 240개까지의 외부 벡터 인터럽트를 지원하며, 중첩 인터럽트를 지원하는 내장된 인터럽트 컨트롤러와 선택 가능한 메모리 보호 장치를 가지고 있다. 이러한 특징은 집적도가 높고 가격에 민감한 자동차 어플리케이션에 이상적이다.
→ '외부 벡터 인터럽트' ; MCU 외부에서 발생하는 인터럽트를 의미.
외부 장치(GPIO, UART, I2C, Timer ...)가 인터럽트를 발생시키면, CPU가 미리 정해진 벡터 테이블을 참고하여 해당 인터럽트 핸들러를 실행
ex)
- 타이머(Timer) 인터럽트
- GPIO 인터럽트(버튼 입력)
- UART 수신 완료 인터러븥
- I2C 데이터 수신 인터럽트
보통 MCU에는 NVIC(Nested Vectored Interrupt Controller)라는 인터럽트 컨트롤러가 있어서, 어떤 인터럽트를 우선 처리할지 관리.
외부에서 인터럽트 핀을 통해 신호가 들어오면, NVIC가 해당 인터럽트를 CPU에 전달하고, CPU는 벡터 테이블을 참조하여 적절한 ISR(Interrupt Service Routine)을 실행
내장된 중첩 벡터 인터럽트 컨트롤러(NVIC)
- 중첩 인터럽트 지원
- 벡터 인터럽트 지원
- 동적 우선순위 변경 지원
- 인터럽트 지연시간 감소
- 인터럽트 마스킹
'중첩 인터럽트 지원' ; 인터럽트가 실행 중일 때, 더 높은 우선순위의 인터럽트가 발생하면 현재 인터럽트를 일시 중단하고 새 인터럽트를 먼저 실행한 후 다시 돌아올 수 있음
Chapter 02
버스 인터페이스
Cortex-M3 프로세서에는 몇 가지 버스 인터페이스들이 있다. 그것들은 Cortex-M3가 명령어 페치와 데이터 접근을 동시에 수행할 수 있게 해준다. 메인 버스 인터페이스에는 다음과 같은 것들이 있다.
- 코드 메모리 버스: 코드 메모리 접근 영엉이 수행되는 곳, 물리적으로 두 개의 버스로 구성되어 있다. 하나는 I-코드라고 불리며, 다른 하나는 D-코드라고 불린다. 이것들은 최고의 명령어 실행 속도를 얻을 수 있도록 명령어 페치를 위해 최적화되어 있다.!
- 시스템 버스: 메모리와 주변장치로 접근하기 위해 사용됨. 이것은 SRAM, 주변장치, 외부 RAM, 외부 장치, 시스템-레벨 메모리 영역의 일부로 접근할 수 있게 해줌
- 전용 주변장치 버스: 디버깅 컴포넌트들과 같은 전용 주변장치를 위해 할당된 일부 시스템-레벨 메모리에 접근할 수 있게 해줌
인스트루먼트 트레이스 매크로셀(Instrumentation Trace Macrocell: ITM)은 개발자들이 데이터를 디버거로 출력하기 위한 새로운 방법을 제공한다. ITM 안에 있는 레지스터 메모리로 데이터를 사용함으로써, 디버거는 트레이스 인터페이스를 통해 데이터를 수집하고 그것을 디스플레이하거나 처리할 수 있다. 이 방법은 JTAG출력보다 사용하기 쉽고 더 빠르다.
이러한 모든 디버깅 컴포넌트들은 Cortex-M3의 DAP인터페이스 버스를 통해 또는 프로세스 코어 상에서 실행하고 있는 프로그램에 의해 제어된다. 그리고 모든 트레이스 정보는 TPIU로부터 접근될 수 있다.
→ 왜 ITM두고 JTAG를 사용하는지?!!
JTAG은 CPU를 직접 제어할 수 있음
- CPU가 완전히 멈춰 있는 상태에서도 메모리를 읽고, 값을 변경하고, 브레이크포인트를 설정할 수 있음
- 반면 ITM은 실행 중인 코드에서만 데이터를 보낼 수 있기 때문에, CPU가 정상적으로 동작하지 않으면 사용할 수 없음
펌웨어 다운로드 및 칩 초기화 가능
- JTAG은 플래시 메모리에 직접 접근해서 펌웨어를 업로드할 수 있음
- ITM은 단순한 데이터 트레이스 로그 시스템이므로, 직접 펌웨어를 올리거나 메모리를 조작할 수 없음
UART 기반 디버깅과 호환성이 좋음
- 많은 개발 환경에서는 JTAG + UART 로그 출력 조합을 사용
- ITM을 활용하려면 SWD(Single Wire Debug)와 TPIU(Trace Port Interface Unit) 설정이 필요해서 기존 디버깅 환경과 맞추기가 어려울 수 있음