반응형
[다시 쓰는 8051 따라하기] 8051 기초 - 메모리구조 3
+------------------------------------------------------+
게시장소 : 다음 tinyrobo
작성자 : Timy(me^^;)
작성일 : 2004.10.29
문의 : 다음카페 tinyrobo 혹은 블로그 http://electoy.cafe24.com/blog
+------------------------------------------------------+
## 8051 기초 - 메모리구조 3
/* 이번 강좌는 예전에 제가 적었던 강좌의 내용입니다. 조금만 고쳐서 그대로 올렸습니다. 똑같은 내용을 괜히 고생스럽게 또 칠필요는 없고, 그 시간에 조금 더 새로운 것을 다듬어서 올리는게 제 자신에게나 또 이 글을 볼 누구에게나 도움이 되리라는 생각에 말이죠. ^^ */
메모리 설명한다고 해놓고 여태까지 엉뚱한 곳만 긁다가 왔다. 다 알겠지만, 그래도 혹시나, 하는 노파심으로 기초적인 것들 설명했다. 너무 나무라지 말기 바란다. 같이 늙어가는 처지에 조금이라고 같이 공유하고 아는 것을 나누는 것이 필요하지 않겠나? ^^
참고로, 이 글쓴다고 나를 8051 에 대해서 대가라고 생각지는 말길 바란다. 그저 하다보니 8051 이라는 것에 손을 조금 대었고, 지금도 재미가 있어서 하고 있을 뿐이다. 왠만큼은 하니까, 질문해도 답할 꺼리들은 대충 있긴 하지만, 나도 모르는 부분이 없지 않아 있다. ^^ 특히, 다른 센서들을 달거나 외부에 뭘 붙이려고 할 때, ... 내가 해본 것 외에는 정확한 답을 줄 수 없다. 이해하지? ^^
내부 메모리가 128 바이트 있다는 말을 했었다. 그렇다면 128 을 16진수로 표시하면 어떻게 되지?
...
....
....
.....
......
.....
.....
....... 얼른, 계산해 봐라.....
.....
....
....
....
....
....
... 계산해 보라니까 !!! -_-
...
...
...
...
...
...
..
역시 끝까지 계산하길 싫어하는군... ㅜ.ㅜ
공부좀 해라..... 인간아.....
128을 16진수로 표시하면 80H 가 된다. 맞았나?
맞았으면 좋고, 틀렸어도 너무 머리탓하지 마라, .... 머리 나쁜게 조상탓이지 꼭 네탓만은 아니다...
그런데, 우리가 쓰는 숫자는 보통 1에서 출발하는데 컴퓨터에서는 0부터 출발하는 경우가 많다. 이건 프로그램 조금이라도 짜본 사람들은 쉽게 공감할 게다.
0부터 시작하면 128은 어디서 끝날까? 7Fh 가 끝부분이다.!!!
내부메모리 128 바이트는 0x00 부터 0x7F 까지 번지수를 가지고 있다. 물론 각 번지는 1바이트를 가지고 있으니까, 8비트를 가지고 있는 셈이다.
=================================
SFR 영역
(0x80 - 0xFF)
=================================
78 | OOOOOOOO | 7F : 일반메모리영역
.........(생략)..........
30 | OOOOOOOO | 37
=================================
28 | OOOOOOOO | 2F : 비트 어드레싱 영역
20 | OOOOOOOO | 27
=================================
18 | OOOOOOOO | 1F : BANK3
10 | OOOOOOOO | 17 : BANK2
08 | OOOOOOOO | 0F : BANK1
00 | OOOOOOOO | 07 : BANK0
=================================
# 내부램의 맨 바닥을 보면 레지스터뱅크라고 이름 붙여져 있는 곳이 보인다. 0x00 번지부터 0x1F 까지의 내부램은 레지스터인데, 4개의 레지스터에 속해있게 된다. 그래서 레지스터 뱅크라고 한다. 각 뱅크번호는 0번부터 3번까지다. 물론 아래서 부터 위로 번호가 붙여진다. ACC 레지스터 등이 이곳을 이용하게 되는데, 조금 특별한 영역이다. 어쨌거나 여기서는 이런 것이 있다는 정도만 알아두자. 제대로 사용하려면 PSW 라는 SFR 영역의 레지스터 값을 이용해야 하는데, 그건 나중에 기회가 되면 다시 말하기로 하자. 솔직히 말하지 않고 넘어갈지도 모르겠다. 언급하게 되면 어셈블러에 대해서 상당히 많은 양을 할애해야 하는데, .... 그렇게 하면 좋긴한데, 너무 딱딱해 질것 같기도 하고, 또 내 머리가 상당히 아파질것 같기도 해서 말이다... ^^;
# 그 다음 부분인 0x20 부터 0x2F 까지는 비트단위로 억세스가 가능한 부분이다. 램 용량이 적기 때문에 가능하면 램을 아껴쓰는게 좋다고 위에서 말했다(기억하겠지? ^^). 만약에 어떤 핀의 신호가 들어왔는지 아닌지를 판별하는데, 8개를 다 쓸 필요가 없고, 하나의 핀에서의 신호만 필요하다면 그때 그 신호를 8비트나 16비트짜리 변수를 선언해서 쓰면 낭비가 된다. 그럴때 여기 비트단위로 억세스가 가능한 램의 한쪽만 쓰면 램을 효율적으로 사용할 수 있게 되는 것이다.
0x20 부터 0x2F 까지 16바이트 인데, 각 바이트는 8비트 이니까, 16*8 = 128 비트가 된다. 이 영역을 억세스할때는 특별한 주소지정방식을 써서 0x00 부터 0x7F 까지 번지수를 가지게 된다. 단, 이 번지수는 바이트 번지가 아니라 비트 번지라는 걸 명심해야 한다.
# 0x30 부터 0x7F 까지 나머지 부분이 우리가 일반적으로 생각하는 바로 그 램 영역이 된다. 결국 일반 램 영역은 128 바이트 중에서 80 바이트밖에 되지 않는 것이다. 일반적으로 뒷 부분은 스택영역으로 쓰이고, 앞부분은 일반 레지스터나 변수용으로 사용된다. 스택영역은 일반 램 영역 아무곳이나 설정해서 쓸수 있지만, 스택이 커져서 이 영역을 벗어나면 곤란한 일이 발생할 수 있다. 이런 면에서 우리가 쓰는 89s52 는 내부 램이 128 의 두 배인 256 바이트가 된다. 그래서 이런 스택영역을 벗어나는 불상사를 겪을 위험을 많이 줄이게 되지만, 그래도 너무 안심하고 안이하게 메모리 관리를 해서는 봉변당하게 된다. 조심하자. ^^
# 마지막으로 0x80 부터 0xFF 까지를 주의깊게 봐야 한다. 이 부분은 내부 램이라고 하기는 조금 그런 부분이다. ^^
무슨 말인고하니, SFR , Special Function Register 라고 하는 영역으로 내부 램 위의 번지에 있으면 각 영역별로 고유한 이름을 가지고 있다.
[그림들어갈 자리-맨위 첫번째]
사실 위의 그림은 classic 8051 과는 조금 틀리다. AT89S52 의 SFR Map 을 넣었다. 클래식 SFR Map 은 다음과 같다.
===============================
|
| B |
|
| ACC |
|
| PSW |
|
|
| IP |
| P3 |
| IE |
| P2 |
| SCON | SBUF |
| P1 |
| TCON | TMOD | TL0 | TL1 | TH0 | TH1 |
| P0 | SP | DPL | DPH |
================================
좌우의 번지수는 위의 경우와 동일하다. 서로 잘 맞춰보면 AT89S52 에서 상당히 많은 부분들이 추가되었음을 알게 될 게다. 이 추가된 부분들은 취향에 맞게 써도 되고, 안 써도 된다. ^^ 그리고, 한가지 더, ... 위에서 비트별 억세스가 가능한 내부램의 영역이 존재했다. 여기서 맨 왼쪽에 있는, 음영표시된 부분은 비트별로 억세스가 가능하다.
SFR 의 특징은 직접 어드레싱이라는 방법으로만 쓸수 있다는 것이다. 어떤 번지에 값을 넣을때 두가지 방법이 있겠다. 하나는 방금 말한 직접 어드레싱(direct addressing) 이고, 다른 하나는 간접 어드레싱(indirect addressing)이다.
물론, ... 어셈블러를 모르겠지만, (사실 나도 잘 모른다 ^^;) 직접 어드레싱과 간접어드레싱은 다음과 같이 다르다.
MOV 60H , #3
; 직접 어드레싱 방법
MOV R0 , #60
MOV @R0 , #3
; 간접 어드레싱 방법
두 가지 모두 같은 결과를 가져온다.
첫 번째 것은 0x60 번지에 3이라는 값을 [직접]넣으라는 명령이고,
두 번째 것은 R0 라는 레지스터 뱅크를 이용해서 거기에 0x60 을 넣고, 다시 한번 R0 가 가리키는 번지(0x60) 에 3이라는 값을 넣으라는 명령이다.
위에서 두가지 모두 동일한 결과를 가져 오는데 왜 이런 동일한 결과를 두가지 방법으로 하게 해 두었을까? .... 이해가 잘 안될게다.. ^^; (가르쳐줄까? 말까? ^^;;;)
간단하게 이것만 생각하면 된다. 8051 에서 내부램은 128 바이트인데, 8052에서 내부램은 256 바이트이다. 즉, 8051 에서는 128 바이트를 모두 내부램으로 쓰고, 그 다음영역에 SFR 영역이 128 바이트가 있는데, 8052는 256 바이트의 내부램이 있음에도 불구하고 내부램으로 128만쓰고, 그 다음 영역은 SFR 영역이 되었다. 그럼,... 나머지 128 바이트는 어디 갔을까? ... ?? 어디 갔지? ... 누가 내 치즈를 ... 아니 내 128 바이트를 숨겼지? ??
이 8052의 나머지 128 바이트는 간접 어드레싱으로 사용할 수 있게 된다. 즉, 램의 앞부분 128 바이트는 직접 어드레싱이건 간접 어드레싱이건 같은 영역을 가르키게 된다. 위에서 본 예처럼 말이다. 그런데, 그 다음 128 바이트의 영역에서 간접 어드레싱을 사용할 경우 그것은 램의 나머지 숨겨진 128 바이트에 접근하게 되고, 직접 어드레심으로 번지수를 지정할 경우 SFR 영역의 번지로 가게 되는 것이다. 그럼, 이제 직접 어드레싱과 간접어드레싱을 언제 사용하는지 대충 알았을 게다. ^^
마지막으로 예전에 이야기 했던 것처럼, 난 도저히 128 바이트 램으로는 만족하지 못하겠다. 이것보다 더 많이 있어야겠다고 고집부리는 사람들에게 또 다른 방법이 있다는 걸 알려줘야겠다. ^^
바로 외부에 램을 다는 것이다. 외부에 추가하는 램은 기본적으로 64KB 까지 가능하다. (물론 약간의 방법을 쓰면 이보다 더 달수도 있다. 하지만 권하지 않는다.... 왠만하면 이 이상을 8051 에 투자하지 말자. 이정도만 해줘도 상당한 편이다...) 외부에 다는 램은 0x0000 부터 0xFFFF 까지 가능하다.
램만 달면 뭐하나? 프로그램을 돌리려면 당연히 프로그램이 들어있는 무언가가 8051 에 있어야 한다. 그게 바로 롬이다. 롬은 조그마한 칩안에 내가 만든, 혹은 누군가가 만들어준, 유용한 프로그램을 고이 간직하고 있는 작고 똑똑한 녀석이다. 이 녀석이 바로 8051 의 안에 가만히 웅크리고 있는 것이다. 자, AT89S52 는 내부에 플래시 메모리를 쓴다고 했다. 그래서 이 롬을 내가 쓰고 지울수 있다. 이 롬은 기본적으로 번지수 0x0000 부터 0xFFFF 까지의 값을 가질 수 있다.
어... ?? 램이 롬하고 번지수가 같네? ?? 이상하게 생각할 것 없다. "가질 수 있다"고 말했으니까, 그건 가져야만 한다는 의미가 아니라, 별다른 문제가 없으면 가질 수 있다고 말한 것이다. 램이 필요 없다. 그냥, 내부 램만으로 만족하다고 생각된다면, 그 사람은 롬을 64KB 까지 확장할 수 있다. 반대로 난, 롬은 아주 조금만 있으면 된다. 램이 많아야겠다고 생각하는 사람은 필요한 만큼만 롬영역으로 남겨두고 나머지를 번지를 모두 램으로 사용해도 된다.
이건 나중에 차차 공부하다보면 알게 되리라 생각한다.
위에서 설명한 것들을 차근 차근 생각하면서, 또 옆에 다른 책이 있다면 그 책에서 설명한 부분을 잘 들여다보면서 위 그림과 표를 한번 살펴보기 바란다. - 보라면 봐라, 자꾸 궁시렁 거리면... -,.-
램과 롬에 대해서 기본적으로 번지수를 나타내고 있다. 이걸 잘 기억해 두기 바란다. ^^
메모리에 대한 기초적인 사항들은 여기까지 하기로 하겠다. 물론 할 것이 더 많기는 하지만, 여기서 계속 이것만 하다가는 손님 다 떨어질 거 뻔하다. 손님 더 떨어지기 전에 조금 재미있는 것들을 하다가 다시 지루하지만 중요한 것들로 돌아갈 예정이다. ^^
+------------------------------------------------------+
[끝]
반응형