

주소를 보면 0x0(0x20) 같이 이상한 2가지 주소가 존재한다. 왜 이런식으로 주소를 사용하는지 생각해 보자
1. 하버드 구조의 특징
2. virtual 메모리 방식
1.하버드 구조

아두이노는 코드가 담기는 flash 메모리와 다양한 주메모리 역활을 하는 sram 2가지 메모리를 가진다 이러한 방식의 구조를 하버드 구조라고 한다. 이는 아두이노 와 같이 8bit cpu 에서 처럼 표현할 수 있는 메모리 주소가 적을데 많은 양의
메모리를 다룰 때 효율적이다. 또한 코드에서 명령을 읽어 들이고 메모리에서 변수를 가지고와서 처리를 동시에 할 수 있음으로 속도 면에서도 우월한 장점을 가지고 있다.
하지만 flash 메모리 도 0x0 번지를 가지고 sram 또한 0x0 번지를가진다. 그렇다면 cpu에게 어떻게 메모리의 0x0 번지에 있는 데이터를 가져오라고 명령 할 수 있을까 ?
이를 해결하기 위해서 cpu 는 다른 종류의 명령어를 사용한다.
예를 들어서 flash 메모리에 접근 할때는 (가져와 0x0 ) 이라고 명령 한다면 sram 에는 (이리와 0x0) 이라고 명령하는 것이다.
여기서 가져와 , 이리와는 똑같은 동작을 수행하지만 어느 메모리에서 수행할 지를 결정해준다.
컴퓨터적으로는 똑같은 동작을 수행하는 다른 어셈블리 명령어를 주는 것이다. (사실 똑같진 않음)
2. virtual 메모리 방식
하지만 우리가 궁금한 0x0(0x20) 라 표현된 메모리 주소는 64 i/o register 부분이다. 이는 sram 안에 포함된 부분이다.
우리가 생각해야 될 또하나의 부분은 cpu 한테 는 사실 모든 메모리가 virtual 메모리인 것이다. 우리가 회로적으로든 소프트 웨어 적으로든 하나의 메모리를 2개로 분리 해놓는다면 cpu는 그냥 다른 메모리라고 생각한다.
펌웨어 같이 작은 메모리도 소중히 여기는 녀석들은 이러한 방식을 많이 쓰는데 아두이노는 sram 안에 주 메모리도 존재하고 , 범용 레지스터 , 그리고 i/o 레지스터 또한 존재하는 것이다.
때문에 0x0(0x20) 에서 앞의 0x0 은 i/o 레지스터를 별도의 하나의 메모리 공간으로 볼때 쓰는 주소로 in,out 명령어를 사용해서 접근 할 수 있다.
0x20 은 그냥 sram 하나의 메모리로 접근 할때 사용하는 명령어로 LDS , STS 와 같은 명령어를 사용 할 수 있다.
- 우리는 c 언어를 사용해서 접근 할 것이기 때문에 ( 어셈블리 명령어는 다루지 않음) 그냥 0x20 번지 주소를 사용해서 sram 메모리를 접근한다고 cpu 에게 알려줄것이다.)
- 질문
: datasheet 를 보면 out ,in 명령어가 lds sts 명령어 보다 빠르다고 나와 있다.
그렇다면 어차피 가상메모리 방식이고 lds sts 명령어로 모든 메모리 주소에 접근 할 수 있다면 그냥 out , in 명령어로 모든 주소에 접근 할 수 없나는 생각이 들었다 .
- 답

위 그림을 보면 회색과 흰색 부분이 있는데 흰색 부분은 atmega 시리즈의 모든 칩에서 호환 가능한 부분이라고 설명한적 있다.
때문에 칩에 따라서 회색 부분은 달라 질 수 있는데 모든 주소를 in,out 명령어로 접근한다면 심각한 오류를 범 할 수도 있다 . 이렇게 in, out 명령어는 접근 하는 메모리가 다름을 표시하는 기능 뿐만 아니라 호환 가능한 코드라는 것을 알리는 기능 또한 포함 한다.
-혹시 틀린점이 있다면 댓글로 알려주시면 감사합니다.
출처:
https://embed-avr.tistory.com/12
LED 제어 4
이번글에서는 AVR에서만 사용가능한 방법이 아닌 일반적인 방법으로 LED를 점멸하는 기능을 구현해 보도록 하겠다. 이번 글은 아직 임베디드 시스템 프로그램에 익숙하지 않은 개발자에게는 다
embed-avr.tistory.com
'공부,일 > atmega328P' 카테고리의 다른 글
| atmega 328p PWM & timer counter (1) 분주비 , 타이머 vs 카운터 (0) | 2021.07.27 |
|---|---|
| ISR() 분석 - 전처리문 분석 (0) | 2021.07.20 |
| EEPROM 사용하기 (0) | 2021.07.18 |
| Register 이용해서 LED 켜기 (0) | 2021.07.16 |
| ATmega328P 기본 개념 정리(기본기) (0) | 2021.07.15 |
댓글