/* */
어셈블리에서 주석. 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의 경우에는) Flash의0x0번지의 리셋 벡터(초기화 코드)가 실행되면, 시스템 설정, 클록 설정, SDRAM 설정, Stack 설정 등을 한 후에(보통 C함수로 점프 하기 전에) 0x0번지(Flash)에 있는 부트 프로그램을 0x4000 0000(SDRAM)으로 복사합니다. (당연한 이야기지만, SDRAM으로 복사를 하기 위해서는 SDRAM 설정이 선행되어야 합니다.) 그 후에 ARM CPU의 SYSCFG 레지스터에 REMAP설정을Set하게 되면, ‘0x0 -> 0x8000 0000’, ‘0x4000 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->작동불가
그래서 다른 포트의작동에 영향을 받지 않는다.
* 프로그램 동작은 내일 아침에 추가합니다ㅠㅠ
'코스웨어 > 14년 스마트컨트롤러' 카테고리의 다른 글
프로젝트 발표 코멘트 - 손병규 (0) | 2014.07.04 |
---|---|
2014.07.03 업무보고 - 출석번호 21번 이재우 (12) | 2014.07.04 |
프로젝트 발표 고멘트-박영주 (0) | 2014.07.03 |
프로젝트 발표 코멘트 - 서상우 (0) | 2014.07.02 |
프로젝트 발표 코멘트 문대영 (0) | 2014.07.02 |
프로젝트 발표 코멘트 김화린 (0) | 2014.07.02 |
프로젝트 발표 코멘트 김진철 (0) | 2014.07.01 |
프로젝트 발표 코멘트 - 김해성 (0) | 2014.07.01 |