C-SPY 매크로를 사용한 디버깅 입문

IAR Embedded Workbench의 디버거인 C-SPY는 종합 매크로시스템을 포함하여 디버깅 프로세스를 자동화할 수 있도록 해 주며, 주변 기기의 시뮬레이션 기능도 보유하고 있습니다. 매크로는 복합적인 구조의 브레이크포인트와 함께 사용이 가능하며, 시뮬레이션을 간섭시켜 다양한 과업을 수행할 수 있습니다. 예를 들어, 대상 메모리 또는 호스트 컴퓨터의 파일로부터 읽기/쓰기가 가능합니다. 또한 리셋 기능, 문자열 조작, JTAG 명령어 지원 등의 기능이 있습니다.

이번 순서에서는 매크로의 기본에 대해 알아보고, 이어서 매크로를 사용하는 방법에 대한 예시를 소개드리도록 하겠습니다.  

C-SPY 매크로 언어 문법 

매크로 언어의 문법은 사실 언어와 매우 비슷합니다. 여기에 포함되는 요소를 소개하면 다음과 같습니다.  

  • C 언어 선언 문법과 비슷한 매크로 선언문 
  • 파라미터 및 리턴값 정의가 가능한 매크로 함수 
  • 사전 지정 빌트인 시스템 매크로. 라이브러리 함수와 비슷하며, 파일 열고 닫기, 브레이크포인트 설정, 시뮬레이션 중지 설정 등의 유용한 기능을 지원합니다. 
  • 매크로 변수 기능. 매크로 변수는 글로벌 및 로컬 변수를 포함하며, C-SPY 표현형 내에서 사용이 가능합니다.  
  • 매크로 문자열. 시전 지정된 시스템 매크로를 사용하여 조작이 가능한 문자열입니다. 

 

매크로 사용 

C-SPY 매크로는 특정한 시간에 호출이 가능하며, 수동으로 실행하거나 브레이크포인트를 통해 실행시키

셋업 매크로 

셋업 매크로(setup macro)는 미리 명칭이 지정되어 있는 매크로로, 대상이 리셋되는 시점 등 디버깅 과정 중 정해진 단계에서 호출됩니다. 이와 같은 매크로는 디버깅에서 다음 단계로 넘어가기에 앞서, 어플리케이션 소프트웨어 다운로드 전 메모리 중 특정 구역을 비우거나 채우는 등 디바이스를 준비시키기 위해 사용될 수가 있습니다. 

이러한 기능이 유용하게 사용되는 예 중의 하나가 바로 아직 부팅 프로세스가 개발되어 있지 않은 시스템임에도 불구하고, 어플리케이션이 적절히 작동하도록 하기 위해서는 특정한 위치에 특정한 데이터가 위치해야 하는 경우입니다. 개발자가 부트 어플리케이션을 기다리지 않고도, 어플리케이션이 로드되기 전 매크로를 통해 파일 등으로부터 메모리 내용을 로드하는 방식으로 시험 대상 코드를 수정하지 않고 어플리케이션 테스트를 계속 진행할 수 있습니다.   

매크로의 실행 

매크로는 수동으로, 또는 브레이크포인트를 통해 다른 때에도 실행할 수가 있습니다. 이러한 브레이크포인트는 해당 매크로를 실행하는 조건을 기준으로 하여 다른 매크로에 의해서 설정될 수도 있습니다. 이것은 이벤트 기반으로 작동하는 시스템에서 네스팅 된 일련의 이벤트를 디버깅하고 싶지만, 해당 상황이 발생할 때까지 시스템이 계속 작동하도록 하는 방식으로 진행할 시 매우 유용한 기능입니다. 예를 들어, 시스템이 간섭되도록 하는 타이머를 두 개 설정한다고 합시다. 하나는 10초, 그리고 나머지 하나는 0.1초에 가동합니다. 만일에 느리게 발동하는 이벤트가 두 번 발동한 뒤 먼저 발생하는 이벤트가 최초로 발동할 시에 어떠한 반응이 일어나는지를 확인하고자 한다면, 브레이크포인트를 느리게 발동하는 이벤트에 삽입합니다. 이러한 브레이크포인트는 매크로를 호출하여, 이번이 두 번째로 호출된 것인지의 여부를 확인합니다. 만일에 여기에 해당되는 경우, 빠른 이벤트에 브레이크포인트를 설정합니다. 

