반응형
[다시 쓰는 8051 따라하기] 8051 기초 - 메모리구조 2
+------------------------------------------------------+
게시장소 : 다음 tinyrobo
작성자 : Timy(me^^;)
작성일 : 2004.10.29
문의 : 다음카페 tinyrobo 혹은 블로그 http://electoy.cafe24.com/blog
+------------------------------------------------------+
## 8051 기초 - 메모리구조 2
/* 이번 강좌는 예전에 제가 적었던 강좌의 내용입니다. 조금만 고쳐서 그대로 올렸습니다. 똑같은 내용을 괜히 고생스럽게 또 칠필요는 없고, 그 시간에 조금 더 새로운 것을 다듬어서 올리는게 제 자신에게나 또 이 글을 볼 누구에게나 도움이 되리라는 생각에 말이죠. ^^ */
기본적으로 8051 을 공부함에 있어 8051 의 내부 메모리를 알 필요가 있다. 그러면서 동시에 또 한가지 주의해야 할 것은 내가 쓸 녀석에 대한 데이타도 가지고 있어야 한다는 것이다. 다시 말해서, 조금 쉬운 예를 들어보자. 윗 분(??)에게서 명령이 떨어졌다. 당장 미 대사관에 있는 클라크라는 사람에게 가서 미국 내 기업들의 2002년 실적과 향후 10년간의 전망에 대해서 조사해 오라고 한다.(직접 갈 일이지 귀찮게 왜 나한테 일을 시키고 그래 ㅜ.ㅜ ) 그러면 어떻게 해야 할까? 우선 기본적으로 영어를 해야 한다(영어 학원에라도 열심히 다니자!!). 또, 미국인을 대하고 그에게서 정보를 얻어 오려면 "미국"이란 나라와 그 나라 사람들에 대한 일반적인 지식을 가지고 있으면 많은 도움이 된다(미국에 대해 쓴 책을 한번 읽어보거나, 아니면 미국인들이 좋아하는 영화라도 한번 보러 갈까?). 거기서 그쳐도 괜찮겠지만, 보다 나은 결과를 얻고자 한다면 그 외에 클라크라는 사람에 대한 보다 구체적인 정보를 가지고 있는 것이 훨씬 좋은 결과를 낳게 된다(뒷골목에 가서 사립탐정하나 고용해라, 24시간 밀착감시를 시켜라, 혹시나 귀한 정보를 얻을지 누가 아나?).
미국 사람들은 자기들이 세계평화를 지키고 있다는 생각을 하고 있다(뉴스에서 본 미국). 그래서 그들이 벌이는 전쟁은 정당한 것이고, 그들에게 피해를 주는 행동은 모두 세계 평화를 위협하는 것이라고까지 생각한다(여러 평론가들의 일반적인 생각 참조). 그렇다면, 그런 그들의 비위에 거슬리지 않게 적당히 기분 좋은 말을 해주면, 클라크에게서 그가 알고 있는 정보를 쉽게 얻어 낼 수 있을 것이다. 또 여기에다가 덧붙여서 클라크가 개인적으로 좋아하는 초컬릿 케익이라도 하나 사가지고 간다면(열심히 클라크를 살핀 결과) 주변에 있는 사람들을 통해서 더 많은 정보를 얻게 될 수도 있다.
이처럼, 8051 을 공부함에 있어 클래식한 부분을 공부하는 것과 함께 자신이 직접 사용해야 하는 칩에 대해서도 같이 공부해 두는 것이 좋다. 여기서는 AT89S52 라는 칩을 중심으로 설명해 나간다.
우선 8051 의 내부 구조를 살펴보자. 여기엔 램과 롬이 있다고 했다.
램은 읽고 쓰기가 자유로와서 일반적으로 변수등을 여기서 넣고, 값이 바뀔때 마다 읽거나 쓰게 한다. 8051 에는 내부에 램이 128 바이트가 있다.(에게 ~~ 그거 밖에 없어? 내 컴퓨터엔 램이 128 메가나 되는데 ^^; -> 사실 내 컴퓨터에 있는 램은 그다지 많은 편 아니다 ㅜ.ㅜ) 내 컴퓨터에 있는 128 메가 (128 x 1000 x 1000)바이트 의 램도 별로 많은 것은 아닌데, 고작 128 바이트 밖에 없는 8051 을 어디다가 쓰나? ... 걱정된다... 내가 가진 사양 떨어지는 컴퓨터의 램보다 백만분의 일밖에 안되는 메모리를 가지고 있으니, 이걸 컴퓨터라고 불러야 하나? ...
어쨌거나 128 바이트라는 메모리는 8051 의 내부에 들어 있는 메모리다. 그러니까, 우리는 이 128 바이트의 얼마 안되는 메모리를 아주 조심스럽게 사용해야만 하는 것이다. 까딱 잘못하다간 128 바이트를 넘어서 메모리를 사용하게 프로그램을 짜면, ..... 내 프로그램은 바보같이 절반만 보여지는 프로그램이 될 수도 있다.... 예를 들자면 말이다... 열심히 LCD 에다가 글을 써주는 프로그램을 짰다. 그래서 거기다가 이런 글을 썼다. ....
"..... 우리 이제 더 이상 밖에서 만나지 말자 ............... 안에서 만나자, 결혼해줘 ~ ^^; " (그래 맞다 나 유치하다 왜? 나 유치한데 보태준거 있나? 나 그냥 이렇게 살다가 갈꺼니까, 그냥 그러려니 해라, 괜히 시비걸다 유치한 사람한데 먼지나게 맞는다 ^^@ )
근데, 이게 메모리를 잘못쓰는 바람에 절반이 잘려서 나오고 말았다.
"..... 우리 이제 더 이상 밖에서 만나지 말자 .........."
그 이후로 이 사람은 더 이상 8051 을 쳐다보지도 않았다는 전설이 있다. .... 다시말해 128 바이트의 메모리를 아껴서 쓰지 않는 사람은 연애하다가 이렇게 깨질수도 있다는 말이다. 메모리 아껴쓰기, 애인에게 귀염받는 지름길이다. 꼭 기억하자~~
자, 지난 시간에 잠간 이야기했던 것 2진수, 10진수, 16진수에 대해서 잠간만 언급한다. 아마 알만한 사람은 다 알 내용을 또 구차하게 설명한다. 혹시나 모를 사람 때문에 그러는 거니까, 아는 사람은 조용히 다음으로 넘어가라, 괜히 시비걸지 말고... -_-
십진수는 우리가 일반적으로 쓰는 숫자들이다.
1270원 그러면 우리는 당연히 천원짜리 지폐와 백원짜리 두개, 십원짜리 7개의 조합을 생각한다.
그런데 기계들의 세계에서 10진수는 그다지 환영받는 숫자집합이 아니다. 기계들에게 10진수보다 좋은 것이 있는데, 그것은 바로 2진수다. 10진수는 모든 자리수가 10개의 숫자들로 분류되는 반면 (생각해봐라 x 명 그러면 몇 명인가? 0명에서 9명사이다. 즉, 0부터 9까지 10개의 숫자가 한자리를 나타낼수 있다), 2진수는 한자리에 차지하는 숫자는 0과 1 두 개 뿐이다. 이게 왜 좋은가? 0은 전기를 흐른다. 1은 전기가 흐르지 않는다로 표시할 수 있기 때문에 그렇다. 이쯤에서 AND , OR , 기타 디지탈 논리 게이트들을 설명하면 좋겠지만, 그건 독학에 맡기겠다. 그것까지 다루면 이 강좌 몇 년 걸릴게다. 고작 8051 하나 알자고 몇 년 동안 공부하는 사람이 있을까? ... 그럴 시간 있으면, 차라리 연애를 하라고 권고해주겠다... ^^; 적당한 선에서 넘어갈 줄 아는 미덕이 필요한 세상이다....
그런데, 이 이진수는 너무나 길고 보기가 쉽지가 않다. 예로, 1270 을 이진수로 나타내면, 10011110110B 가 된다. 1이 몇 개고 0이 몇 개인지 살펴보려면 한참을 들여다봐야 한다. 기계야 좋을지 몰라도 보고있는 나는 짜증이 나기 시작한다. 그래서 등장하는 것이 이진수 4개를 하나의 묶음으로 가지는 16진수의 등장이다. 16진수는 각 자리수가 16개로 분할된다. 즉 2의 4승개로 분할된다는 것이다.
위에 나온 십진수 1270 을 한번 보자, 이걸 이진수로 고치면, 10011110110B 이 된다. 참고로 이진수는 뒤에 B 를 붙여서 이진수라는 것을 표시한다. 이걸 안붙이면 이게 이진수인지 아니면 십진수 10011110110 (백억 천백일만 백십일) 인지 구별할 수 없다. 그래서 이진수는 뒤에 B 를 붙여서 이진수라는 것을 분명히 표시해 준다. 그걸 다시 4개씩 나눠서 보자. 100 1111 0110 , 물론 뒤에서 부터 4개씩 나눠준다. 그랬더니 맨앞은 0100 (0은 있어도 그만 없어도 그만 이니까...) 그 다음은 1111 0110 이렇게 된다. 이걸 십진수로 고치면? 이진수 0100 은 4가 된다. 1111 은 15가 된다. 0110 은 6이 된다. 어떻게 아냐고? 이렇게 계산하면 된다.
0100 -> 0*2^3 + 1*2^2 + 0*2^1 + 0*2^0 = 4
1111 -> 1*2^3 + 1*2^2 + 1*2^1 + 1*2^0 = 15
0110 -> 0*2^3 + 1*2^2 + 1*2^1 + 0*2^0 = 6
그런데, 사실 각 부분을 나눠서 계산하는 건 의미가 없다. 2진수를 10진수로 고치려면 모든것을 한꺼번에 해야 한다.
100 1111 0110 -> 1*2^10+0*2^9+0*2^8+1*2^7+1*2^6+1*2^5+1*2^4+0*2^3+1*2^2+1*2^1+0*2^0
어떻게 계산하는지 알겠지? 모르겠으면 중학교 산수책 다시 들춰봐라 거기 잘 나올게다. 잘 모르겠거든 꼭 그렇게 해라, 괜히 모르면서 아는척 적당히 넘어가지 마라. 모르는 게 죄는 아니다. 모르면서 아는척 하는 인간이 많은것이 우리 사회의 고질적인 문제다. 말이 나왔으면 또 한마디 하자. 요새 툭하면 디지탈이 어쩌고, 인터넷이 저쩌고 한다. 그 말이 어느정도 IT 쪽에 대해서 알고, 아니면 관심이라도 있는 사람들이 하는 말이면, 환영한다. 그런데,.... 이상하게 아는것도 없어 보이는 정치인들이 그런 말을 해대는 걸 보면, ... 대체 저 인간이 자기가 하는 말을 얼마나 알고 하고 있나? 하는 생각이 든다. 디지탈의 세계는 0과 1로 구분되는 세계다. 이 세계에서 흑백이 분명하다. 이것은 참이 아니면 거짓이다. 그 둘 사이의 모호한 경계는 허락되지 않는다. 그것이 바로 이 디지탈이라는 세계의 철학이다. 그런데, .... 디지탈의 의미는 전혀 망각한 채 그저 인터넷에서 글 몇자 쓰면 그게 디지탈 정치라고 생각하는 인간들이 이 나라에서 정치를 하고 있으니,... 한숨이 절로 나온다. 인터넷에서 게시판에 글을 쓰면 그게 디지탈 정치고, 우편으로 개선사항을 글로 적어보내면 그건 아날로그 정치인가? 디지탈 정치라고 한다면, 그건 지금까지 했던 구태의연함을 버리고, 분명하게 이것 아니면 저것의 선택이 분명해야 하는 것이 아닐까? 지금까지 했던 그 구태의연함을 가지고 그걸 email 로 쓰고, 게시판을 쓰고, 홈페이지를 만든다고 그게 과거를 청산한 디지탈 정치가 된다고 믿고 있는 한심한 부류의 사람들을 보고 있자니 한숨이 나서 이 글에 한 부분을 또 쓰레기처럼 버리고 말았다. .... 어쨌거나 우린 다음으로 넘어가자...
2진수를 10진수로 고치는 것도 사실, 그렇게 간단하지는 않았다. 그런데 2진수를 16진수로 고치면 어떻게 될까? 이번에 이상하게도 간단하게 하는 방법이 있다. 16진수 표시방법은 두가지가 있다. 한가지는 이진수처럼 숫자 뒤에 H 를 붙이는 방법과 또 다른 방법은 숫자앞에 0x 를 붙이는 방법이다.
0000 -> 0H
0001 -> 1H
0010 -> 2H
0011 -> 3H
0100 -> 4H
... 나머지는 직접 해 봐라 ..
1001 -> 9H
1010 -> AH (십진수 10과 같은 크기가 16진수에서는 A라고 표현한다)
1011 -> BH
1100 -> CH
1101 -> DH
1110 -> EH
1111 -> FH
16진수는 0부터 F까지 16개의 숫자로 구성된다. 그리고 마지막 F는 이진수 1111 과 같은 값이다. 그러니까, 이진수를 16진수로 표시할때는 앞에서 이진수를 10진수로 표시할 때 했던 방법을 쓰는 것보다 이진수를 4개씩 묶어서 하나의 16진수로 생각하면 된다는 말이다.
0100 -> 0*2^3 + 1*2^2 + 0*2^1 + 0*2^0 = 4(십진수) = 4H
1111 -> 1*2^3 + 1*2^2 + 1*2^1 + 1*2^0 = 15(십진수) = FH
0110 -> 0*2^3 + 1*2^2 + 1*2^1 + 0*2^0 = 6(십진수) = 6H
(이진수) 010011110110 B = (16진수) 4F6 H
변환방법이 매우 간단하다. 메모리 구조에서 보통 16진수를 많이 쓰고, 또 앞으로 프로그램을 할때도 16진수는 기본으로 아주 익숙해져 있어야 한다. 그래야, 메모리를 아껴서 잘 ~~ 쓸수 있고, 애인하고 깨어지는 불상사도 없어진다. ~~ ^^;
메모리 구조를 이제 들어가보자.
램에 있는 128 바이트의 메모리를 말했었다. 바이트라 함은 8개의 비트가 모여서 하나의 바이트라고 말한다. 그럼 비트는? 그래 맞다, 스틱으로 드럼을 한번 '탕' 하고 내리치는 그것을 비트라 한다. 다시말해 비트는 0과 1 둘중의 하나를 선택할 수 있는 최소의 단위라고 보면 된다. 1비트의 메모리가 있다는 말은 방이 한칸 남아 있는데, 그 방은 딱 한 사람만 들어갈 수 있는 방이란 의미다. 방에 사람이 들어가면 그것은 1이라는 신호를 가진것이고, 방이 비어 있으면 0이라는 신호를 의미한다.
그렇게 방이 8개 있는 것을 1 바이트라고 한다. 1바이트는 8비트니까, 1바이트로 표시할 수 있는 크기는 2^8 즉, 256이 된다. 왜 이러냐고? 중학교 책부터 들춰보면 된다.
[ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]
위에 8개의 비어있는 방이 있다. 그렇지?
각 방에 사람이 들어가고 들어가지 않고를 각 1과 0이라는 신호를 써서 표현 할 수 있다.
모두 비게 되면? 0000 0000
모두 차게 되면? 1111 1111
그래서 모든 경우의 수는 0x00(십진수0) 부터 0xFF(십진수255) 까지 즉, 256 가지가 되는 것이다.
나중에 보면 char 이라는 변수를 선언해서 쓰는 것이 있다. 그건 이 메모리를 8비트만 잡아서 그걸가지고 변수를 저정하겠다는 게다. 16비트를 잡아서 쓰겠다는 것도 있다. 또 32비트를 잡아서 쓰겠다는 놈도 있다. 무조건 많이 잡아 쓰는게 좋은게 아니다. 그러다가 얼마안되는 메모리 바닥나고 프로그램이 이상하게 동작하는 경우가 발생한다. 적어도 8051 같은 녀석을 프로그램하는 사람이라면 메모리 한바이트가 아니라, 한 비트까지도 아껴서 꼭 써야 할 곳에 쓸 줄 아는 지혜가 필요하다.
이진수, 십진수, 16진수, 바이트, 비트, 기타 쓸데 없는 노가리풀다가 시간 다 보냈다. 나, 그만 자러가야겠다. 나중에 계속 한다. (심심해 지면 돌아온다 ^^v)
+------------------------------------------------------+
[끝]
반응형