코드 품질, 기사

독립 실행형 모드에서 C-RUN 런타임 분석

<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" >독립 실행형 모드에서 C-RUN 런타임 분석</span>

독립 실행형 모드에서의 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를 작업 영역에 복사합니다.

ReportCheckFailedStdout.c file

이 파일은 읽기 전용 속성이 될 수 있습니다. 그런 다음 Windows 속성에서 해당 속성을 제거합니다. 또한 파일을 ARM용 IAR 임베디드 워크벤치 워크스페이스에 추가합니다.

Add the source file to IAR Embedded Workbench

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>로 설정합니다.

Redirect settings for Runtine Analysis

C-RUN으로 디버그 실행

디버그 세션을 시작하기 전에 감지하려는 특정 C-RUN 옵션을 활성화했는지 확인하세요. 모두 다시 빌드를 선택하고 다운로드 및 디버그를 클릭한 다음 보기 > 터미널 I/O 창을 열고 실행을 클릭합니다.

C-RUN이 오류 메시지를 감지하면 해당 메시지가 터미널 I/O로 전송됩니다.

Output Terminal IO

이제 터미널 입출력 창에서 각 메시지당 한 줄씩 C-RUN 메시지를 볼 수 있습니다. 메시지는 원시 데이터이며 cspybat.exe에서 메시지를 표시할 수 있습니다.

cspybat.exe로 C-RUN 원시 데이터 구문 분석하기

cspybat.exe는 디버그 배치 테스트에 사용되는 도구입니다. C-RUN 원시 데이터 파서로도 사용할 수 있습니다.

bat 파일 수정하기

프로젝트가 빌드될 때마다 프로젝트의 설정 폴더 아래에 ***.cspy.bat 파일이 생성됩니다. 에디터 애플리케이션으로 파일을 엽니다. rtc_enable 뒤에 --rtc_filter를 추가하고 파일을 저장합니다.

명령 프롬프트에서 bat 파일 실행

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

cspybat command line

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

CSPYBAT syntax

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

CSPYBAT output in command line

이제 cspybat이 C-RUN 원시 데이터 메시지를 기다리고 있습니다.

원시 데이터 메시지 구문 분석하기

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

CSPYBAT error on command line

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

CSPYBAT parsing in the command line

이제 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를 주석 처리하고 직렬 전송 함수를 호출해 보겠습니다.

Serial send function

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

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

프로젝트 실행 및 터미널 애플리케이션과 연동하기

Tera Term과 같은 터미널 애플리케이션을 열고 다운로드 및 디버그를 실행합니다.

Tera Term output

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

독립 실행형 모드로 보드 실행

전원을 끄고 보드에서 ICE를 제거한 다음 보드를 켭니다. 이제 터미널 애플리케이션에 C-RUN 메시지가 표시되어야 합니다.

Tera Term output 2

이제 ICE 없이도 필드 테스트에서 C-RUN 감지 메시지를 수집할 수 있습니다. 물론 감지된 메시지는 이전 프로세스와 같이 cspybat.exe로 파싱할 수 있습니다.

CSPYBAT parsed results full

참고: 박쥐 파일을 생성할 때 디버거 > 다운로드 > 플래시 로더 사용 체크박스를 선택 해제해야 합니다. 이 확인란을 선택 해제하고 워크스페이스를 닫으면 bat 파일이 업데이트됩니다.

결론

C-RUN은 매우 편리하고 유용한 런타임 분석 애드온입니다. 이 글에서 설명한 기술을 사용하면 필드 테스트에도 C-RUN을 적용할 수 있습니다.