본문 바로가기
코스웨어/14년 스마트컨트롤러

07.02 이경진

by 알 수 없는 사용자 2014. 7. 2.
728x90
반응형
* 부록 어셈블리어

 

 

/* */

어셈블리에서 주석. C언어 문법 사용함. 근데 //는 주석 아님.

 

.globl reset_handler

.global 외부에서 접근이 가능함

.align 4

정렬 4byte 최적화.

.section .vectors

.section 영역 나누기. 여기는 벡터 영역이다.

.arm

arm 어셈블리이다

.  << 지시자. 디렉터. 어셈블리에서 이게 뭐다 라는걸 설명할 . 이 붙는다.

_exception_vectors:

      라벨. 프로그래밍을 위해 . 0번지를 가리킴. 하나도 실행 X

reset_vector:

      위와 같음.

 ldr  pc, =reset_handler

      이게 어셈블리. 이제부터 시작. 0 번지.

      ldr : LoDe Register 값을 집어넣어라.

      pc : program counter 실행할 곳에 주소를 넣음.

      = 주소를 넣음. 실행을 하고 있다. ( 함수의 주소를 넣음 함수호출)

명령어 - 리모닉 / 실행어 - 오퍼..머시기?

앞에 값에 의해 뒤의 값이 실행 됨.

ldr A,B =(C언어로)=> A=B ;

* 실행하면 어셈블리가 기계어가 된다. 명령어 기계어 1 : 1 로 되어 있다.

실제로 17번 명령어 18번 명령어 ..일케 돼 있음.

 

 * 1번 폭탄 2번 총 3번 핵폭탄 . // -탄 // 140 정지 150 발사

1 7 150 => 폭탄 7탄 발사

요로코롬. 작동이 길어 질수록 명령어가 길어 짐.

Z=A+B;      (=>asm으로)  add A,B

    mov Z,A

초기 개발된 언어라 지금 C 보다 활용이 어렵다.

 

 

1-1. 메모리 구조

사용하는건 외부메모리 / 장치관련 내부 메모리 500메가 정도

우리가 쓰는 arm폰노이만 구조지만 비싼 arm은 하버드 구조이다.

 


 

offset 개념 : AT MEGA는 절대주소로 데이터시트에 주소가 설정 되어있지만 ARM은 레지스터가 많아서 주소를 일일이 설정해주지 않았다.
그래서 8-1 맵을 보고 248p 주소를 offset 해서 사용자가 설정해야 한다.
지금 우리가 쓰는 LED 켜기는 내부장치에 핀 설정 SYSC - PIOA - 0xFFFF F4000 부터 + offset 해준다.

 

 


 

REMAP이란?

 

RM Board가 부팅을 하게 되면가장 먼저 하는 것은 하드웨어 초기화(H/W Reset : 시스템에 리셋 신호가 구동되거나 전원이 입력되었을 때 처음으로 하게 되는 작업(프로그램)을 말합니다이 과정은 시스템마다 차이가 있지만하드웨어 Disable, 시스템 클록메모리 설정, SVC모드 설정, MPU(or MMU) 설정리셋 벡터 실행 등을 합니다.)를 수행합니다이 하드웨어 초기화 과정에서 중에서 마지막으로 수행하는 것이 PC(Program Counter: 프로그램이 앞으로 수행해야 할 위치를 말합니다.) 0x0으로 변경하고리셋 벡터 주소인 0x0번지를 실행하는 것입니다 0x0번지에는 일반적으로 비휘발성 저장매체인 Flash가 위치하고 있습니다. (그 이유는 부트 프로그램이 전원의 On/Off 시에도 손실되지 않고 언제나 유효하게 동작할 수 있어야 하기 때문입니다.)

 

앞에서 설명한 PC 때문에 부트 이미지를 0x0번지에 해당하는 Flash에 올리게 됩니다하지만 이렇게 올리게 되면보통 변수 저장을 위해 특정 번지에 값을 쓰고읽는 C코드의 실행 시에 문제가 발행하게 됩니다.

 

