ARM ETM Trace와 PowerTrace
목차
PowerDebug Preface
본 자료는
PowerTrace를 처음 접하는 사용자가 쉽게 PowerTrace에 익숙해질 수 있도록 작성되었습니다. 본 자료에 수록된 내용은 사용자가
□ TRACE32-PowerTrace를 사용하기 위한 설정을 할 수 있으며
□ 타겟에서 출력되어 PowreTrace에 저장된 Real-time tracing 정보를 확인할 수 있으며
□ 이러한 정보를 바탕으로 PowerTrace의 기본 기능에 익숙해지도록 하는데 있습니다.
ETM과 PowerTrace
많은 SoC 내부에는 ETM 혹은 NEXUS로 대표되는 On-chip trace logic이 내장되어 있습니다. 이러한 trace logic은 프로세서의 동작을 Real-time으로 출력하는 것이 목적이며, 이를 통해 프로세서의 동작에 어떠한 영향도 주지 않으면서, 프로세서가 동작하면서 실행한 모든 instruction과 읽고 쓴 data의 흐름을 볼 수 있습니다(*프로세서에 적용된 ETM버전에 따라 틀림*).
On-chip trace logic은 이러한 정보와 함께 OS동작 시 생성하는 ProcessID를 같이 출력하기 때문에, 커널 영역과 유저 영역에서 동작하는 모든 흐름을 trace받을 수 있습니다.
이를 통해 어떤 Insturction이나 data 혹은 다른 요인이 타겟에 문제를 야기했는지 비교적 간단히 원인 파악이 가능하며, 종합적인 Run-time 및 Performance분석에 활용할 수 있습니다.
On-chip Trace Logic은 기본적으로 다음과 같은 기능을 제공합니다.
- 프로세서가 수행하고 출력하는 Instruction과 Data의 real-time trace
- Trace 정보를 출력하는 영역에 대한 Triggering과 Filtering
PowerTrace는 ETM로직에서 생성하는 정보를 이용하여 real-time으로 수행된 프로그램의 흐름을 분석하여 아래와 같은 경우에 강력한 디버깅 편의성을 제공합니다.
- 실행 순서가 중요하고, 순서에 따라 결과가 달라지는 Timing Problem
- 프로그램 수행에 영향을 받지 않아야 하는 Non-Interruptible Application
- 시스템의 exception 원인 분석
- 시스템 퍼포먼스가 떨어지는 경우, 퍼포먼스 분석과 최적화
PowerTrace는 ETM로직에서 생성하는 정보를 이용하여 real-time으로 수행된 프로그램의 흐름을 분석하고 디버깅과 프로파일링 등에 활용할 수 있는 기능을 제공합니다. PowerTrace로 활용할 수 있는 각종 분석 / 보정 기능입니다.
- 시스템 퍼포먼스 / 전력 소모 분서
- Hardware Breakpoint와 트리거 - Onchip 디버깅 로직에서 지원 시
- 프로그램 흐름과 데이터 trace - ETM버전에 따라 다름
- 1, 2, 4GB trace memory
- 최적의 trace sampling point를 찾아주는 AutoFocus-II self -calibration
- 16Gbit/s trace port bandwidth
- 함수 수행 통계 분석
- 퍼포먼스 분석
- 코드 커버리지
- 실시간 수행 정보를 바탕으로 한 CTS
- 전류 측정 - Analog Probe이용 시
- Logic Analyzer 17채널 지원
TRACE32 PowerTrace는 TRACE32 개발 툴 시리즈 중 하나로, 모든 TRACE32 개발 툴과 동일한 GUI-PowerView를 사용합니다.
PowerTrace Installation
Product Overview
PowerTrace 1set의 구성은 위와 같습니다.
□ License Dongle
PowerTrace사용을 위한 기본 설정은 JTAG을 이용합니다. License Dongle로는 기존의 JTAG케이블 또는 CombiProbe를 이용할 수 있습니다.
□ PowerDebug II
PowerTrace는 POD Express bus를 사용하기 때문에, PowerDebug II만 연결됩니다.
□ PowerTrace II (2GB / 4GB)
PowerTrace는 선택에 따라 2GB모듈과 4GB모듈을 사용할 수 있습니다.
보다 큰 버퍼 사이즈와 향후 Real time streaming을 위해 4GB를 권장합니다.
□ PreProcessor AutoFocus II
Trace port 테스팅과 최적의 샘플링 포인트를 찾기 위한 PreProcessor입니다.
□ Power Supplier DTP-60
PowerTrace는 PowerDebug보다 많은 전력소모를 합니다. 때문에, 파워서플라이는 반드시 DTP-60을 이용해야 합니다.
□ Mictor 38 pin connector
표준 mictor 38pin connector 1ea가 포함되어 있습니다. 만약 타겟의 ETM PortSize가 16port를 넘는다면, 별도의 mictor connector가 하나 더 필요합니다.
Product Overview
PowerTrace와 타겟이 연결은 아래와 같은 구조를 가지게 됩니다.
위 그림에서 볼 수 있는 것처럼, PowerTrace와 JTAG로직은 별도의 커넥터를 통해 연결하거나, mictor커넥터에 JTAG핀을 연결하여 하나의 커넥터로 JTAG과 ETM기능을 이용할 수도 있습니다.
연결 방법은 타겟 보드의 mictor커넥터 핀맵을 어떻게 구성했는지에 따라 결정됩니다.
□ JTAG커넥터와 mictor커넥터가 따로 나와있는 경우
JTAG커넥터에는 JTAG 모듈의 커넥터, mictor커넥터에는 mictor케이블을 연결합니다.
□ JTAG핀이 mictor커넥터에 포함되어 있는 경우
JTAG모듈의 커넥터는 PreProcessor뒤에 연결하고 타겟보드에는 mictor만 연결합니다.
PowerTrace와 타겟 보드의 연결
PowerTrace는 ETM로직에서 생성하는 trace data만 처리하며, 타겟 보드와의 인터페이스는 JTAG디버거인 PowerDebug-II를 통해 이루어집니다. 때문에, PowerTrace와 PowerDebug를 결합하여 사용합니다.
PowerTrace는 PowerDebug-II의 POD Express Bus 커넥터를 통해 결합됩니다.
위 그림은 타겟보드 - PowerDebug-II - PowerTrace-II - PreProcessor AF-2를 연결한 모습이며, JTAG핀이 타겟보드의 mictor커넥터에 포함된 경우입니다. 이럴 때에는 위 사진과 같이 JTAG 케이블을 PreProcessor에 연결해주시고, JTAG커넥터가 따로 있는 경우에는 타겟 보드의 JTAG커넥터에 연결해 주시면 됩니다.
이 때, 파워 서플라이는 반드시 PowerTrace 전용인 DTP-60을 이용해야 합니다.
PowerTrace의 설정과 활용
PowerTrace 활용을 위한 기본순서
PowerTrace는 일반적으로 다음과 같은 순서로 설정하고 활용합니다.
1. 앞 페이지에 있는 사진과 같이 POD Express Bus가 서로 연결될 수 있도록 Power Trace 모듈을 PowerDebugII 모듈과 결합합니다.
기본적인 인터페이스는 JTAG을 통해 이루어집니다. JTAG디버깅에 사용하던 cmm스크립트를 이용해 타겟과 인터페이스할 수 있습니다.
JTAG인터페이스에 대한 자세한 설명은 PowerDebug Startup Guide를 참고해주세요.
2. JTAG인터페이스가 이루어진 후, PortMode / PortSize / DataTrace 등 PowerTrace 사용을 위한 기본적인 설정을 합니다. 이러한 내용은 cmm스크립트로 저장할 수 있으며, JTAG방식의 디버깅을 할 때와 마찬가지로 스크립트를 실행하여 Power Trace사용을 위한 설정을 간편하게 수행할 수 있습니다. 샘플링 타이밍 설정이 필요한 경우, AutoFocus를 이용합니다.
3. 타겟이 동작하고 Breakpoint혹은 Exception으로 인해 타겟의 동작이 멈추게 됩니다. 이러한 상황에서 지금까지 타겟이 어떠한 동작을 했는지 Trace.List를 통해 확인할 수 있습니다.
4. Trace.List를 확인했다면, Trace받은 내용을 이용하여 각 trace record단위의 싱글 스텝을 통해 타겟이 리얼타임으로 동작했던 과정을 자세하게 분석할 수 있는 CTS를 이용할 수 있습니다.
이는 Trace.List에서 흐름을 분석하고 싶은 지점을 선택하여 마우스 우클릭 후 Set CTS선택 혹은 명령어 라인에 Trace.ListCTS를 입력하여 이용할 수 있습니다.
5. Trace record단위의 자료가 아니라, 전체적인 흐름을 차트 형태로 확인할 수도 있습니다. Trace.List의 상단에 있는 Chart항목을 선택하면, 현재 PowerView에 로딩된 심볼을 기준으로 프로그램의 흐름을 나타내는 차트를 확인할 수 있으며, 명령어 라인에서 Trace.Chart.sYmbol을 입력해도 동일한 기능을 이용할 수 있습니다.
6. 함수 간 콜관계를 좀 더 자세히 확인하고 싶다면 Trace.Chart.Func기능을 이용할 수 있습니다. 이 기능은 trace받는 동안 FIFO overflow등으로 인해 trace가 끊기는 상황이 없어야 100%신뢰할 수 있는 결과를 얻을 수 있습니다.
Step 1 - 타겟 인터페이스
PowerTraceII 모듈과 PowerDebugII모듈을 아래와 같이 결합해 줍니다.
□ JTAG커넥터와 mictor커넥터가 따로 나와있는 경우
JTAG커넥터에는 JTAG 모듈의 커넥터, mictor커넥터에는 mictor케이블을 연결합니다.
□ JTAG핀이 mictor커넥터에 포함되어 있는 경우
JTAG모듈의 커넥터는 PreProcessor뒤에 연결하고 타겟보드에는 mictor만 연결합니다.
하나의 ETM포트가 나와있는 경우, 혹은 두 개의 ETM포트가 있지만 ~16포트 설정까지는 ETM을 사용하는 경우 mictor커넥터를 PreProcessor의 TRACE A포트와 보드의 ETM 0번 커넥터에 연결해 줍니다.
타겟과의 기본적인 인터페이스는 JTAG방식을 이용하기 때문에, 기존에 사용하던 스크립트가 있다면 이를 실행하여 타겟 인터페이스를 합니다.
Step 2 - ETM 인터페이스와 설정
PortMode / PortSize / DataTrace 등 기본적인 설정을 해 줍니다.
타겟에 적합한 PortMode/PortSize는 데이터쉬트와 회로도 등에서 찾을 수 있습니다. 사용되는 코어와 ETM버전 별로 설정 가능한 PortMode 및 PortSize가 다릅니다.
다음 페이지의 예는 ARM9-ETMv1.3이 적용된 타겟의 설정화면입니다.
< ARM9-ETMv1.3이 적용된 타겟에서 PortSize와 PortMode설정 예>
위에 설정된 내용은 기존의 타겟 인터페이스를 위한 cmm스크립트에
ETM.PortSize 16.
ETM.PortMode Normal
ETM.DataTrace OFF
ETM.ON
을 추가하여 cmm실행 시 자동으로 ETM관련 설정을 할 수 있습니다. Cortex기반의 프로세서들은 PortMode로 Continuous를 사용하는 경우가 많습니다.
DataTrace 항목은 프로세서가 명령어를 실행하면서 읽고 쓰는 값들과 이를 위해 접근하는 주소정보를 같이 출력할지 여부를 선택하는 부분입니다. 이를 ON하는 경우, FIFO overflow가 자주 발생하기 때문에, 살펴보고자 하는 특정 변수나 주소 정보에 대한 DataTrace정보를 출력하도록 설정하거나, OFF로 사용하는 것이 좋습니다.
참고로 CortexA9에 적용된 ETMv4.0부터는 DataTrace기능을 지원하지 않습니다. CortexA9에서는 전체 Data flow에 관한 trace는 할 수 없지만 ITM로직을 통해 사용자가 선택한 데이터에 대한 trace를 할 수 있도록 로직이 설계되었습니다. Cortex시리즈와 같이 CoreSight가 적용된 타겟이라면, PortSize / PortMode이외에 ETM에 연관된 각 디버그 로직의 베이스 어드레스를 지정해 주어야 합니다.
별다른 하드웨어적인 문제가 없고 ETM핀이 mux된 경우가 아니라면, 일반적인 경우에는 PortSize / PortMode정도만 설정해주면 ETM에서 출력하는 데이터를 PowerTrace를 통해 받을 수 있습니다.
하지만 ETM핀에서 출력되는 데이터를 있는 그대로 받을 수 있는 경우는 흔하지 않습니다. 때문에 TestFocus/AutoFocus를 이용하여 샘플링의 기준점이 되는 threshold와 각 trace 포트 별 샘플링 타이밍 설정하여 최적의 샘플링 조건을 만들어줄 수 있습니다.
AutoFocus를 통해 설정한 threshold와 타이밍으로 ETM데이터를 받는데 문제가 있는 것은 ETM핀이 다른 핀들과 mux되어 있거나, 하드웨어 상의 문제가 있는 경우가 많습니다.
AutoFocus를 이용하는 방법은 다음과 같습니다.
Trace창에서 AutoFocus단추를 누르면, AutoFocus가 동작하여 THreshold레벨을 설정하고, 각 trace포트 별로 data를 받는데 문제는 없는지 확인하고, 포트 별 상황에 맞추어 샘플링 타이밍을 조정합니다.
AutoFocus결과 위 창과 같이 각 trace포트 별로 샘플링 타이밍이 조정됩니다. 이렇게 측정된 타이밍은 Store...버튼을 눌러 cmm스크립트로 저장하고 step1의 타겟 인터페이스 과정에서 실행할 수 있습니다.
Step 3 - Trace.List를 이용하여 결과 확인
타겟이 breakpoint / exception 혹은 사용자의 break에 의해 동작을 멈추면, 지금까지 PowerTrace의 trace buffer에 저장된 trace data를 확인할 수 있습니다. TRACE창의 기능 중 Trace.List는 CPU가 어떤 과정을 거쳐서 현재 위치까지 왔는지에 대한 realtime history를 확인할 수 있는 기능입니다.
Trace.List창입니다. 현재 Data abort가 발생하여 CPU가 동작을 멈췄으며, 리스트에 나열된 코드들을 통해 타겟이 동작을 멈추기까지의 수행 내역을 알 수 있습니다.
Trace.List에 있는 각 기능은 다음과 같습니다.
Setup |
Trace창을 열어준다.
|
Goto |
특정 trace record 위치로 이동할 수 있는 창을 열어준다. |
Find |
Trace buffer의 내용 중 특정 코드를 찾을 수 있는 창을 열어준다. |
Chart |
Trace buffer에 있는 내용과 PowerView에 로딩된 심볼 기반으로 각 symbol간의 호출 관계를 timeline 형태로 보여준다. |
More |
Trace.List에 보여지는 정보의 양을 조절한다. More를 누를수록 자세한 정보를 표시해 주며, 가장 많은 정보를 표시해 주는 단계에서는 C소스코드, asm, 실행정보 등을 모두 볼 수 있다.
|
Less |
Trace.List에 보여지는 정보의 양을 조절한다. Less를 누를수록 간략한 정보를 표시해 주며, 가장 적은 정보를 보여주는 단계에서는 C 소스코드만을 표시해 준다.
|
Step 4 - CTS를 이용한 Back Trace
PowerTrace를 통해 받은 trace data는 프로그램의 수행 내역과 퍼포먼스 분석 등에 활용될 수 있습니다. 이를 위한 대표적인 기능으로 CTS-Context Tracking System-이 있습니다.
CTS는 프로세서가 수행한 프로그램의 흐름을 instruction 단위로 재구성하고 실행하여 매 instruction마다 발생하는 변화를 볼 수 있는 기능입니다. 재구성되는 내용은 CPU 레지스터, 메모리, 캐쉬, TLB 등으로 타겟 시스템의 전반적인 정보를 재구성할 수 있습니다. 재구성이 가능한 정보는 타겟에 적용된 프로세서의 종류에 따라 다릅니다.
완전한 trace 기반 CTS기능을 활용하기 위해서는 FIFO overflow등으로 인하여 PowerTrace가 trace data를 받는 중간에 끊기는 부분이 없어야 합니다.
CTS기능은 Trace.List에서 기능을 사용하고자 하는 임의의 위치를 선택하여 우클릭 -> Set CTS를 선택해 주면 됩니다. CTS가 활성화되면, PowerView의 모든 창은 사용자가 선택한 위치 당시의 정보들을 보여주게 되며, Data.List에 있는 모든 버튼들은 노란색으로 변경되어 CTS가 활성화되었음을 나타냅니다.
CTS 기능이 활성화 된 Data.List의 모습입니다. 일반적인 타겟 제어 버튼 외에, 역방향 제어 버튼이 추가되었습니다. CTS기능을 종료할 때에는 상단 오른쪽의 OFF버튼을 누르거나, PowerView 하단의 명령어 라인에 CTS.OFF를 입력하시면 됩니다.
CTS창입니다. CTS와 연관된 기능들을 사용하고 조절하기 위해 사용되며, fiflfulls항목의 0은 지금까지 받은 trace data에 빈 곳이 없으며, 있던 부분은 CTS에 의해 복구되었음을 의미합니다.
CTS창에 있는 각 기능의 의마는 다음과 같습니다.
TAKEOVER |
CTS가 활성화되면, PowerView는 CTS가 활성화된 시점의 메모리와 레지스터 값 등을 보여줍니다. 이 상황에서 TAKEOVER를 실행하면, PowerView는 CTS에 의해 복원된 당시의 메모리와 레지스터 값을 타겟에 적용하고 CTS를 해제합니다. 때문에, PowerView가 이러한 동작을 정상적으로 수행할 수 없을 때에는 타겟과의 연결이 끊길 수 있습니다. |
PROCESS |
CTS를 활성화하고, PowerView는 trace받은 전체 내역을 살펴보고 얻어낸 캐쉬 분석 결과를 적용합니다.
|
List |
CTS.List창을 열어줍니다. Trace.List와 비슷하지만 CTS에 의해 복원된 결과를 보여준다는 것이 틀리며, 분석에 더욱 용이한 리스트를 보여줍니다.
|
Trace |
Trace창을 열어줍니다.
|
CACHE |
Cache분석에 필수적인 CTS.CACHE창을 열어줍니다. Cache분석을 하기 위해서는 프로세서에 적용된 캐쉬 구조를 CTS.CACHE창에 정확히 입력해 주어야 합니다.
|
Step 5, 6 - Chart를 이용한 전체적인 흐름의 분석
위에 설명한 기능 중, Trace.Chart.sYmbol 기능은 trace data를 분석하여 지금까지 프로그램의 수행이 어떤 과정을 거쳐왔는지 한 눈에 살펴볼 수 있는 차트를 제공해 줍니다.
위의 창에서, 가로축은 시간, 세로축은 심볼(작성한 코드의 함수나 Label 등)을 나타냅니다. 검은 막대는 해당 심볼이 realtime기준으로 수행된 시간입니다. 또한 위 그림에서 볼 수 있듯이, 검은 막대의 한 끝점부터 반대편 끝점까지 마우스를 끌어주면, 해당 심볼이 수행된 시간을 볼 수 있습니다.
이러한 정보를 통해 사용자는 어떤 함수 또는 심볼에서 병목이나 시간 지연이 발생했는지, CPU점유율을 얼마나 차지하는지, 그리고 전체적인 코드 흐름은 어떤지 알아볼 수 있으며, 이러한 정보는 성능 개선을 위한 지표로 활용될 수 있습니다.
이와 비슷한 자료로 Trace.Chart.Func이 있습니다. 이 기능은 Trace.Chart.sYmbol과 유사하지만 측정 기준이 다르며. 각각의 측정 기준을 Flat analysis와 Nesting Analysis라 합니다
sYmbol을 기준으로 하는 자료의 경우, 해당 함수의 시작부터 PC가 위치하는 것을 기준으로 측정하며, 해당 함수 수행 중 지역함수로 점프하면 caller의 측정은 멈춥니다. 한편 Chart.Func은 지역함수로 점프해도, caller의 측정이 계속 이루어집니다.
Nesting analysis는 Flat analysis에 비해 프로그램 실행정보를 더욱 자세하게 나타낼 수 있지만 그만큼 환경설정과 trace packet이 출력되는 상태에 민감합니다. 때문에 예를 들어 function exit를 알 수 없거나 확실하지 않는 경우 등은 출력되는 통계 자료에 해당 부분의 누락이 발생할 수 있습니다. .
위 그림에서 볼 수 있듯이 같은 Trace정보를 바탕으로 한 결과이지만, sYmbol과 Func은 서로 다른 결과를 출력합니다.
Chart.Func를 사용할 때에 trace 데이터를 100%분석한 결과를 얻기 위해서는 반드시 OS Awareness가 정상적으로 동작할 수 있어야 하고, trace정보를 받는데 어떠한 문제도 없어야 합니다. Chart.Func은 소스로 활용하는 기본 정보에 매우 민감하기 때문에, 경우에 따라 Chart.sYmbol 결과는 나오지만 Chart.Func결과는 제대로 나오지 않을 수 있습니다.
이처럼 정상적인 Chart.Func 결과를 받을 수 없을 때는 Chart.sYmbol을 이용하는 것이 좋습니다. 두 기능은 기본 데이터의 가공방식이 다를 뿐 동일한 trace data를 바탕으로 하기 때문에, 어느 쪽이나 성능 개선의 자료로 활용할 수 있습니다. PowerView는 OS Awareness가 설정된 경우, Chart.Func대신 자동으로 Chart.TASKFUNC 기능을 이용합니다..
PowerTrace를 활용한 분석기능
PowerTrace는 저장한 trace data를 활용해 앞서 설명한 chart기능 외 통계 분석 결과를 출력할 수 있습니다.
분석 기능은 위와 같이 Perf - Function Runtime 메뉴를 이용합니다.
<Show Numerical 메뉴>
<Show as Tree 메뉴>
<Show Detailed Tree 메뉴>
<Show as Timing 메뉴>
Trace.STAT.sYmbol기능은 Trace메뉴->Chart->Symbol 메뉴를 이용합니다.
Trace.STAT.sYmbol과 Trace.STAT.Func 기능은 이름에서 알 수 있듯이, Trace.Chart.sYmbol과 Trace.Chart.Func 각각에 대한 통계 분석 결과입니다.
IProbe 기능의 활용
IProbe 타이밍 분석 기능은 PowerTrace II에서 활용할 수 있는 확장기능으로, TRACE32 제품군의 타이밍 분석 솔루션인 PowerProbe와 PowerIntegrator 기능의 일부를 지원합니다. IProbe 자체로는 단순한 타이밍 캡쳐기능이지만, PowerTrace의 ETM trace기능과 같이 활용하여, 특정 코드에서 외부로 특정 신호를 출력했는지 분석 등 코드와 시그널을 통합하여 디버깅에 활용할 수 있는 수단을 제공합니다.
IProbe를 통해 생성되는 데이터가 저장되는 공간은 코드 커버리지 정보를 저장하는 공간을 공유합니다. 때문에, 코드 커버리지와 타이밍 분석 기능은 동시에 사용될 수 없으며 어느 한 쪽을 비활성화 한 상태에서 사용되어야 합니다.
IProbe는 17비트 디지털 데이터 trace기능과(Standard Probe), 7*12비트 아날로그 입력신호의 trace기능을 제공합니다(Analog Probe). 타이밍 혹은 아날로그 trace중 어떤 기능이 필요한지에 따라, 이에 맞는 probe가 PowerTrace의 Logic Analyzer Probe에 연결되어야 합니다. 연결되는 Probe에 따라, IProbe는 이에 맞는 기능으로 설정됩니다. 간략히 정리한 IProbe의 기능은 아래와 같습니다.
Trace |
Standard Probe |
최대 17채널의 타이밍 분석. 채널 당 200MHz 샘플레이트 |
Analog Probe |
4전압, 3전류 채널에 대한 아날로그 신호 trace. 최대 625 kSPS의 3파워 채널로도 사용 가능 |
|
Transient Recording |
Standard Probe |
입력 채널의 신호 중 한 채널이라도 신호의 레벨이 바뀔 경우, 입력 채널의 데이터는 trace 버퍼에 저장된다. 레코딩할 수 있는 시간은 신호 레벨의 변화가 몇 번이나 발생했는가에 따라 달라진다. 가령 레벨 변화가 ms당 한 번씩 변화한다면 512/1024초 동안 레코딩 된다. 200MHz 정도의 고속으로 동작하는 신호를 저장하는 경우, 2.5/5ms정도가 저장된다. |
Analog Probe |
Trace는 ADC, 사용된 채널의 수, 그리고 ADC에 의해 생성된 결과에 따라 trace를 시작하게 됩니다.(확실하지 않음) |
|
Simple Triggering |
Standard Probe |
단순한 트리거 유닛이 신호의 레벨과 엣지를 감지하여 생성되는 트리거링 카운터와 이벤트에 따라 레코딩을 중지할 수 있습니다. |
Analog Probe |
지원하지 않음 |
Standard Probe - Timing Probe
Standard Probe는 최대 200MHz로 움직이는 디지털 신호를 측정할 수 있는 Logic Analyzer기능입니다. 여기에 사용되는 Probe와 핀맵, 그리고 보드와의 연결은 아래와 같습니다.
Standard Probe가 연결된 경우, PowerView는 이를 감지하여 상단의 메뉴 리스트에 Probe라는 메뉴를 추가합니다.
맨 위의 Configuration IProbe는 IProbe의 상태를 확인하고 여러 옵션을 설정하는 기본 창을 열어줍니다.
여러 옵션 중 Timing은 Logic Analyzer와 유사한 타이밍 차트를 보여주는 기능입니다. Standard Probe를 이용할 때는 별 다른 설정없이 위 사진처럼 신호선만 연결해 주면 이에 대한 결과를 출력해 줍니다.
Advanced항목에서는 각 신호 별로 간단한 트리거링 이벤트를 설정해줄 수 있습니다.
아래는 IProbe의 0번 채널에 FALLING 트리거를 설정한 화면입니다 타겟은 계속 동작하고 있지만, 조건에 따라 0번 채널에 falling신호가 들어오면, IProbe의 프루빙은 정지합니다.
Analog Probe - Voltage and Current Probe
Standrad Probe가 Logic Analyzer기능을 수행했다면, Analog Probe는 Oscilloscope 기능을 수행합니다. Analog Probe가 연결된 경우 IProbe메뉴는 아래와 같습니다. Standard Probe가 연결되었을 경우와 다르게, Analog Settings 항목에 활성화된 것을 볼 수 있습니다.
Analog Probe의 연결은 Standard Probe와 동일하며, 핀맵은 아래와 같습니다.
Configuration IProbe의 경우, Standard Probe와 다르게 Timing대신 DRAW항목이 있는 것을 확인할 수 있습니다.
Analog Probe의 기능을 이용하기 위해서는 먼저 Analog Settings...항목에서 어떤 채널을 이용할 것인지 설정해 주어야 합니다. Analog Settings...항목에서는 각 신호 별로 다른 설정을 할 수 있습니다.
Analog Prorbe를 열어보면 전압 4, 전류 3, 파워 3채널 씩을 사용할 수 있다는 것을 알 수 있습니다.
Analog Probe창입니다. 현재 전압 측정을 위해 3채널을 사용하고 있습니다.
List는 사용자가 선택한 채널 별로 각 레코드마다 신호의 값을 보여주며, DRAW는 오실로스코프와 같은 결과를 출력해줍니다.
앞서 선택한 3채널에 대한 DRAW창입니다. 앞서 정리된 것처럼 Analog Probe를 이용하는 경우, 특정 이벤트에 대한 트리거링은 지원하지 않습니다.
이처럼 IProbe-Standard Probe, Analog Probe를 이용해 ETM에서 출력하는 타겟에서 동작하는 프로그램의 흐름과 읽고 쓰는 데이터 값과 그 주소와 더불어 디지털 / 아날로그 신호의 동작까지 전반적인 trace를 받아, 특정 코드에 의한 디지털 / 아날로그 신호의 상태 변화를 살펴보고 이를 타겟 디버깅에 적용할 수 있습니다.
Cortex-M 기반의 MCU에서 CombiProbe를 활용한 1핀 트레이스 오류시 확인해 볼 사항
배경지식 및 문제발생
Cortex-M 기반의 uTrace/CombiProbe는
“TPIU(Trace Port Interface Unit)-TRACEDATA[3:0], Trace Clock”핀을 이용한 4비트 트레이스와
“SWV(Serial Wire Viewer)-SWO(Serial Wire Output)”를 이용한 1비트 트레이스를 사용할 수 있습니다.
< Cortex-M CoreSight Component & Trace Methods >
Cortex-M기반의 MCU로 개발하는 고객사에서, 처음에는 SWO를 활용한 1핀 트레이스를 별 문제 없이 잘 사용해 왔습니다. 하지만, 성능 향상을 위해 시스템 클럭을 최대값인180MHz로 설정한 이후, 이전까지는 잘 동작하던 1비트 트레이스가 제대로 동작하지 않게 되었습니다. 관련 문제를 해결한 과정에서 알게된 사항입니다.
(SWO를 사용한 1핀 트레이스는 “NRZ(Non-Return-to-Zero)” 혹은 “Manchester 인코딩” 방식을 사용합니다.)
결론
uTrace/CombiProbe 사용시, 아래와 같은 순서로 적정한 1핀 트레이스의 데이터 속도를 결정할 수 있습니다.
① ITM.PortSize를 SWV로, ITM.PortMode를 NRZ/4로 설정합니다.
② “CAnalyzer.AutoFocus” 명령을 실행하여, 자동으로 SWV를 통한 데이터 전송속도를 설정합니다.
③ “NRZ/4 à NRZ/2 à NRZ”로 바꾸어 가면서 “CAnalyzer.AutoFocus”를 실행하여, AREA창에 출력되는 “SWV Rate”를 확인합니다. 가능한 40Mbps 이하의 범위에서(혹은 1핀 트레이스로 받은 데이터에 에러가 나지 않는 범위 안에서) NRZ에 가까운 “ITM.PortMode”값을 설정합니다.
< “NRZ/4 --> NRZ/2 --> NRZ”로 변경하면서 CAnalyzer.AutoFocus 테스트 한 결과 >
④ 만약 ITM.PortMode에 의해 설정된 SWV Rate가 너무 낮다면 아래와 같이 OVERFLOW가 발생하게 됩니다.
그럴 때에는 ITM.PortMode를 NRZ에 가까운 값으로 변경하여 SWV Rate를 올리거나, PCSampler의 샘플링 주기를 낮추는 등의 방법으로 ITM에서 생성되는 데이터 양을 줄이는 방법이 있습니다.
< “ITM.PortMode NRZ/4”, “ITM.PCSampler 1/64”로 설정한 경우의 에러 화면 >
⑤ 만약, “NRZ/4 à CAnalyzer.AutoFocus”로 테스트 했을 때, AREA창에 출력되는 SWV Rate가 이미 40Mbps 이상이라면, 2015년 1월 (Build 59689.) 이후의 PowerView를 사용하시는 것을 권장합니다.
“TPIU.SWVPrescaler” 명령을 통해 “NRZ/4” 이상의 분주가 가능해졌습니다.
문제사항 1
아래는 Cortex-M 기반 MCU의 매뉴얼에서 발췌한 클럭 분배도 입니다.
고객사는 SYSCLK로 최대값인 180MHz를 사용하고 있으며, 이것을 활용하여 AHB(Advanced High-performance Bus), APB(Advanced Peripheral Bus) 등으로 공급되는 클럭 소스를 만들게 됩니다.
처음에는 이 AHB 혹은 APB 클럭의 속도를 낮추는 방법을 생각해 보았으나, 이것은 MCU와 연결된 각종 주변장치의 동작에 영향을 미칠 수 있으므로, 사용할 수 없는 방법입니다.
문제사항 2
MCU매뉴얼의 TPIU 관련 부분을 살펴보면, 아래와 같이 HCLK가 그대로 TPIU의 클럭 소스인 “TRACECLKIN” 으로 연결되어, 앞의 경우 “TRACECLKIN = HCLK = 180MHz”의 관계가 성립됩니다.
여기서 문제의 소지가 될 수 있는 것이,
① uTrace/CombiProbe의 SWO는 이론적으로 50Mbps의 데이터 전송이 가능하지만, 보드설계에 따라 그 이하의 속도에서만 안정적으로 데이터를 전송할 수도 있습니다.
② 2014년 9월 DVD기준으로, PowerView는 최대 NRZ/4 까지만 지원하므로, 위와 같이 180MHz의 시스템 클럭을 사용하는 경우, SWO는 45Mbps로 동작하게 됩니다
③ 시스템 클럭을 180MHz로 올린 경우, 결과적으로 SWO를 통한 데이터 전송속도가 이론적 최대값인 50Mbps에 근접하게 되어, SWO를 통해 받은 데이터 값에 오류가 발생하게 되었습니다.
해결방안
Cortex-M 매뉴얼을 보면, TPIU_ACPR(TPIU Asynchronous Clock Prescaler Register)을 통해 SWO로 출력되는 데이터의 속도(baud rate)를 분주 할 수 있습니다.
그리고, 이 TPIU_ACPR값은 “ITM.PortMode” 의 설정에 따라 변하게 됩니다.
< ITM.PortMode를 NRZ --> NRZ/2 --> NRZ/4 로 변경할 때 TPIU_ACPR 값의 변화 >
하지만, ARM은 TPIU_ACPR을 0x0 ~ 0xFFFF 범위의 값으로 설정할 수 있도록 해 준데 반해, (2014년 9월 DVD 기준으로) PowerView에는 TPIU_ACPR을 최대 0x3(NRZ/4)으로만 설정할 수 있도록 되어 있습니다.
이럴 경우, 앞에서 말한 바와 같이 NRZ의 최대 분주 값인 “ITM.PortMode NRZ/4”로 설정해도, SWO를 통한 데이터 전송 량이 45Mbps로 설정되어 제대로 된 데이터를 받을 수 없었습니다.
Lauterbach를 통해 제공받은 2015년 1월 (Build 59689.) 이후의 PowerView에서는, “TPIU.SWVPrescaler” 명령을 통해 “NRZ/4” 이상의 분주가 가능해져, 높은 주파수의 시스템클럭을 사용하는 Cortex-M MCU에서도 문제없이 1핀 트레이스를 받을 수 있게 되었습니다.
< 2014년 9월 PowerView의 TPIU창 > <2015년 1월 S/W patch의 TPIU창 >