62
SYSDEC SYSDEC <*SlideNumber*> Code Worrior

Code Worrior

  • Upload
    leland

  • View
    72

  • Download
    2

Embed Size (px)

DESCRIPTION

Code Worrior. SYSDEC. . CodeWarrior. CodeWarrior IDE(integrated development environment) 는 ARM 과 Thumb 명령어를 타겟으로 하는 C, C++, ARM assembly language code 를 개발하는 ARM Developer Suite 에 사용되는 IDE 이다. SYSDEC. . New Project. SYSDEC. . - PowerPoint PPT Presentation

Citation preview

Page 1: Code Worrior

SYSDECSYSDEC <*SlideNumber*>

Code Worrior

Page 2: Code Worrior

SYSDECSYSDEC <*SlideNumber*>

CodeWarrior

CodeWarrior IDE(integrated development environment) 는 ARM 과 Thumb 명령어를 타겟으로 하는 C, C++, ARM assembly language code 를 개발하는 ARM Developer Suite 에 사용되는 IDE 이다 .

Page 3: Code Worrior

SYSDECSYSDEC <*SlideNumber*>

New Project

Page 4: Code Worrior

SYSDECSYSDEC <*SlideNumber*>

Project 이름 입력

ARM executable image 생성을 위한 프로젝트

Page 5: Code Worrior

SYSDECSYSDEC <*SlideNumber*>

결과

Page 6: Code Worrior

SYSDECSYSDEC <*SlideNumber*>

파일 추가

마우스 오른쪽 버튼 클릭

Page 7: Code Worrior

SYSDECSYSDEC <*SlideNumber*>

파일 추가 ( 다른 방법 )

Page 8: Code Worrior

SYSDECSYSDEC <*SlideNumber*>

파일 선택

Page 9: Code Worrior

SYSDECSYSDEC <*SlideNumber*>

Build Target 선택

원하는 타겟 설정

Page 10: Code Worrior

SYSDECSYSDEC <*SlideNumber*>

Build Target

Debug, DebugRel, Release build targets Debug

소스 파일의 각각의 라인에 대해서 디버그 정보를 생성 DebugRel

소스 파일의 각각의 라인에 대해서 적당한 수준의 디버그 정보를 생성

Release 디버그 정보를 생성하지 않음

Page 11: Code Worrior

SYSDECSYSDEC <*SlideNumber*>

파일 추가 결과

Page 12: Code Worrior

SYSDECSYSDEC <*SlideNumber*>

파일 그룹 생성

파일 관리 용이

Page 13: Code Worrior

SYSDECSYSDEC <*SlideNumber*>

파일 그룹 생성 결과 (qsort_small)

Page 14: Code Worrior

SYSDECSYSDEC <*SlideNumber*>

파일을 파일 그룹으로 이동

Page 15: Code Worrior

SYSDECSYSDEC <*SlideNumber*>

이동 결과

파일 그룹파일 이름

Page 16: Code Worrior

SYSDECSYSDEC <*SlideNumber*>

파일이나 그룹의 삭제

Page 17: Code Worrior

SYSDECSYSDEC <*SlideNumber*>

프로젝트 화면의 탭

Files 탭 파일 , 그룹 , 서브프로젝트

Link Order 탭 CodeWarrior 가 최종 결과 파일을 어떤 순서로 링크 하는가에 대한

정보 각각의 오브젝트 파일이 최종 binary 타겟 파일에 위치하는 순서

Targets 탭 Debug, Release, DebugRel

Page 18: Code Worrior

SYSDECSYSDEC <*SlideNumber*>

Build Target Setting

현재의 타겟

Page 19: Code Worrior

SYSDECSYSDEC <*SlideNumber*>

텍스트 에디터 호출

파일 이름을 더블 클릭

Page 20: Code Worrior

SYSDECSYSDEC <*SlideNumber*>

텍스트 에디터

Page 21: Code Worrior

SYSDECSYSDEC <*SlideNumber*>

Build Target 내부 설정

Page 22: Code Worrior

SYSDECSYSDEC <*SlideNumber*>

Target 이름 및 링커 종류의 설정

