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를 워크스페이스에 복사합니다.
파일은 읽기 전용 속성일 수 있습니다. 윈도우즈 속성 설정에서 해당 속성을 제거합니다. 또한 파일을 IAR Embedded Workbench for ARM 워크스페이스에 추가합니다.
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>
C-RUN과 함께 debug 실행
디버그 세션을 시작하기 전에, 탐지하려는 특정 C-RUN 옵션을 활성화했는지 확인합니다. Rebuild All을 선택한 다음 Download and Debug을 클릭, View > Terminal I/O windows를 연다음 Go를 클릭합니다.
C-RUN이 에러 메시지를 감지한다면, Terminal I/O로 보냅니다.
이제 터미널 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 파일을 입력하거나 선택합니다.
그런 다음 .out 파일 경로를 추가합니다.
이 예에서는 경로를 단순화하기 위해 설정 폴더에 c.out 파일을 복사했지만 절대 경로를 지정할 수도 있습니다. 그런 다음 Enter를 누릅니다.
이제 cspybat가 C-RUN Raw data 메시지를 기다리는 중입니다.
원시 데이터(raw data) 메시지를 구문 분석
터미널 I/O에서 받은 메시지를 붙여 넣습니다. 메시지는 한 줄로 보내야 한다는 것을 기억하십시오.
Enter 키를 누르면 다음과 같이 구문 분석된 메시지가 표시됩니다.
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 함수를 호출해 보겠습니다.
ser_printf()는 다른 위치에 정의되어 있습니다. C-RUN이 메시지를 전송하기 전에 UART를 설정해야 합니다.
또한 C-RUN 메시지를 SPI, I2C 또는 RAM 또는 플래시 메모리의 저장소로 리디렉션하도록 수정할 수도 있습니다.
프로젝트를 실행하고 터미널 애플리케이션으로 대체
Tera Teram과 같은 터미널 응용 프로그램을 연 다음 다운로드 및 디버그를 수행하십시오.
C-RUN 오류 메시지가 Tera Teram에 표시됩니다. 첫 번째 'A'는 일반 애플리케이션 코드에서 전송되었습니다.
stand-alone 모드에서 보드 실행
전원을 차단하고 보드에서 ICE를 제거한 다음 보드를 켭니다. 터미널 응용 프로그램에 C-RUN 메시지가 표시됩니다.
이제 ICE 없이 현장 테스트에서 C-RUN 탐지 메시지를 수집할 수 있습니다. 물론 탐지된 메시지는 전처리로써 cspybat.exe에 의해 구문분석됩니다.
참고: Bat 파일을 생성할 때는 Debugger > Download > Use flash loader(s) 사용 확인란의 선택을 취소해야 합니다. 선택을 해제하고 작업 공간을 닫기만 하면 bat 파일이 업데이트됩니다.
결론
C-RUN은 매우 편리하고 유용한 런타임 분석 추가 기능입니다. 이 문서에 설명된 기술을 사용하여 현장 테스트에서도 C-RUN을 적용할 수 있습니다.