디버깅

Arm Cortex-M3 및 -M4 애플리케이션에서 버그 찾기

<span id="hs_cos_wrapper_name" class="hs_cos_wrapper hs_cos_wrapper_meta_field hs_cos_wrapper_type_text" style="" data-hs-cos-general-type="meta_field" data-hs-cos-type="text" >Arm Cortex-M3 및 -M4 애플리케이션에서 버그 찾기</span>

Arm Cortex-M3 및 -M4 애플리케이션에서 찾기 어려운 버그를 찾는 방법

디버깅은 항상 개발에서 큰 부분을 차지하며 오늘날 대부분의 개발자는 기본적인 디버깅 작업에 충분한 JTAG/SWD 디버그 프로브에 액세스할 수 있습니다. 그러나 비교적 저렴한 추적 프로브를 사용하면 개발자가 애플리케이션이 무엇을 하고 있는지 더 많이 이해할 수 있고, 어려운 상황을 훨씬 쉽게 디버깅할 수 있습니다.

Arm Cortex-M3 또는 -M4 코어 기반 디바이스로 작업하기로 선택한 경우 유용한 온칩 디버그 로직을 통해 많은 이점을 얻을 수 있으며, 이 로직을 유능한 디버거와 함께 사용하면 애플리케이션의 동작을 다양한 각도에서 조사할 수 있습니다.

디버그 아키텍처는 그림 1에 설명된 대로 다섯 가지 주요 단위로 구성됩니다. 임베디드 트레이스 매크로셀(ETM)과 같은 일부는 선택 사항이므로 디바이스에 어떤 기능이 구현되었는지 확인해야 할 수 있습니다.

how-to-find-hard-to-find_figure1.png

그림 1. ARM Cortex-M3 및 M4 디바이스의 디버그 아키텍처

SWO 추적

계측 추적 매크로셀(ITM)은 저속 액세스 포트를 통해 선택된 추적 데이터를 제공하는 경량 추적입니다. 계측 추적은 모든 개발자가 책상에 구비해야 하는 저비용 프로브인 I-jet과 같은 디버그 프로브를 사용하여 사용할 수 있습니다. ITM은 소프트웨어가 SWO를 통해 디버거에 배포할 패킷을 생성하는 데 사용할 수 있는 소프트웨어 추적을 위한 32개 채널을 제공합니다. 메시지나 데이터를 출력하기 위해 코어를 멈출 필요가 없으므로 오버헤드가 거의 없는 코드 계측에 사용할 수 있습니다. 32개의 ITM 자극 레지스터 중 하나에 한 번의 쓰기 작업만 수행하면 됩니다. 반면에 모든 명령어를 추적하는 것은 아닙니다.

ITM은 또 다른 장치인 데이터 감시점 및 추적(DWT)에서 트리거된 추적 이벤트도 처리합니다. DWT는 시스템 버스에서 정보를 수집하고 패킷화 및 타임스탬핑을 위해 ITM에 이벤트를 생성하고 SWO 채널에 추가 배포하는 일련의 기능을 제공합니다.

DWT에는 주소 일치 또는 데이터 일치에 대한 이벤트를 생성할 수 있는 4개의 독립적인 비교기 또는 감시점이 있습니다. ETM 트리거, ITM 패킷 트리거, 특정 조건에서 코드 중단 등 다양한 용도로 사용할 수 있습니다. 4개의 감시점 중 하나를 설정하여 ETM을 트리거하면 지정된 주소에서 추적 데이터 수집을 시작하고 중지하는 단순한 추적 시작 및 중지 중단점뿐만 아니라 변수가 특정 값에 도달할 때를 기준으로 하는 복잡한 추적 시작 및 중지 조건도 설정할 수 있으므로 장시간 실행되는 애플리케이션을 디버깅할 때 유용합니다.

DWT는 또한 인터럽트 추적 기능과 프로그램 카운터 레지스터를 일정한 간격으로 샘플링하는 PC 샘플러를 제공합니다. 샘플링은 실행되는 대부분의 명령어를 놓칠 수 있으므로 애플리케이션의 행방을 완전히 파악할 수는 없지만 애플리케이션이 어떤 함수에서 시간을 소비했는지에 대한 정보는 제공할 수 있습니다.

