메모리와 레지스터를 저장 및 복원하는 C-SPY 매크로
기술노트 24166
아키텍처:
All
컴포넌트:
debugger
업데이트:
2021-05-18 오전 9:23
소개
디버깅을 보다 효율적으로 수행하기 위해 타겟(target)에서 메모리 혹은 레지스터를 저장해야 하는 경우 본 기술 노트를 참조하세요. 제공하는 예시는 Freescale 6812를 위한 것이지만, 적절하게 적용한다면 다른 칩에서도 사용할 수 있는 기법이 될것입니다.
이 매크로파일 예시에서는 간단한 hex 파일로 어떻게 레지스터와 메모리 셀의 범위를 저장할 수 있는지 방법이 나와있습니다. "c:\test.hex"로 이름 지어진 파일이 있습니다, 사용하기 편하신 대로 임의로 이름을 변경하시면 됩니다. - 저장, 복원할 때 동일한 이름을 사용해야 합니다.
또한, 편의를 위해, "Project -> Options -> C-SPY -> Setup file"에 이 파일을 명시하십시오. 그렇게 하면 C-SPY를 매번 시작할 때마다 로드될 것입니다. "Control -> Quick Watch" 대화상자(dialog)에서 매크로를 불러올 수 있습니다. - 매크로의 이름을 지정하세요, 이를 테면 memory_save() 그리고 return을 누르거나 "Recalculate"를 클릭합니다. "Add Watch"는 선택하지 마시길 바랍니다. "Add Watch"는 감시(watch)가 업데이트 될 때마다 매크로가 실행될 것입니다.
더 자세한 정보를 드리자면, 그 파일은 먼저 몇가지 변수들을 정의합니다. (빠른 보기 대화상자(quick watch dialog)에서 이것에 대해 접근할 수 있습니다) 가장 흥미로운 변수들은 mem_begin과 mem_end입니다. - 저장 및 복원할 메모리 범위를 지정하는데 사용됩니다. 이를 여러 범위로 확장하는 것은 간단해야 합니다.
여기 메모리 저장 함수가 있습니다:
- 작성을 위해 파일을 엽니다. ("C:\test.hex")
- 파일에 report 창에 표시되어 있는 레지스터 값을 저장합니다.
- mem-begin과 mem_end을 파일에 저장합니다.
- mem_begin부터 mem_end 까지의 메모리 내용을 저장합니다.
다음과 같이 시작하는 몇 라인이 있습니다
// Optional register:
필요한 경우에만 PP 레지스터를 저장/복원할 수 있도록 하기 위한 것입니다. (예: banking 사용시) 메모리 읽기 함수는 기본적으로 역함수이므로, 매우 간단합니다.
마지막으로 execUserSetup()은 mem_begin과 mem_end의 값이 어디에 정의되어 있는지 나타냅니다. 이 이름으로 매크로가 있으면, 타겟 프로그램(target program)이 다운로드된 후 자동으로 한 번 호출됩니다.
C-SPY 문서를 통해 비슷한 매크로에 대한 자세한 정보를 참조하세요.
추가 매크로
파일 이름을 지정할 수 있는 매크로에 대한 추가 예제가(매크로 소스를 업데이트 할 필요가 없는) 있습니다.
QuickWatch 명령줄에 입력하여 변수 내용을 이진형식으로 덤프하는 명령 예제:
DumpMem("dumpmem.bin", &trace_buffer, sizeof(trace_buffer))
QuickWatch 명령줄에 입력하여 ARM 레지스터 내용을 이진형식으로 덤프하는 명령 예제:
DumpReg("dumpreg.txt")
NOTE DumpReg
관심을 가지고 있는 주소을 위해 int형의 크기가 너무 작다면, (int)형 대신 (long)형으로 형변환을 시도해보세요.
모든 제품 이름은 해당 소유자의 상표 또는 등록 상표입니다.