Page 23: Code Worrior

SYSDECSYSDEC <*SlideNumber*>

Access Path

User header 파일 혹은 library 파일의 search path 설정 C system header 파일 혹은 library 파일의 search path 설정

Page 24: Code Worrior

SYSDECSYSDEC <*SlideNumber*>

File Mapping

파일 이름의 확장자를 ARM C compiler 와 같은 툴의 plug-in 과 연계시킨다 .

Page 25: Code Worrior

SYSDECSYSDEC <*SlideNumber*>

Assembler 설정

Page 26: Code Worrior

SYSDECSYSDEC <*SlideNumber*>

C 컴파일러 설정

Page 27: Code Worrior

SYSDECSYSDEC <*SlideNumber*>

Qsort_small

Page 28: Code Worrior

SYSDECSYSDEC <*SlideNumber*>

Make

make 버튼을 클릭한 후 error 나 warning 없이 컴파일이 끝났다 .

Page 29: Code Worrior

SYSDECSYSDEC <*SlideNumber*>

Make Window

errors warnings 그 밖의 message

error 가 난 위치

Page 30: Code Worrior

SYSDECSYSDEC <*SlideNumber*>

Debugger 의 선택

Page 31: Code Worrior

SYSDECSYSDEC <*SlideNumber*>

Argument 설정

Page 32: Code Worrior

SYSDECSYSDEC <*SlideNumber*>

Debugging 과 Running

Run 또는 Debug 버튼을 누르면 AXD (ARM eXtended Debugger) 가 자동으로 실행된다 .

RunDebug

Page 33: Code Worrior

SYSDECSYSDEC <*SlideNumber*>

AXD 의 실행

Page 34: Code Worrior

SYSDECSYSDEC <*SlideNumber*>

ARM eXtended Debugger(AXD)

Page 35: Code Worrior

SYSDECSYSDEC <*SlideNumber*>

디버깅 시스템의 타겟

ARMulator (Software) Architecture simulator

Multi-ICE (Hardware) 또는 Vbox-pro JTAG 기반

ARM Debugger AXD

RDI

ARMulator

Target simulated in

software

RDI

Multi-ICE

ARM development

board

Remote Debug Interface (RDI)

Page 36: Code Worrior

SYSDECSYSDEC <*SlideNumber*>

AXD 의 타겟 설정 (1)

ARM920T 로 바로 연결이 안 된다면 AXD 메뉴바의 Options Configure Targets 를 선택 !

Page 37: Code Worrior

SYSDECSYSDEC <*SlideNumber*>

Debug Target 의 설정

Page 38: Code Worrior

SYSDECSYSDEC <*SlideNumber*>

Armulator 로 설정

Page 39: Code Worrior

SYSDECSYSDEC <*SlideNumber*>

Armulator 의 설정

Page 40: Code Worrior

SYSDECSYSDEC <*SlideNumber*>

AXD Window

log window

disassembled image default break point

Page 41: Code Worrior

SYSDECSYSDEC <*SlideNumber*>

ARMulator 를 이용한 Simulation

AXD 의 Execute menu 에서 “ Go” 를 선택 또는 “ Go” 버튼을 클릭

Default breakpoint main() 의 시작 지점에서 실행이 멈춤

실행의 계속 “Go” 를 클릭

프로그램 실행을 반복하려면 , File menu 바에서 “ Reload Current Image…” 를

클릭

Page 42: Code Worrior

SYSDECSYSDEC <*SlideNumber*>

Go

Page 43: Code Worrior

SYSDECSYSDEC <*SlideNumber*>

Qsort_small 실행 중

output 이 console window 에 나타난다 .

Page 44: Code Worrior

SYSDECSYSDEC <*SlideNumber*>

Qsort_small 실행이 끝난 후

Page 45: Code Worrior

SYSDEC

ARM7 의 6 가지 동작모드

User Mode 일반 응용 프로그램을 수행하는데 사용가능 ,

FIQ Mode IRQ 보다 좀 더 빠른 인터럽트 처리를 위해 있는 것

