배너
닫기

테크노트

배너

디버깅을 위한 마이크로컨트롤러의 레지스터

  • 등록 2018.12.03 11:35:31
URL복사

[첨단 헬로티]


일반적으로 임베디드 시스템 소프트웨어, 특히 마이크로컨트롤러(MCU)의 소프트웨어의 디버깅을 위해서는 코드 실행, 메모리 값, 스택 포인터, 인터럽트 타이밍 및 레지스터 값에 중점을 둔다. 이번 글에서는 IAR 임베디드 워크벤치(IAR Embedded Workbench)의 C-SPY 디버거에서 레지스트 값을 확인하고 수정하는 등의 다양한 기능을 소개하고, 레지스터의 정보를 어떻게 확인하고 활용하는지 설명하겠다. 


레지스터 윈도우


레지스터와 관련되 가장 기본적인 기능은 Register Window이다. 


C-SPY 디버거에서 View > Register.


Register 창에서 각 레지스터 별의 값 뿐 아니라 레지스터의 Read/Write 속성, 주소 등 다양한 정보를 볼 수 있다[그림 1].


▲ 그림 1.


IAR Embedded Workbench for Arm 7.50 버전 이상부터는 레지스터의 이름 검색의 기능이 추가돼 있다[그림 2]. 이로써 검색으로 필요한 레지스터의 정보를 빠르게 찾을 수 있어 편리하다.


▲ 그림 2.


또한 Register 창에서 마우스 오른쪽 버튼 클리 후 나타나는 컨텍스트 매뉴 중 View Group기능을 통한 레지스터 선택으로 MCU의 페리페럴 등의 모든 레지스터 정보를 확인할 수 있다[그림 3][그림 4].


▲ 그림 3.


▲ 그림 4.

 

레지스터 확인과 레지스터의 주소


때로는 디버거 동작중이 아니더라도 특정 레지스터의 주소 등 정보를 확인이 필요할 경우가 있다. 일반적으로 마이크로컨트롤러 제조사가 MCU 주변장치 제어를 위한 코드를 제공한다. 하지만 이 코드는 매우 복잡하고 일반적으로 매우 쉽게 레지스터의 주소위치 등 정보를 찾기 어렵다. 이러한 문제는 SFRs(Special Function Registers) 설정 기능으로 쉽게 해결된다.


C-SPY 디버거에서 Project > SFR setup[그림 5] 



▲ 그림 3.


SFR Setup 윈도우가 오픈된다[그림 6].


▲ 그림 6.


이 SFR Setup 창은 현재의 정의된 SFRs(Special Function Registers)를 보여준다[그림 7]. 기본적인 칩제조사 제공의 정보(Factroy defined) 외에도 사용자 정의의 레지스터를 볼 수 있다. 이 창에서 레지스터의 정의 추가 또는 기존 정의된 레지스터를 수정할 수 있다. 


▲ 그림 7.

 

모든 레지스터 값을 파일로 저장하기


개발한 어플리케이션 코드가 동작할 때 확인하기 어려운 동작의 문제가 발생하는 경우 레지스터 값의 확인만으로 문제가 해결되는 경우가 있다. 각 상황마다 레지스터의 값 확인과 비교를 위해 레지스터 덤프 생성이 필요하다. 레지스터의 덤프는 다음과 같이 쉬운 방법으로 가능하다.


C-SPY 디버거에서Project > Save List of Registers[그림 8].


▲ 그림 8.


기본적으로 Save List of Registers.. 를 실행하면 sfrList.log 파일을 생성한다[그림 9]. 이 파일은 모든 레지스터의 사이즈, 위치, 타입 등 정보를 탭으로 구분해 저장하므로 엑셀과 같은 스프레드시트 프로그램을 이용해 쉽게 확인 할 수 있다. 만일 디버깅 중에 해당 기능을 실행하면 레지스터의 현재 값을 포함해 저장한다. 


▲ 그림 9.


<매크로를 활용해 특정 레지스터만의 덤프를 실행할 수 있지만, 이 글에서는 해당 기능의 설명을 하지 않았다>


CYCLECOUNTER 레지스터로 실행 시간 측정


CYCLECOUNTER 관련 레지스터를 활용하면 코드 수행시간을 코드 추가·수정없이 측정할 수 있다. 해당 레지스터는 MCU동작 시작부터 소요된 Clock cycle을 카운트한다. 또한, CCSTEP Register는 마지막 표시됐던 CYCLECOUNTER Register 값과 현재 값의 차이를 표시한다[그림 10]. 


▲ 그림 10.


확인을 위해 Step Over를 실행하면 코드가 수행되고 CYCLECOUNTER 값이 증가되는 것 을 확인 할 수 있다. 또한 이전 CYCLECOUNTER 값과 수행 후의 값의 차이를 CCSTEP 의 값으로 알 수 있다.


▲ 그림 11.


424(Current CYCLECOUNTER) - 416(Previous CYCLECOUNTER)= 8(Current CCSTEP)


CYCLECOUNTER Register는 Arm Cortex-M3/4 MCU에서 기본으로 제공되고 있다. 하지만IAR Embedded Workbench for Arm에서는 기본값으로 비활성화 돼있다. 만일 I-jet 디버거 장비를 사용하면 자동 활성화가 되지만, 다른 디버거 장비를 사용할 경우 활성화 작업이 필요하다. 이러한 경우 [그림 12]를 참조해서 DWT Control register (DWT_CTRL.CYCCNTENA)의 CYCCNTENA 비트를 1로 설정해라.


▲ 그림 12.


CYCLECOUNTER Register 를 사용하는 방법은 코드가 실행되는 동안의 CPU clock 수를 이용하는 방법으로 실행 시간을 가장 정확하게 측정 할 수 있다. CYCLECOUNTER Register의 차이 값을 시간으로 환산하는 수식의 매크로함수를 작성해 활용하면 좀 더 편리하게 시간 측정이 가능하다.


마지막으로 다양한 MCU의 Register 중 Interrupt Flag 등과 같이 레지스터 값을 한번 읽으면 자동으로 초기화 되는 특성의 레지스터가 있다. Register 창으로 레지스터 값을 확인하는 경우, 이러한 레지스터를 디버깅 중에 읽고 확인하면 하드웨어 특성상 자동으로 초기화되므로 의도하지 않은 동작이 될 수 있다. 


맺음말


레지스터 값은 임베디드 시스템에서 가장 중요한 부분 중 하나이며 IAR Embedded Workbench는 디버깅을보다 효율적으로 수행 할 수 있는 몇 가지 기능을 제공한다. 이 글에서는 레지스터정보를 확인하고 디버깅에 활용할 때 사용할 수 있는 기능을 간략히 설명했다. 


글 : 이현도 IAR 시스템즈(IAR Systems) 기술지원팀 과장(Hyun-Do.Lee@iar.com)



















주요파트너/추천기업