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
SYSDECSYSDEC <*SlideNumber*>
Code Worrior
SYSDECSYSDEC <*SlideNumber*>
CodeWarrior
CodeWarrior IDE(integrated development environment) 는 ARM 과 Thumb 명령어를 타겟으로 하는 C, C++, ARM assembly language code 를 개발하는 ARM Developer Suite 에 사용되는 IDE 이다 .
SYSDECSYSDEC <*SlideNumber*>
New Project
SYSDECSYSDEC <*SlideNumber*>
Project 이름 입력
ARM executable image 생성을 위한 프로젝트
SYSDECSYSDEC <*SlideNumber*>
결과
SYSDECSYSDEC <*SlideNumber*>
파일 추가
마우스 오른쪽 버튼 클릭
SYSDECSYSDEC <*SlideNumber*>
파일 추가 ( 다른 방법 )
SYSDECSYSDEC <*SlideNumber*>
파일 선택
SYSDECSYSDEC <*SlideNumber*>
Build Target 선택
원하는 타겟 설정
SYSDECSYSDEC <*SlideNumber*>
Build Target
Debug, DebugRel, Release build targets Debug
소스 파일의 각각의 라인에 대해서 디버그 정보를 생성 DebugRel
소스 파일의 각각의 라인에 대해서 적당한 수준의 디버그 정보를 생성
Release 디버그 정보를 생성하지 않음
SYSDECSYSDEC <*SlideNumber*>
파일 추가 결과
SYSDECSYSDEC <*SlideNumber*>
파일 그룹 생성
파일 관리 용이
SYSDECSYSDEC <*SlideNumber*>
파일 그룹 생성 결과 (qsort_small)
SYSDECSYSDEC <*SlideNumber*>
파일을 파일 그룹으로 이동
SYSDECSYSDEC <*SlideNumber*>
이동 결과
파일 그룹파일 이름
SYSDECSYSDEC <*SlideNumber*>
파일이나 그룹의 삭제
SYSDECSYSDEC <*SlideNumber*>
프로젝트 화면의 탭
Files 탭 파일 , 그룹 , 서브프로젝트
Link Order 탭 CodeWarrior 가 최종 결과 파일을 어떤 순서로 링크 하는가에 대한
정보 각각의 오브젝트 파일이 최종 binary 타겟 파일에 위치하는 순서
Targets 탭 Debug, Release, DebugRel
SYSDECSYSDEC <*SlideNumber*>
Build Target Setting
현재의 타겟
SYSDECSYSDEC <*SlideNumber*>
텍스트 에디터 호출
파일 이름을 더블 클릭
SYSDECSYSDEC <*SlideNumber*>
텍스트 에디터
SYSDECSYSDEC <*SlideNumber*>
Build Target 내부 설정
SYSDECSYSDEC <*SlideNumber*>
Target 이름 및 링커 종류의 설정
SYSDECSYSDEC <*SlideNumber*>
Access Path
User header 파일 혹은 library 파일의 search path 설정 C system header 파일 혹은 library 파일의 search path 설정
SYSDECSYSDEC <*SlideNumber*>
File Mapping
파일 이름의 확장자를 ARM C compiler 와 같은 툴의 plug-in 과 연계시킨다 .
SYSDECSYSDEC <*SlideNumber*>
Assembler 설정
SYSDECSYSDEC <*SlideNumber*>
C 컴파일러 설정
SYSDECSYSDEC <*SlideNumber*>
Qsort_small
SYSDECSYSDEC <*SlideNumber*>
Make
make 버튼을 클릭한 후 error 나 warning 없이 컴파일이 끝났다 .
SYSDECSYSDEC <*SlideNumber*>
Make Window
errors warnings 그 밖의 message
error 가 난 위치
SYSDECSYSDEC <*SlideNumber*>
Debugger 의 선택
SYSDECSYSDEC <*SlideNumber*>
Argument 설정
SYSDECSYSDEC <*SlideNumber*>
Debugging 과 Running
Run 또는 Debug 버튼을 누르면 AXD (ARM eXtended Debugger) 가 자동으로 실행된다 .
RunDebug
SYSDECSYSDEC <*SlideNumber*>
AXD 의 실행
SYSDECSYSDEC <*SlideNumber*>
ARM eXtended Debugger(AXD)
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)
SYSDECSYSDEC <*SlideNumber*>
AXD 의 타겟 설정 (1)
ARM920T 로 바로 연결이 안 된다면 AXD 메뉴바의 Options Configure Targets 를 선택 !
SYSDECSYSDEC <*SlideNumber*>
Debug Target 의 설정
SYSDECSYSDEC <*SlideNumber*>
Armulator 로 설정
SYSDECSYSDEC <*SlideNumber*>
Armulator 의 설정
SYSDECSYSDEC <*SlideNumber*>
AXD Window
log window
disassembled image default break point
SYSDECSYSDEC <*SlideNumber*>
ARMulator 를 이용한 Simulation
AXD 의 Execute menu 에서 “ Go” 를 선택 또는 “ Go” 버튼을 클릭
Default breakpoint main() 의 시작 지점에서 실행이 멈춤
실행의 계속 “Go” 를 클릭
프로그램 실행을 반복하려면 , File menu 바에서 “ Reload Current Image…” 를
클릭
SYSDECSYSDEC <*SlideNumber*>
Go
SYSDECSYSDEC <*SlideNumber*>
Qsort_small 실행 중
output 이 console window 에 나타난다 .
SYSDECSYSDEC <*SlideNumber*>
Qsort_small 실행이 끝난 후
SYSDEC
ARM7 의 6 가지 동작모드
User Mode 일반 응용 프로그램을 수행하는데 사용가능 ,
FIQ Mode IRQ 보다 좀 더 빠른 인터럽트 처리를 위해 있는 것
IRQ Mode 일반적으로 I/O 장치로부터의 입력이 들어오면 반응하는 흔히 말하는 인터럽트 EXCEPTION
Supervisor Mode OS 중 서비스 영역에서 동작하는 Mode
Abort Mode 명령어를 읽을 수 없거나 데이터를 읽거나 쓸 수 없는 상황에 사용
Undefined Mode ARM7 에 정의되어 있지 않은 명령어를 만났을 경우에 발생 .
SYSDEC <*SlideNumber*>
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) 에 넣고 분기한다 .함 호출 시 , 복귀할 명령어 주소가 저장되 있음
SYSDECSYSDEC <*SlideNumber*>
-ARM7 은 32bit status register(=PSR,CPSR) 가 6 개 있다 .-CPSR: Flag bits + control bits-SPSR: 이전에 저장된 프로그램 상태 레지스터
N: 연산결과가 마이너스 일 때Z: 연산결과가 0 이었을 때 C: 연산결과가 자리올림이나 내림이 발생한 경우V: 연산결과가 오버 플로우 됐을 때
CPU 의 6 개 동작상태를 나타냄 .
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 불가능
SYSDEC
부트 코드 작성 ( 시스템의 초기화 동작 )
• 1. Entry point 정의• 2. 예외처리 벡터 설정• 3. 불필요한 하드웨어 동작 중지• 4. 시스템 클록 설정• 5. 메모리 시스템 초기화• 6. 스택 영역 설정• 7. IRQ 예외처리 핸들러 설정 및 IRQ 인터럽트 Enable • 8. C 에서 사용하는 변수 초기화 .• 9. C 코드로 분기
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 등의 이름을 사용한다 .
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 호출을 하게 된다 .
SYSDEC
3. 불필요한 하드웨어 동작 중지
시스템 초기화를 방해하는 하드웨어 동작 중지 와치독 타이머 중지 예
LDR r0, =0x53000000 @ R0 에 주소 0x53000000
값을 기록한다 .
LDR r1, =0x0 @ R1 에 설정할 레지스터 값을 기록한다 .
STR r1, [r0] @ R0 주소에 R1 을 기록한다 .
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
설정
SYSDEC
5. 메모리 시스템 초기화
• 사용되는 메모리의 데이터 버스 폭 , 억세스 타이밍 등
LDR r0, =0x4800000C @ R0 에 BANKCON2 레지스터의 주소를 기록LDR r1, =0x00002A50 @ R1 에 설정할 레지스터 값 기록STR r1, [r0] @ R0 주소에 R1 을 기록 , BANKCON2 설정
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 모드 스택 설정 */
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 등이 올 수 있으며인터럽트가 불가능하게 세팅
SYSDEC
8. C 에서 사용하는 변수 초기화•소프트웨어 동작을 위한 메모리 구조Boot code image 의 R/W data 의 writing 이 가능하기 위해 image 를 RAM 으로 copy 해야 한다 .
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 으로 초기화
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 으로 모드 변화되면서 점프
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 이 동작한다 .
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
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 에 저장하는 것 .