IRQ Mode 일반적으로 I/O 장치로부터의 입력이 들어오면 반응하는 흔히 말하는 인터럽트 EXCEPTION

Supervisor Mode OS 중 서비스 영역에서 동작하는 Mode

Abort Mode 명령어를 읽을 수 없거나 데이터를 읽거나 쓸 수 없는 상황에 사용

Undefined Mode ARM7 에 정의되어 있지 않은 명령어를 만났을 경우에 발생 .

SYSDEC <*SlideNumber*>

Page 46: Code Worrior

SYSDEC

ARM state

SYSDEC <*SlideNumber*>

RO~R7

R8~R12

SP(Stack pointer)

LR(Link Register)

PC

CPSR

SPSR

-PC(R15): R15 는 다른 CPU 에서의 PC 와 같은 역할을 한다 . ARM 어셈블러는 PC 라는 키워드와 R15 를 동일하게 취급 .

-SP (R13) :ARM7 에는 스택을 위한 명령어가 따로 없다 . SP 라는 키워드를 사용하여 R13 을 쓸 수 있다 .

-LR (R14):ARM7 에서는 CALL, RET 과 같은 명령어가 없다 . 대신 Branch with link(BL) 라는 명령어가 있는데 , 해당 명령어를 수행하여 CALL 과 비슷하게 다음에 수행될 PC(R15) 값을 LR(R14) 에 넣고 분기번지를 PC(R15) 에 넣고 분기한다 .함 호출 시 , 복귀할 명령어 주소가 저장되 있음

Page 47: Code Worrior

SYSDECSYSDEC <*SlideNumber*>

-ARM7 은 32bit status register(=PSR,CPSR) 가 6 개 있다 .-CPSR: Flag bits + control bits-SPSR: 이전에 저장된 프로그램 상태 레지스터

N: 연산결과가 마이너스 일 때Z: 연산결과가 0 이었을 때 C: 연산결과가 자리올림이나 내림이 발생한 경우V: 연산결과가 오버 플로우 됐을 때

CPU 의 6 개 동작상태를 나타냄 .

Page 48: Code Worrior

SYSDECSYSDEC <*SlideNumber*>

Mode_USR EQU 0X10 유저 모드 선택 비트

Mode_IRQ EQU 0X12 일반 인터럽트 처리 모드

Mode_SVC EQU 0X13 운영체제를 위한 보호 모드

IRQ_Stack EQU RAM_Limit IRQ 스택의 Top pointer 정의 (stack 영역은 1k)

SVC_Stack EQU RAM_Limit-1024 SVC 메모리스택의 Top pointer(stack 영역은 8k)

USR_Stack EQU SVC_Stack-1024 USR 스택의 Top pointer

I_Bit EQU 0X80 IRQ 불가능

F_Bit EQU 0X40 FIQ 불가능

Page 49: Code Worrior

SYSDEC

부트 코드 작성 ( 시스템의 초기화 동작 )

• 1. Entry point 정의• 2. 예외처리 벡터 설정• 3. 불필요한 하드웨어 동작 중지• 4. 시스템 클록 설정• 5. 메모리 시스템 초기화• 6. 스택 영역 설정• 7. IRQ 예외처리 핸들러 설정 및 IRQ 인터럽트 Enable • 8. C 에서 사용하는 변수 초기화 .• 9. C 코드로 분기

Page 50: Code Worrior

SYSDEC

1. Entry point 정의

AREA Init, CODE, READONLY

--- Define entry point

EXPORT __main ; defined to ensure that C runtime system

__main ; is not linked in

ENTRY

어셈블러로 구성되며 모든 프로그램에는 반드시 필요하다 .일반적으로 init.S, startup.s 등의 이름을 사용한다 .

Page 51: Code Worrior

SYSDEC

2. 예외처리 벡터 설정

Vector_Init_BlockLDR PC, Reset_AddrLDR PC, Undefined_AddrLDR PC, SWI_AddrLDR PC, Prefetch_AddrLDR PC, Abort_AddrNOPLDR PC, IRQ_AddrLDR PC, FIQ_Addr