아래는 이와 같은 매크로의 풀이 중 하나를 예로 든 것입니다. 여기서는 카운터를 매크로 변수로 활용하며, 느린 타이머가 실행될 때마다 그 수가 증가합니다. 카운터의 값이 2에 이르면, 매크로는 더 빠른 타이머 간섭 핸들러의 시작 부분에 브레이크포인트를 설정합니다:

SetBreakpoint(){
    if (SlowInterruptCount++ == 2)
    {
       brk = __setCodeBreak("Fast_Interrupt_Handler", 0, "1", "TRUE", "");
       
    }
}

매크로 사용법 예시 

디버거 세션 상의 C-SPY 매크로를 사용하기에 앞서 먼저 해당 매크로를 등록하지 않으면 안 됩니다. 가장 쉬운 방법은 디버거 프로젝트 옵션을 통해 C-SPY 매크로의 정의가 기록되어 있는 텍스트 파일을 추가하는 것입니다:

option_debugger

다음의 설정 매크로 함수는 디버거를 기동하면   실행되며디버그 로그 창에 메시지를 기록하게 됩니다 다음 MySetupMacro 호출하여다음과 같은 내용을  파일을 엽니다:

execUserSetup(){/* Write a message to the debug log  */
__message "Debugger started\n";
 
MySetupMacro();
 
/* Opens a text file for ASCII writing */
_fileHandle = __openFile("$PROJ_DIR$\\Memory.txt", "w");
}

뿐만 아니라, 이러한 셋업 매크로를 활용하여 어플리케이션이 로드되기에 앞서 일부 하드웨어 초기화 작업도 수행하는 것이 가능합니다. 대상을 리셋할 때에(execUserExit), 실행을 시작했거나 멈추었을 때(execUserStarted/Stopped), 또는 디버그 세션을 중단했을 때(execUserExit) 실행되는 유사한 셋업 매크로도 존재합니다. 

C-SPY 매크로는 Macro Quicklaunch 창에서 수동으로 호출하거나, 브레이크포인트에 연결할 수도 있습니다. 예를 들어서 특정 브레이크포인트에 도달하면 메모리 내용을 파일로 덤프 하고자 하는 경우:

WriteMemory2File()
{
   __var byte,address,_fileHandle;
 
   _fileHandle = __openFile("$PROJ_DIR$\\Memory.txt", "w"); 
    
  for (address=0x20000000;address< 0x2000FFFF;address++)
  {
        byte=__readMemoryByte(address,"Memory");
        __writeFile( _fileHandle, byte );
  }
   __closeFile( _fileHandle );

}

 매크로를 코드 브레이크포인트 상에 동작 표현형(action expression)으로 추가하는 것도 가능합니다:

edit_breakpoint

브레이크포인트에서 대상이 정지하지 않고, 메모리 덤프 후 즉각 실행을 계속하는 것을 희망하시는 경우에는 C-SPY 매크로를 Action이 아닌 Condition으로 호출하시면 됩니다. 

마지막으로 C-SPY 디버거가 작동하는 동안에 IAR Embedded Workbench에서가 아니라 커맨드라인에서 메모리 덤프를 하고 싶을 경우도 있을 수 있습니다(CSPYBAT). 그렇다면 이럴 때에 브레이크포인트의 설정 및 편집은 어떻게 해야 할까요? 이것은 전혀 문제가 될 일이 없습니다. C-SPY 역시 브레이크포인트를 설정하기 위한 시스템 매크로를 제공하기 때문입니다:

execUserSetup(){
...
/* __setCodeBreak(location, count, condition, cond_type, action) */
  __setCodeBreak("{myfile.c}.82.1",0,"WriteMemory2File()","TRUE","");
           ...
}

결론  

대상 하드웨어에 연결되었거나 또는 임베디드 프로젝트를 시뮬레이션 하는 경우를 가리지 않고 C-SPY 매크로는 매우 유용한 기능을 제공하며, 디버깅 세션을 커스터마이징 할 수 있는, 매우 유연한 방식입니다. 이를 활용할 수 있는 시나리오로는 디버깅을 위해 하드웨어를 준비하는 경우, 디버깅 작업을 수행 중이거나, 주변기기 또는 간섭을 시뮬레이션 하는 상황에서 다양한 정보를 모으고자 하는 경우 등이 있을 수가 있습니다. C-SPY 디버깅 가이드에서는 IAR Embedded Workbench 내에서 활용이 가능한 전체 매크로를 소개하고 있습니다. 

죄송하지만, 당사 사이트에서는 Internet Explorer를 지원하지 않습니다.보다 편안한 사이트를 위해 Chrome, Edge, Firefox 등과 같은 최신 브라우저를 사용해 주시길 부탁드립니다.