
독립 실행형 모드에서의 C-RUN 런타임 분석
C-RUN은 ARM용 IAR 임베디드 워크벤치의 애드온으로 작동하는 런타임 분석 툴입니다. C-RUN은 오버플로, 경계 오류 및 메모리 사용 오류와 같은 가능한 오류를 감지할 수 있습니다.
오류 메시지는 디버그 창에 표시됩니다. 그러나 C-RUN 메시지는 모든 통신 채널로 리디렉션할 수 있으며, 필드 테스트에서 메시지를 캡처하여 테스트 후 확인할 수 있습니다.
C-RUN 메시지를 터미널 I/O로 리디렉션하기
C-RUN 메시지는 숨겨진 프로세스인 세미 호스팅을 통해 PC로 전송됩니다. C-RUN 메시지의 소스 코드는 <EWARM>\arm\src\lib\crun에 제공됩니다. C-RUN이 독립적으로 작동하도록 만들기 전에 터미널 I/O에서 메시지를 확인해 보겠습니다.
작업 영역에 ReportCheckFailedStdout.c를 추가합니다.
크런 폴더에 ReportCheckFailedStdout.c를 작업 영역에 복사합니다.
이 파일은 읽기 전용 속성이 될 수 있습니다. 그런 다음 Windows 속성에서 해당 속성을 제거합니다. 또한 파일을 ARM용 IAR 임베디드 워크벤치 워크스페이스에 추가합니다.
C-RUN 메시지 stdout 리디렉션
링커 구성을 변경하여 C-RUN 오류 메시지를 리디렉션합니다. 기본값으로 __iar_ReportCheckFailed가 호출됩니다. 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();
}
프로젝트 옵션]을 열고 링커 > 추가 옵션을 설정합니다. --redirect __iar_ReportCheckFailed=__iar_ReportCheckFailedStdout>로 설정합니다.
C-RUN으로 디버그 실행
디버그 세션을 시작하기 전에 감지하려는 특정 C-RUN 옵션을 활성화했는지 확인하세요. 모두 다시 빌드를 선택하고 다운로드 및 디버그를 클릭한 다음 보기 > 터미널 I/O 창을 열고 실행을 클릭합니다.
C-RUN이 오류 메시지를 감지하면 해당 메시지가 터미널 I/O로 전송됩니다.
이제 터미널 입출력 창에서 각 메시지당 한 줄씩 C-RUN 메시지를 볼 수 있습니다. 메시지는 원시 데이터이며 cspybat.exe에서 메시지를 표시할 수 있습니다.
cspybat.exe로 C-RUN 원시 데이터 구문 분석하기
cspybat.exe는 디버그 배치 테스트에 사용되는 도구입니다. C-RUN 원시 데이터 파서로도 사용할 수 있습니다.
bat 파일 수정하기
프로젝트가 빌드될 때마다 프로젝트의 설정 폴더 아래에 ***.cspy.bat 파일이 생성됩니다. 에디터 애플리케이션으로 파일을 엽니다. rtc_enable 뒤에 --rtc_filter를 추가하고 파일을 저장합니다.
명령 프롬프트에서 bat 파일 실행
명령 프롬프트를 열고 설정 폴더로 이동합니다. bat 파일을 입력하거나 탭 키로 선택합니다.
그런 다음 .out 파일 경로를 추가합니다.
이 예에서는 경로를 단순화하기 위해 c.out 파일을 설정 폴더에 복사했지만 절대 경로를 지정할 수도 있습니다. 그런 다음 Enter 키를 누릅니다.
이제 cspybat이 C-RUN 원시 데이터 메시지를 기다리고 있습니다.
원시 데이터 메시지 구문 분석하기
터미널 I/O에서 받은 메시지를 붙여넣습니다. 메시지는 한 줄로 보내야 한다는 점을 기억하세요.
Enter 키를 누르면 아래와 같이 구문 분석된 메시지가 표시됩니다.
이제 main.c 16번 줄에서 Inter conversion failed를 볼 수 있습니다. 일반 C-RUN 메시지 창에서와 비슷한 정보를 볼 수 있습니다.
참고: 콜 스택은 CRUN 원시 데이터에 포함되지 않습니다.
C-RUN 메시지를 UART로 리디렉션
C-RUN 메시지를 다른 통신 채널로 리디렉션할 수도 있습니다. 간단히 _iar_ReportCheckFailedStdout()을 편집하면 됩니다.
iar_ReportCheckFailedStdout() 편집하기
ARM용 IAR 임베디드 워크벤치에서 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를 주석 처리하고 직렬 전송 함수를 호출해 보겠습니다.
ser_printf()는 다른 곳에 정의되어 있습니다. C-RUN이 메시지를 보내기 전에 UART를 설정해야 합니다.
또한 C-RUN 메시지를 SPI, I2C 또는 RAM이나 플래시 메모리의 저장소로 리디렉션하도록 수정할 수도 있습니다.
프로젝트 실행 및 터미널 애플리케이션과 연동하기
Tera Term과 같은 터미널 애플리케이션을 열고 다운로드 및 디버그를 실행합니다.
Tera Term에 C-RUN 오류 메시지가 표시됩니다. 첫 번째 'A'는 일반 애플리케이션 코드에서 전송된 것입니다.
독립 실행형 모드로 보드 실행
전원을 끄고 보드에서 ICE를 제거한 다음 보드를 켭니다. 이제 터미널 애플리케이션에 C-RUN 메시지가 표시되어야 합니다.
이제 ICE 없이도 필드 테스트에서 C-RUN 감지 메시지를 수집할 수 있습니다. 물론 감지된 메시지는 이전 프로세스와 같이 cspybat.exe로 파싱할 수 있습니다.
참고: 박쥐 파일을 생성할 때 디버거 > 다운로드 > 플래시 로더 사용 체크박스를 선택 해제해야 합니다. 이 확인란을 선택 해제하고 워크스페이스를 닫으면 bat 파일이 업데이트됩니다.
결론
C-RUN은 매우 편리하고 유용한 런타임 분석 애드온입니다. 이 글에서 설명한 기술을 사용하면 필드 테스트에도 C-RUN을 적용할 수 있습니다.