Reset_Addr DCD Reset_HandlerUndefined_Addr DCD Undefined_HandlerSWI_Addr DCD SWI_HandlerPrefetch_Addr DCD Prefetch_HandlerAbort_Addr DCD Abort_Handler

DCD 0 ; Reserved vectorIRQ_Addr DCD IRQ_HandlerFIQ_Addr DCD FIQ_Handler

*Reset_Addr 명령어는 Reset_Handler 호출을 하게 된다 .

Page 52: Code Worrior

SYSDEC

3. 불필요한 하드웨어 동작 중지

시스템 초기화를 방해하는 하드웨어 동작 중지 와치독 타이머 중지 예

LDR r0, =0x53000000 @ R0 에 주소 0x53000000

값을 기록한다 .

LDR r1, =0x0 @ R1 에 설정할 레지스터 값을 기록한다 .

STR r1, [r0] @ R0 주소에 R1 을 기록한다 .

Page 53: Code Worrior

SYSDEC

4. 시스템 클록 설정

CLOCK 설정 예 LDR r0, =0x4C000014 @ R0 에 CLKDIVN 레지스터의 주소

기록LDR r1, =0x3 @ R1 에 설정할 레지스터 값을 기록한다 .

@ FCLK : HCLK : PCLK = 1:2:4STR r1, [r0] @ R0 주소에 R1 을 기록 , CLKDIVN

설정LDR r0, =0x4C000004 @ R0 에 MPLLCON 레지스터의 주소

기록LDR r1, =0xa1031 @ R1 에 설정할 레지스터 값을 기록

@ 202.8MHz 출력 사용하도록 설정STR r1, [r0] @ R0 주소에 R1 을 기록 , MPLLCON

설정

Page 54: Code Worrior

SYSDEC

5. 메모리 시스템 초기화

• 사용되는 메모리의 데이터 버스 폭 , 억세스 타이밍 등

LDR r0, =0x4800000C @ R0 에 BANKCON2 레지스터의 주소를 기록LDR r1, =0x00002A50 @ R1 에 설정할 레지스터 값 기록STR r1, [r0] @ R0 주소에 R1 을 기록 , BANKCON2 설정

Page 55: Code Worrior

SYSDEC

6. 스택 영역 설정

#define STACK_BASE_ADDR 0x33ff8000

#define UserStack STACK_BASE_ADDR - 0x3800 /* USR 스택 base */

#define SVCStack STACK_BASE_ADDR - 0x2800 /* SVC 스택 base */

#define UndefStack STACK_BASE_ADDR - 0x2400 /* Undef 스택 base */

#define AbortStack STACK_BASE_ADDR - 0x2000 /* Abort 스택 base */

/* IRQ mode stack */

orr r1,r0,#0x12 /* IRQ 모드 값 지정 */

msr cpsr_c,r1 /* IRQ 모드로 변환 */

ldr sp,=IRQStack /* IRQ 모드 스택 설정 */

Page 56: Code Worrior

SYSDEC

7. IRQ 예외처리 핸들러 설정 및 IRQ 인터럽트 Enable

MOV R0, #Mode_SVC:OR:F_Bit ; Only IRQ enabledMSR CPSR_c, R0

SYSDEC <*SlideNumber*>

Mode_SVC =>SVC 모드 선택I_Bit =0X80=> IRQ DisableF_Bit =0X40=> FIQ Disable

즉 , SVC 모드에서 IRQ 디스에이블

Mode_FIQ / Mode_UNDEF/ Mode_ABT 등이 올 수 있으며인터럽트가 불가능하게 세팅

Page 57: Code Worrior

SYSDEC

8. C 에서 사용하는 변수 초기화•소프트웨어 동작을 위한 메모리 구조Boot code image 의 R/W data 의 writing 이 가능하기 위해 image 를 RAM 으로 copy 해야 한다 .

Page 58: Code Worrior

SYSDEC

8. C 에서 사용하는 변수 초기화 .

IMPORT |Image$$RO$$Limit| ; End of ROM code (=start of ROM data)

IMPORT |Image$$RW$$Base| ; Base of RAM to initialize

IMPORT |Image$$ZI$$Base| ; Base and limit of area