프로그램을 컴파일 한 이미지의 내부 구성을 크게 나누어 보면코드영역과 데이터영역으로 이루어져 있습니다. C언어의 전역변수는 함수간 공유를 위해서 컴파일 시에 이미 데이터 영역에 위치하게 됩니다이 데이터 영역에 위치한 전역변수의 값을 변경시켰을 때데이터 영역이 Flash에 있게 되면변경을 시도는 하지만값은 변경되지 않습니다. (Flash에 쓰기 위해서는 별도의 처리가 필요합니다.) 이런 문제를 쉽게 해결하기 위해서 리맵이라는 기능을 하드웨어적으로 지원합니다. (이 문제의 경우 리맵을 사용하지 않고도 해결은 가능하지만보다 복잡한 방법을 사용해야 합니다.) 이 리맵 기능은 0x0번지를 읽고쓰기에 용이한 SDRAM이 위치한 곳으로 주소 값을 변경하는 기능을 제공합니다.

 

이 리맵 기능을 활용한 처리를 설명하면, (s3c2510a의 경우에는) Flash0x0번지의 리셋 벡터(초기화 코드)가 실행되면시스템 설정클록 설정, SDRAM 설정, Stack 설정 등을 한 후에(보통 C함수로 점프 하기 전에) 0x0번지(Flash)에 있는 부트 프로그램을 0x4000 0000(SDRAM)으로 복사합니다. (당연한 이야기지만, SDRAM으로 복사를 하기 위해서는 SDRAM 설정이 선행되어야 합니다.) 그 후에 ARM CPU SYSCFG 레지스터에 REMAP설정을Set하게 되면0x0 -> 0x8000 00000x4000 0000-> 0x0으로 주소 값이 변경됩니다. (여기에 변경하게 되는 주소는 0x0번지와 0x4000 0000번지에 한정시켜 설명한 것 입니다리맵 시에 주소는 전체적으로 바뀌게 됩니다자세한 내용은 해당 CPU Datasheet의 표를 참고하시면 됩니다.) 앞서0x4000 0000번지로 복사한 프로그램이 0x0번지에 위치하게 되어서벡터 테이블의 위치도 변하지 않아 예외처리 시에 아무런 설정 없이도 문제없이 동작하게 되며데이터 영역이 값을 변경하기에 용이한 SDRAM에 위치하여전역변수의 변경이 실제로 이루어지게 됩니다.

 

※ 보다 쉬운 이해를 위해 다음 페이지부터는 REMAP과정을 도식화한 그림과 부트 소스 중에서 리맵 설정 부분(이 소스는 이해를 돕기 위해서 실제 저희가 사용하는 REMAP 소스의 일부를 수정한 소스입니다.), s3c2510a Datasheet REMAP 설정 부분을 첨부하였습니다.






 

 

 

2. LED 켜기.

 

2-1. PIN 찾기.

250 컨트롤러 이네이블 레지스터

 

2-2.PIN 레지스터



248

avr ATmega는 포트 하나에 On Off 둘다 같이 사용했다.

 그럼 다른 기능을 쓸 때 뒤에 것이 앞에 것을 덮어써 버렸다

 => 그래서 PORTA= PORTA| 0x01 ; 이런식으로 중복해서 사용했다.

 =>그럼 읽어와서 다시 덮어 쓰기 형으로 일이 많아 진다.

ARM 은 그 과정이 없이 On/Off 를 따로 써서, 한 과정 안에 같이 표현한다.

enable 에 0 ->작동 안함 1->작동

DISable 에 0 ->작동 안함 1->작동불가

그래서 다른 포트의작동에 영향을 받지 않는다.

 

 

 

 

* 프로그램 동작은 내일 아침에 추가합니다ㅠㅠ

728x90