임베디드 추적 매크로셀

ITM과 DWT는 매우 유용하며 대부분의 임베디드 프로젝트에 충분할 수 있지만 때로는 가장 어려운 문제를 해결하기 위해 훨씬 더 강력한 디버그 모드가 필요할 수 있습니다. 실행된 모든 명령어를 추적하는 임베디드 트레이스 매크로셀(ETM)은 마이크로컨트롤러의 활동에 대한 탁월한 통찰력을 제공하며 다른 방법으로는 찾기 어렵거나 심지어 불가능한 버그를 찾을 수 있게 해줍니다.

ETM을 사용하려면 명령어를 메모리에 저장할 수 있는 특수 추적 디버그 프로브가 필요합니다. 물론 저장할 수 있는 명령어 또는 샘플의 수는 해당 메모리의 크기에 따라 제한됩니다. IAR Systems의 트레이스 프로브인 Arm Cortex-M용 I-jet Trace는 한 번에 4비트씩 트레이스 데이터를 읽는데, 이를 샘플이라고 합니다. 4비트는 Arm Cortex-M 디바이스의 표준 트레이스 폭입니다. I-jet Trace는 최대 32메가샘플의 대용량 트레이스 메모리 용량을 제공하지만 ETM 프로토콜이 압축되어 있기 때문에 샘플 수와 명령어 수가 일대일로 매핑되지 않습니다. 샘플당 최대 명령어 수는 완전히 선형적인 실행(코드에 점프나 브랜치가 없는 경우)에서 발생하며 7.5개입니다. 평균은 4비트 샘플당 약 2개의 명령어입니다.

DWT 및 ITM에서 제공하는 이벤트 추적과 달리 ETM은 애플리케이션이 인터럽트를 받기 전에 무엇을 하고 있었는지, ISR이 실행되는 동안 무엇을 하고 있는지, 인터럽트를 벗어난 후 어떤 일이 발생하는지 알려줍니다. 애플리케이션이 어디에 있었고 어떻게 그곳에 도달했는지 정확히 알려줍니다. 즉, 방해하지 않고 실시간으로 애플리케이션 동작에 대한 완전한 인사이트를 얻을 수 있습니다.

디버깅 상황에서 추적 데이터를 사용하는 가장 확실한 방법은 예를 들어 실행이 잘못된 프로그램을 추적할 때 시간을 거꾸로 거슬러 올라가는 것입니다. 프로그램이 일탈한 후 실행을 중지하고 추적 출력을 검사하여 어디에서 문제가 발생했는지 확인할 수 있습니다.

how-to-find-hard-to-find_figure2.jpg

그림 2: IAR 임베디드 워크벤치의 ETM 추적 출력에서 검색하기

트레이스를 사용하는 가장 간단한 방법인 실행을 되돌아가서 검사하는 것 외에도 ETM 트레이스를 사용하면 다른 유용한 기능을 사용할 수 있습니다. 코드 커버리지 분석은 코드의 어떤 부분이 실행되었고 어떤 부분이 실행되지 않았는지에 대한 정보를 제공합니다. 이 정보를 통해 코드의 모든 부분이 테스트되었는지 확인할 수 있으므로 테스트 중에 매우 유용합니다. 함수 프로파일링은 각 함수에 소요되는 시간을 보여 주므로 코드 최적화 및 개선에 가장 많은 노력을 기울여야 할 위치를 결정하는 데 도움이 됩니다. 샘플링된 SWO 추적을 사용하는 함수 프로파일링도 유용할 수 있지만 ETM 추적에서 제공되는 전체 추적 데이터 대신 통계적 프로파일을 기반으로 합니다.

위에서 언급한 모든 기능은 IAR 임베디드 워크벤치에서 사용할 수 있으며, I-젯 트레이스와 같은 ETM 트레이스가 탑재된 트레이스 프로브를 사용하여 활성화할 수 있습니다.