IMPORT |Image$$ZI$$Limit| ; to zero initialize

LDR r0, =|Image$$RO$$Limit| ;ROM 데이터의 포인터를 가져온다 .

LDR r1, =|Image$$RW$$Base| ; RAM 복사LDR r3, =|Image$$ZI$$Base| ; Zero init base => top of initialized data

CMP r0, r1 ; ROM 과 RAM 의 데이터가 다른지 비교BEQ %F1

0 CMP r1, r3 ; Copy init data

LDRCC r2, [r0], #4 ; LDRCC r2, [r0] + ADD r0, r0, #4

STRCC r2, [r1], #4 ; STRCC r2, [r1] + ADD r1, r1, #4BCC %B0

1 LDR r1, =|Image$$ZI$$Limit| ; Top of zero init segment

MOV r2, #0

2 CMP r3, r1

STRCC r2, [r3], #4

BCC %B2

ROM 에 있는 데이터를 RAM 으로 COPY

RAM ZI 을 0 으로 초기화

Page 59: Code Worrior

SYSDEC

9. C 코드로 분기

• 모든 초기 설정이 완료되면 C 함수를 수행할 수 있다 . 임베디드의 경우 main 함수를 사용하는 경우도 있지만 대부분 Main 또는 C_Entry 와 같은 함수를 사용한다 .

IMPORT C_Entry // 응용 프로그램으로 진입 [ :DEF:THUMB

ORR lr, pc, #1BX lrCODE16 ; Next instruction will be Thumb

]BL C_Entry

BX lr // 모드변화를 하면서 점프함 . // 즉 ARM->Thumb 또는 Thumb->ARM 으로 모드 변화되면서 점프

Page 60: Code Worrior

SYSDEC

semihosting

MOV r0, #0x18 ; angel_SWIreason_ReportExceptionLDR r1, =0x20026 ; ADP_Stopped_ApplicationExit[ :DEF: THUMB

SWI 0xAB ; Angel semihosting Thumb SWI|

SWI 0x123456 ; Angel semihosting ARM SWI]

SYSDEC <*SlideNumber*>

Semihosting:타겟에서 수행되는 코드중 I/O 에 관련되는 코드를 캡쳐해서 I/O 를 타겟에서 수행하는 것이 아니라 디버거를 구동하는 호스트 시스템에서수행하는 기능이다 . Semihosting 은 SWI 를 유발한다 .디버거랑 서로 Matche 된 number 이면 semihosting 이 동작한다 .

Page 61: Code Worrior

SYSDEC

Load and store Multiple instructions

Load (memory->register) and store (register->memory_ multiple instruction 은 블록 단위로 memory 의 데이터 내용을 모든 범용 레지스터들로 load 하거나 반대로 모든 범용 레지스터들의 내용을 memory 로 story 하기 위해 사용한다 . LDM/STM 명령어를 사용하는 동안은 Interrupt 를 수행하지 못한다 .

SYSDEC <*SlideNumber*>

스택관련 스택과 관련없이

LDMFD/STMFD LDMIA/STMIA

LDMED/STMED LDMIB/STMIB

LDMFA/STMFA LDMDA/STMDA

LDMEA/STMEA LDMDB/STMDB

Page 62: Code Worrior

SYSDEC

Setup interrupt /exception vectors

If the ROM is at address 0 this is just a sequence of branches

B Reset_Handler //B 무조건 분기 명령어 ; 현 위치에서 Reset_Handler 로 분기

B Undefined_Handler

B SWI_Handler

B Prefetch_Handler

B Abort_Handler

NOP; Reserved vector

B IRQ_Handler

B FIQ_Handler

ELSE

MOV R8, #0

ADR R9, Vector_Init_Block

LDMIA R9!, {R0-R7}

STMIA R8!, {R0-R7}

LDMIA R9!, {R0-R7}

STMIA R8!, {R0-R7}

LDMIA R9!,{R0-R7} => 8 개 레지스터에 저장될 내용 (4byte*8=32bytes) 을 R9 가 가리키는 주소로부터 읽어서 R0,R1,R2,R3,R4,R5,R6,R7 에 저장하는 것 .