stand-alone 모드에서 C-RUN Runtime 분석

C-RUN은 IAR Embedded Workbench for ARM의 애드온으로 동작하는 런타임 분석 툴입니다. C-RUN은 오버플로(overflow), 경계 에러 및 메모리 사용 에러 등 발생할 수 있는 오류 등을 감지할 수 있습니다.

에러 메시지는 디버그 창에 표시됩니다. 하지만, C-RUN 메시지는 모든 통신 채널로 보내질(redirected) 수 있으며, 또한 현장 테스트(field test)에서 캡처할 수 있고, 테스트 후 검사할 수 있습니다.

Terminal I/O로 C-RUN 메시지 리다이렉트

C-RUN 메시지는 숨겨진 프로세스인 세미 호스팅(semi-hosting)을 통해 PC로 전송됩니다. C-RUN 메시지의 소스 코드는 <EWARM>\arm\src\lib\crun 에서 제공합니다. C-RUN을 stand-alone으로 동작시키기 전에 터미널 I/O의 메시지를 살펴보겠습니다.

워크스페이스에 ReportCheckFailedStdout.c 추가하기

\crun 하위에 있는 ReportCheckFailedStdout.c를 워크스페이스에 복사합니다.

ReportCheckFailedStdout.c file

파일은 읽기 전용 속성일 수 있습니다. 윈도우즈 속성 설정에서 해당 속성을 제거합니다. 또한 파일을 IAR Embedded Workbench for ARM 워크스페이스에 추가합니다.

Add the source file to IAR Embedded Workbench

C-RUN 메시지 stdout 리다이렉트

링커 설정을 변경하여 C-RUN 에러 메시지를 리다이렉트 합니다. 기본으로 __iar_ReportCheckFailedis 가 호출됩니다. ReportCheckFailedStdout.c 에 정의되어 있는 __iar_ReportCheckFailedStdout 로 리다이렉션을 지정합니다.

__interwork void __iar_ReportCheckFailedStdout(void * d)
{

   char buf[200] = {0};
char *b = buf;

  uint32_t const *data = (uint32_t const *)d;
int nr = data[0] >> 24;

  b = putstring(b, "CRUN_ERROR:");
for (int i = 0; i < nr; ++i)
{
    *b++ = ' ';
    b = puthex(b, data[i]); 
  }
  *b++ = '\n';
  __write(_LLIO_STDOUT, (unsigned char const *)buf, (size_t)(b - buf));
  if (__iar_ReportCheckFailedStdoutAbort)
    abort();
}
 

프로젝트 옵션([Project Option])에서 Linker > Extra Options을 설정합니다. --redirect __iar_ReportCheckFailed=__iar_ReportCheckFailedStdout> 

Redirect settings for Runtine Analysis

C-RUN과 함께 debug 실행

디버그 세션을 시작하기 전에, 탐지하려는 특정 C-RUN 옵션을 활성화했는지 확인합니다. Rebuild All을 선택한 다음 Download and Debug을 클릭, View > Terminal I/O windows를 연다음 Go를 클릭합니다.

C-RUN이 에러 메시지를 감지한다면, Terminal I/O로 보냅니다.

Output Terminal IO

이제 터미널 I/O 창에서 메시지당 한 라인을 표시하는 C-RUN 메시지를 볼 수 있습니다. 메시지는 raw 데이터이고 cspybat.exe가 메시지를 표시합니다.

cspybat.exe로 C-RUN raw data 구문분석하기

cspybat.exe는 디버그 배치 테스트(debug batch test)에 사용되는 도구입니다. 또한 C-RUN raw 데이터 분석기(parser)로도 사용할 수 있습니다.

bat 파일 수정

프로젝트가 빌드될 때마다 ***.cspy.bat 파일이 프로젝트의 설정 폴더에 생성됩니다. 편집기 프로그램을 사용하여 파일을 엽니다. --rtc_enable 뒤에 -–rtc_filter를 추가하고 파일을 저장합니다.

명령 프롬프트에서 bat 파일 시작

명령 프롬프트를 열고 설정 폴더로 이동합니다. TAB 키를 사용하여 bat 파일을 입력하거나 선택합니다.

cspybat command line

그런 다음 .out 파일 경로를 추가합니다.

CSPYBAT syntax

이 예에서는 경로를 단순화하기 위해 설정 폴더에 c.out 파일을 복사했지만 절대 경로를 지정할 수도 있습니다. 그런 다음 Enter를 누릅니다.

CSPYBAT output in command line

이제 cspybat가 C-RUN Raw data 메시지를 기다리는 중입니다.

원시 데이터(raw data) 메시지를 구문 분석

터미널 I/O에서 받은 메시지를 붙여 넣습니다. 메시지는 한 줄로 보내야 한다는 것을 기억하십시오.

CSPYBAT error on command line

Enter 키를 누르면 다음과 같이 구문 분석된 메시지가 표시됩니다.

CSPYBAT parsing in the command line

main.c의 16번 라인에서 "Integer conversion failed" 에러를 볼 수 있습니다. 일반적인 C-RUN 메시지 창과 비슷한 정보를 확인할 수 있습니다.

참고: 콜 스택은 CRUN 원시 데이터에 포함되지 않습니다.

C-RUN 메시지를 UART로 리다이렉션

C-RUN 메시지는 다른 통신 채널로도 리디렉션될 수 있습니다. _iar_ReportCheckFailedStdout() 을 편집합니다.

_iar_ReportCheckFailedStdout() 수정

IAR Embedded Workbench for ARM에서 ReportCheckFailedStdout.c를 엽니다.

__interwork void __iar_ReportCheckFailedStdout(void * d)
{
  char buf[200] = {0};
  char *b = buf;  

  uint32_t const *data = (uint32_t const *)d;
  int nr = data[0] >> 24; 

  b = putstring(b, "CRUN_ERROR:");
  for (int i = 0; i < nr; ++i)
  {
    *b++ = ' ';
    b = puthex(b, data[i]); 
  }
  *b++ = '\n';
  __write(_LLIO_STDOUT, (unsigned char const *)buf, (size_t)(b - buf));   


  if (__iar_ReportCheckFailedStdoutAbort)
    abort();
}
 

buf 에는 C-RUN 메시지가 포함되어 있습니다. __write 함수로 전송합니다. 이제 __write를 주석처리 하고 serial send 함수를 호출해 보겠습니다.

Serial send function

ser_printf()는 다른 위치에 정의되어 있습니다. C-RUN이 메시지를 전송하기 전에 UART를 설정해야 합니다.

또한 C-RUN 메시지를 SPI, I2C 또는 RAM 또는 플래시 메모리의 저장소로 리디렉션하도록 수정할 수도 있습니다.

프로젝트를 실행하고 터미널 애플리케이션으로 대체

Tera Teram과 같은 터미널 응용 프로그램을 연 다음 다운로드 및 디버그를 수행하십시오.

Tera Term output

C-RUN 오류 메시지가 Tera Teram에 표시됩니다. 첫 번째 'A'는 일반 애플리케이션 코드에서 전송되었습니다.

stand-alone 모드에서 보드 실행

전원을 차단하고 보드에서 ICE를 제거한 다음 보드를 켭니다. 터미널 응용 프로그램에 C-RUN 메시지가 표시됩니다.

Tera Term output 2

이제 ICE 없이 현장 테스트에서 C-RUN 탐지 메시지를 수집할 수 있습니다. 물론 탐지된 메시지는 전처리로써 cspybat.exe에 의해 구문분석됩니다.

 

CSPYBAT parsed results full

참고: Bat 파일을 생성할 때는 Debugger > Download > Use flash loader(s) 사용 확인란의 선택을 취소해야 합니다. 선택을 해제하고 작업 공간을 닫기만 하면 bat 파일이 업데이트됩니다.

결론

C-RUN은 매우 편리하고 유용한 런타임 분석 추가 기능입니다. 이 문서에 설명된 기술을 사용하여 현장 테스트에서도 C-RUN을 적용할 수 있습니다.

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