1991년에 핀란드의 대학생 리누스 토발스(Linus Torvalds)는 ‘리눅스’라고 이름지은 운영체제 커널을 개발하기 시작하였다. 리눅스라는 이름도 재밌게도 ‘Linux Is Not UniX’의 글자들을 딴 것이다. (GNU와 유사한 일종의 말장난) 이 커널은 자유로이 수정될 수 있고 매우 유용한 운영체제를 만들기 위해 FSF 산물과 다른 컴포넌트들 (특히 BSD 컴포넌트들의 일부와 MIT 의 X 윈도우 소프트웨어)과 병합될 수 있었다.


[그림 1] 리누스 토발스


 근래에 들어서는 쉬운 설치, 보다 많은 하드웨어 지원, KDE나 GNOME같은 GUI 데스크탑까지 지원 함으로서 일반 컴퓨터에 익숙한 사용자들이 집에서 PC에 설치 하기에도 무리가 없다.


 리눅스 공동체의 여러 조직들은 사용할 수 있는 컴포넌트들을 다르게 조합하였는데 각 조합은 ‘배포판’으로 부른다. 널리 알려진 배포판으로는 데비안(Debian), 우분투(ubuntu), 민트(mint),  레드햇(Red Hat), 페도라 등등이 있다. 인터넷으로 접속하는 많은 서버들의 운영체제가 리눅스이고 안드로이드와 같은 운영체제 역시  리눅스 기반으로 만들어졌으므로 리눅스는 우리 생활 전반에 보이지 않게 사용되고 있다고 할 수 있다.



[그림 2] 리눅스 배포판의 종류들


 리눅스의 특징은 다음과 같다.


  • 다중  플랫폼 지원. (인텔CPU, ARM, Sun Sparc, PowerPC 등)

  • 다양한 하드웨어 장치 지원.

  • 이식성이 뛰어남. (C언어 기반으로 프로그래밍과 포팅이 용이)

  • 다중 사용자(multi-user)가 동시에 사용할 수 있는 환경 제공.

  • 다중 작업(multi-tasking) 환경 제공.

  • 트리 형태의 계층적으로 구성된 파일 시스템.

  • 풍부한 소프트웨어 개발환경 제공 - 거의 모든 프로그래밍 언어 지원.

  • 강력한 네트워킹 기능 제공.

  • 오픈소스이고 무료로 제공되어 사용하는데 아무런 제한이 없다.


특히 리눅스는 서버(server) 영역과 임베디드(embedded) 시스템 영역에서 막강한 영향력을 가지며 모바일 운영체제와 최근에는 데스크탑 운영체제로도 주목을 받고 있다. 개인 PC용으로는 우분투(ubuntu)와 민트(Mint)가 널리 알려져 있으며  소형 임베디드 시스템에서 상대적으로 가벼운 데비안(Debian)이 많이 사용된다.


 Linux는 이미 검증받은 안정성으로 인하여 PC, 서버, 모바일기기 등의 OS로 널리 사용되고 있으나 초보자들이나 혹은 윈도같은 특정 GUI환경에만 익숙한 사용자들이 진입하기에는 다소 어렵게 느껴질 수 있다.


리눅스 강좌 전체 목록 >>>


c{linux},n{ln0004}

'맥,리눅스,윈도' 카테고리의 다른 글

리눅스의 파일 시스템  (0) 2015.05.16
리눅스의 커널(kernel)과 쉘(shell)  (0) 2015.05.16
자유 소프트웨어 재단 (FSF)의 설립  (0) 2015.05.16
유닉스(unix) 소개  (1) 2015.05.16
운영체제 개요  (0) 2015.05.16
Posted by 살레시오
,

 스톨만(R. Stallman)은 1971년 MIT 인공지능연구소 연구원 시절 처음으로 소프트웨어를 접했다. 그가 속한 연구팀은 PDP-10 이라는 컴퓨터에서 동작하는 시분할 운영체제(OS)를 어셈블리어로 개발했다. 그 당시만 해도 누구나 그 OS의 소스코드를 얻을 수 있었으며 수정하여 사용하는데 제약이 없었다.


 하지만 이후에 컴퓨터 제작사에서 제공하는 새로운 운영 체제를 사용하는데 있어서 이러한 자유는 더이상 허락되지 않았다. 상업적인 회사가 제공하는 하드웨어를 작동시키는 소프트웨어를 사용하는데 있어서 그 소스 코드를 보거나 수정할 수 없으며 그러한 일을 하지 않겠다는 합의서(비밀 유지 합의서)에 서명을 해야만 했다. 특히 같은 연구소에서 교류를 하던 연구원들이 심볼릭스(symbolics)라는 회사를 차리고 기존의 자유 소프트웨어를 그들만의 독점 소프트웨어로 바꾸는 작업을 적극적으로 시도했다.


 결국 1985년 3월에 스톨만은 ‘GNU 선언문’을 발표했다. GNU(그뉴)란 `GNU는 유닉스가 아니다'를 의미하는 영어 표현인 `Gnu is Not Unix'를 구성하는 단어들의 첫자를 따서 만든 약어이다. GNU는 유닉스와 완벽하게 호환되는 소프트웨어 시스템의 이름이며, 원하는 모든 사람이 자유롭게 사용할 수 있도록 만들어진 것이다. 이는 유닉스에 대항하여 자유로운 대안을 만들기 위한 스톨만의 의지와 동기를 역설한 것이다.


FSF의 창시자 Richard Stallman


 그리고 얼마 후 그는 비영리 기과인 자유 소프트웨어 재단(FSF)를 설립했다.  1989년에는 ‘일반 공동 사용 허가서(GPL)’ 내에 카피레프트(copyleft)의 개념을 적용하였다. GPL은 가장 널리 알려진 강한 카피레프트 사용 허가이며, 이 허가를 가진 프로그램을 사용하여 새로운 프로그램을 만들게 되면 파생된 프로그램 역시 같은 카피레프트를 가져야 한다. 이러한 철학에서 GPL은 컴퓨터 프로그램을 이용하는 사람에게 자유 소프트웨어의 권한을 누리며 카피레프트를 사용함으로써 그러한 자유가 보전되고, 심지어는 그러한 작업이 변형되거나 추가될 수도 있는 자유마저 있다.


카피레프트(copyleft)란 독점적인 의미의 저작권(copyright)에 반대되는 개념이며, 저작권에 기반을 둔 사용 제한이 아니라 저작권을 기반으로 한 정보의 공유를 위한 조치이다. 카피레프트를 주장하는 사람들은 보통, 지식과 정보는 소수에게 독점되어서는 안 되며, 모든 사람에게 열려 있어야 한다고 주장한다. 카피레프트는 정보를 사용할 권리를 2차저작물의 저작자에게 전달하며, 또 이러한 권리의 전달을 막지 않을 것을 주요 요건으로 삼고 있다.



 스톨먼은 자유로이 사용될 수 있고, 읽혀질 수 있고, 수정될 수 있고, 재배포될 수 있는 소프트웨어의 의미로 ‘free’를 사용했다. FSF는 C컴파일러(gcc), 텍스트 에디터 (emacs)와 많은 기본적인 도구를 포함해 엄청나게 많은 유용한 컴포넌트들을 성공적으로 구축하였다.


 그러나 1990년대 FSF는 OS 커널을 개발하는데 어려움을 겪었으며 커널이 없다면 그들의 나머지 소프트웨어들은 소용이 없었을 것이다. (커널 - 쉘이나 응용프로그램에 기본적인 서비스를 제공하는 OS의 핵심적인 부분)





'맥,리눅스,윈도' 카테고리의 다른 글

리눅스의 파일 시스템  (0) 2015.05.16
리눅스의 커널(kernel)과 쉘(shell)  (0) 2015.05.16
리눅스(Linux) 소개  (0) 2015.05.16
유닉스(unix) 소개  (1) 2015.05.16
운영체제 개요  (0) 2015.05.16
Posted by 살레시오
,

유닉스(UNIX)에 대해서 이해하기 전에 40여년 전의 시간으로 돌아가서 그 시대의 기술에 대해서 알아볼 필요가 있다. 그 시대의 컴퓨터는 집을 꽉 채우거나 심하면 운동 경기장만한 크기를 가지고 있었다. 크기보다 더 큰 문제는 컴퓨터마다 운영체제(OS)가 달랐다는 점이다. 특정 시스템에서 돌아가는 소프트웨어는 반드시 커스터마이즈 과정을 거쳐야 했으며 한 시스템에서 돌아가는 프로그램은 다른 시스템에서는 동작하지 않았다. 또한 어떤 시스템으로 작업을 수행할 수 있는 기술자가 다른 시스템을 다룰 수 있는 것이 아니었다.


또한 컴퓨터는 굉장히 고가의 기기였으며 한 시스템을 구입하여 사용자들이 작동법을 익혔다 하더라도 추가적인 비용이 드는 구조였다. 컴퓨팅 파워를 사용하기 위해서는 막대한 비용이 소요되었다. 기술적으로 진보가 이루어지지 않았으므로 그러한 사이즈의 컴퓨터를 가지고 작업을 이후로도 십 몇년 동안이나 더 해야만 했었다.


 그러던 중 1969년에 AT&T의 Bell 연구소에 근무하는 데니스리치(Dennis Ritchie)를 포함한 기술자팀이 이러한 호환성 문제를 해결하기 위해서 작업을 시작하였다. 이들은 MULTICS라는 운영 체제(1964년에 개발된 시분할 개념을 도입한 초기 운영 체제)의 여러 개념을 구현해 보기 위해 켄톰슨(Ken Thomson)과 함께 PDP-7이라는 컴퓨터 시스템을 이용하여 새로운 운영 체제를 만들기 시작하였다.



[그림 1] Dennis Ritchie with the PDP-7


이들이 개발하는 운영체제는 다음과 같은 사항들을 지향했다.


  1. 간결하면서도 명쾌하다.

  2. 어셈블리어 대신 C언어로 작성한다.

  3. 코드를 재사용할 수 있어야 한다.


벨연구소 개발자들은 그들의 프로젝트를 “UNIX”라고 명명했으며 1972년에 PDP-11/45기종으로 초기의 유닉스를 이식하면서 OS를 C 언어로 다시 작성하였다.


코드의 재사용성은 매우 중요한 개념이다. 그 당시 시판되는 모든 컴퓨터 시스템들은 그 시스템에서만 사용되는 프로그램을 이용하였다. 반면 유닉스는 커널(kernel)이라고 불리는 작은 부분의 시스템 적용 코드만 요구되었다. 유닉스 운영 체제와 모든 기능들은 이러한 커널 위에 구축되었으며 고수준 언어인 C언어로 개발되었다. C언어 자체가 유닉스 시스템을 개발하기 위한 목적으로 만들어졌다. 이러한 새로운 기술로 인해 서로 다른 컴퓨터 시스템을 동작시키는 운영 체제가 훨씬 더 용이하게 만들어 질 수 있었다. 더불어서 C언어도 대표적인 프로그래밍 언어로 자리매김되었다. 그리고 1979년에 유닉스 7번째 버전 V7 이 발표되었으며 이는 모든 현존하는 유닉스 시스템의 대부격이 되었다.


소프트웨어 판매사들은 이러한 신기술을 재빨리 채용하여 추가적인 노력없이도 열 배 이상의 소프트웨어를 팔아치울 수 있었다. 사용자는 시스템이 바뀌어도 추가적인 교육이나 노력없이도 작업을 계속할 수 있었다. 유닉스는 서로 다른 기종에 같은 사용자 환경을 성공적으로 제공하였다.


그 다음 20여년이 지나는 동안에도 유닉스 개발은 계속되었다. 다양한 기능이 추가되었고 하드웨어나 소프트웨어 판매사들은 그들의 제품에 유닉스를 지원하게 되었다. 초창기에는 유닉스는 메인프레임(mainframe)이나 미니컴퓨터(minicomputer - 서버나 워크스테이션)에 적용되었다. (여기서의 미니컴퓨터는 중소형 시스템을 지칭하는 것이고 현재의 PC는 마이크로컴퓨터에 해당된다.) 일반인이 유닉스 시스템을 접하려면 대학 연구소에서 일하던가 정부 기관이나 대형 금융회사 같은 곳에서 일을 해야만 했다.


 유닉스가 유명해지자 유닉스를 모방한 많은 운영체제들이 나타났는데, 이들을 표준화하기 위해 POSIX라는 표준이 등장했다. POSIX 표준을 만족하는 것들을 유닉스 계열 운영체제라고 한다. 리눅스, Mac OS X가 대표적인 유닉스 계열 운영체제이다. 대부분의 리눅스 배포판들은 POSIX의 거의 모든 상세스펙을 따르고 있다.


소형 컴퓨터들이 그 이후에 개발되었으며 80년대 후반에는 많은 사람들이 가정용 컴퓨터(PC)를 갖게 되었다. 그 시점에서는 PC를 위한 몇몇 유닉스가 있었지만 무료로 자유롭게 사용할 수 있는 운영 체제는 없었고 속도가 매우 느렸다. 그래서 많은 이들인 MS DOS 나 윈도우즈3.1 을 사용하였다.





'맥,리눅스,윈도' 카테고리의 다른 글

리눅스의 파일 시스템  (0) 2015.05.16
리눅스의 커널(kernel)과 쉘(shell)  (0) 2015.05.16
리눅스(Linux) 소개  (0) 2015.05.16
자유 소프트웨어 재단 (FSF)의 설립  (0) 2015.05.16
운영체제 개요  (0) 2015.05.16
Posted by 살레시오
,

 운영체제(Operating System, 이하 OS)는 사용자와 컴퓨터 하드웨어 사이의 소프트웨어 인터페이스를 지칭한다. OS는 프로그램 실행을 제어하고 다양한 리소스들(CPU, 메모리, 디스트, 디스플레이, 키보드, 마우스 등등)을 관리한다.


[그림 1] OS의 개념도


 운영 체제는 어디에나 있다. 주변에서 일상적으로 접할 수 있는 OS로는 다음과 같은 것들이 있다.


  • 윈도우즈 (PC의 OS)

  • 안드로이드 (구글 스마트폰의 OS)

  • iOS (애플사 아이폰의 OS)

  • OS X (애플사 맥PC의 OS)

  • 리눅스 (PC및 서버의 OS)


이들 중에서 안드로이드는 모두 리눅스와 연관이 있으며 OS X, iOS 는 BSD 라는 OS 계열이다. 그리고 리눅스와 BSD 모두 유닉스(unix)에서 유래되었다.




'맥,리눅스,윈도' 카테고리의 다른 글

리눅스의 파일 시스템  (0) 2015.05.16
리눅스의 커널(kernel)과 쉘(shell)  (0) 2015.05.16
리눅스(Linux) 소개  (0) 2015.05.16
자유 소프트웨어 재단 (FSF)의 설립  (0) 2015.05.16
유닉스(unix) 소개  (1) 2015.05.16
Posted by 살레시오
,

 디지털 신호(digital signal)은 이진 표현을 사용한다. 특히나 uC(마이크로컨트롤러) 프로그래밍에서는 이진수와 16진수를 많이 취급하게 되며, 이들 숫자를 조작하는 방법을 아는 것도 중요하지만 이에 앞서서 이진수와 16진수에 대한 개념을 이해하는 것도 중요하다.


이진수 (binary number)


 이진수 시스템은 두 수 (0,1)를 갖는 기수 2 시스템이다. 11010.11과 같은 이진수는 1과 0의 열과 2진 소수점으로 표현된다. 2진수와 같은 값을 갖는 10진수는 기수 2를 갖는 거듭제곱 수의 나열로 숫자를 확장해서 찾을 수 있다. 예를 들면



[표 1] 2의 거듭 제곱


  [표 1]에 2의 거듭제곱 을 기록하였다. 이 중에서 2의 10승까지는 외우는 것이 앞으로 프로그래밍하는데 있어서 여러모로 편리하다. 또한 8자리 이진수의 최대값은 255, 16자리 이진수의 최대값은 65,535 라는 것도 알아두면 나중에 C언어 변수의 가용 범위를 계산할 때 유용하다. 그 이상은 2의 10승이 약 1,000이라는 사실로 부터 추산할 수 있다.


 이진수에서 각 자리의 수를 비트(bit)라고 한다. 비트가 0일 때는 십진수로 변환하는 합에 영향을 미치지 않는다. 그러므로 10진수로의 변환은 비트가 1인 2의 거듭제곱수의 합으로 얻을 수 있다. 예를 들면 다음과 같다.


마이크로프로세서(혹은 컴퓨터 작업 시)에서는 2의 10승을 K(kilo), 2의 20승을 M(mega), 2의 30승을 G(giga), 그리고 2의 40승을 T(Tera)라고 한다. 따라서



이다.


16진수 (hexadecimal number)


 16진수를 사용하여 이진수를 더 간결하게 표현할 수 있는데 네 자리의 이진수를 한 자리의 16진수로 표현할 수 있기 때문이다. 그러므로 디지털 시스템에서는 2진수를 기술하기 위해 16진수를 많이 사용한다.

 16진수는 15까지 한자리로 표현되고 16이 되면 두 자리로 넘어간다. 따라서 10진 시스템에서 가져온 0, 1, 2, … 8, 9 등 열 개의 숫자와 10, 11, 12, 13, 14, 15를 하나의 숫자로 표현하기 위해 사용되는 문자 A, B, C, D, E, F를 갖는 기수 16 시스템이다.


[표 2] 십진수, 이진수, 팔진수, 16진수의 관계


[표 2]에 16진수 0부터 15까지를 이진수와 팔진수로 표현한 것을 기술하였다. 이중에서 이진수와 16진수와의 관계는 눈여겨 보아야 한다. 이진수에서 16진수로의 변환은 2진 숫자를 소수점부터 시작하여 왼쪽과 오른쪽으로 4자리씩 구분하여 쉽게 얻어진다.



십진수로의 변환


 십진수에서 이진수로 변환하는 편리한 방법은 주어진 십진수를 반복해서 2로 나누어서 그때마다 나머지를 써두고, 그 몫을 다시 2로 나누는 방법을 몫이 0이 될 때까지 반복한 후 아래에서부터 위로 나머지를 읽어가는 방법이다.


 예를 들어 십진수 103을 이진수로 변환하면 다음과 같다.



따라서 가 된다.


 이번에는 0.125 같은 십진수의 소수값을 이진수로 변환시키는 방법을 알아보자. 주어진 소수값에 2를 곱한다음 그 결과값이 1을 넘으면 1을 써두고 1을 넘지 않으면 0을 써둔 다음 그 너머지 소수값에 다시 2를 곱한다. 이것을 소수값이 없어질 때까지 반복한 다음, 써둔 결과를 위에서 부터 읽어 내려간다. 즉,



십진수에서 팔진수 혹은 16진수로의 변환도 8 혹은 16으로 나누고 곱한다는 것만 빼고 위와 동일하게 얻어진다.


보수 (complementary number)


 디지털시스템에서는 음수를 표현하기 위해서 2의 보수(2‘s complement)를 사용한다. 1의 보수(1’s complement)는 0과 1을 서로 바꾸어서 얻을 수 있다. 즉 0→1, 1→0으로 변환하는 것이다. 예를 들어서



n개의 자리수를 가진 이진수 N이 주어지면 그것의 2의 보수는 N이 0이 아닐때이고 N=0 일 때 0으로 정의한다. 2의 보수는 1의 보수에 1을 더하여 얻을 수 있다. 예를 들어



또한 2의 보수는 최하위자리 0과 첫 번째 자리 1을 모두 변하지 않게 하고 다른 모든 상위자리 비트에 있는 1을 0으로, 0을 1로 바꾸어 만들 수 있다. 그래서 1101100 의 하위 자리수에 있는 2개의 0과 첫번째 1을 그대로 두고 다른 4개의 상위자리의 비트를 0을 1로 1을 0으로 바꾸어서 0010100 를 얻을 수 있다. 보수의 보수가 원래의 값을 갖는다는 것도 중요한 사실이다.

 앞에서도 밝혔듯 디지털 시스템에서는 2의 보수로서 음수를 표시한다. 예를 들어 8bit 숫자 체계에서 -10을 얻으려면 +10의 2의 보수를 구하면 된다. 즉 00001010 의 2의 보수인 11110110 이 -10이 되는 것이다. 이러한 개념은 감산 하드웨어를 간략하게 하는데 매우 유용하다.


[표 3] 8비트 수의 2의 보수


따라서 8비트로 부호있는 정수는 -128 부터 +127까지 표현할 수 있다.


ATmega8(A) 강좌 전체 목록 >>>


c{am8},n{a8m0005}

'하드웨어 > ATmega8(A)' 카테고리의 다른 글

ATmega8(A)의 개략적인 특징  (0) 2015.06.03
AVR 개요  (0) 2015.06.03
마이크로컨트롤러의 I/O 장치들  (0) 2015.05.16
디지털 시스템의 메모리(memory) 분류  (0) 2015.05.16
마이크로프로세서의 분류  (0) 2015.05.16
Posted by 살레시오
,

 디지털 시스템은 프로세서만으로는 구성되지 않는다. 프로세서는 사람으로 비유하면 두뇌의 역할이고 이 프로세서와 데이터를 주고받는 외부 장치들이 있기 마련이다. 이렇게 프로세서와 데이터를 주고받는 외부장치들을 I/O 장치라고 하며 I/O는 입력(input)과 출력(output)의 줄임말로서 디지털 시스템에서 널리 쓰이는 용어이다.


 흔히 볼 수 있는 PC의 예를 들면 D램, HDD, ODD, 키보드, 마우스, 모니터, 프린터 등이 I/O장치에 해당되며 이들 장치는 모두 CPU와 데이터를 주고받으며 특정한 기능을 수행한다. 이 주변장치들은 프로세서 외부에 있을 수도 있고 프로세서와 같이 하나의 칩으로 만들어질 수도 있다.


 uC(microcontroller)에서 주변장치는 크게 메모리와 기타 장치로 구분할 수 있다. 메모리는 사용자가 작성한 프로그램과 데이터를 저장하는데 이용되고, 기타 장치의 예는 입출력포트, 타이머/카운터, analog-to-digital 변환기 (ADC), 직렬통신장치 등이다. 대부분의 프로세서는 위와 같은 주변장치와 통신을 위해서 두 가지로 구분되는 서로 다른 어드레스 영역을 가진다. 여기에서는 기타 장치에 대해서 간략하게 알아보도록 하겠다.


I/O 포트

 I/O 포트(port)는 프로세서와 외부 장치 간 신호를 주고받는 통로를 의미한다. 이 I/O 포트를 통해서 외부의 센서라든지 스위치와 같은 장치에서 발생하는 신호가 프로세서로 전달되며, 혹은 프로세서에서 발생된 신호를 외부 장치로 내보낼 때에도 I/O포트를 이용한다. 보통 uC는 I/O포트가 칩에 내장되어 있는 경우가 많다. AVR의 경우에는 이 I/O포트가 칩에 내장되어 있어 외부에 별도의 장치를 연결할 필요가 없다.

[그림 1] I/O 포트의 역할 개념도


인터럽트(interrupt)

 프로세서가 어떤 작업을 수행하고 있는 도중에 특수한 이벤트가 발생하면 수행 중인 작업을 중단하고 발생한 이벤트를 처리한 다음, 이전에 수행하던 작업으로 되돌아가 나머지 작업을 계속 처리하게 된다. 이러한 ‘즉시 처리해야 하는 특수한 이벤트의 발생’을 인터럽트(interrupt)라고 한다. 인터럽트가 발생하면 uC는 그것을 처리하는 작업들이 수록된 함수로 명령 수행 과정을 옮기게 되는데 이 함수를 인터럽트 서비스 루틴 (interrupt service routine, 이하 ISR)이라고 한다. 인터럽트는 디지털 시스템에서 굉장히 중요한 비중을 차지한다. ATmega8(A)도 외부인터럽트 2개를 포함한 18개의 인터럽트 소스가 있다.


타이머/카운터 (timer/counter)

 타이머(timer)는 시간과 관련된 장치로서 특정한 시간에 신호를 발생한다던가 혹은 정해진 주파수로 이벤트를 발생한다든가 하는데 사용된다. 카운터(counter)는 계수와 관련된 장치로서 펄스의 수를 센다든다 혹은 외부에서 발생하는 이벤트의 횟수를 센다든가 하는데 사용된다. AVR의 경우 대부분 8비트 혹은 16비트 타이머/카운터를 내장하고 있어서 이러한 시간과 관련된 신호를 생성하거나 주기적으로 이벤트를 발생하는데 사용할 수 있다. AVR의 타이머/카운터에 대해서는 7장에서 자세히 다루도록 한다.


A/D 변환기 (analog to digital converter)

A/D변환기는 아날로그(analog)신호를 디지털(digital)신호로 변환하는 장치이다. 디지털 시스템에서는 보통 A/D변환이라고 하면 연속적인 전압값을 디지털값으로 변환하는 것을 말하는 경우가 많다. 자연계나 외부의 물리값(예를 들어 온도, 밝기 등등)을 센서(sensor)를 통해서 이에 비례(반비례)하는 전압을 띠게 하고 이 전압을 A/D변환기를 이용하여 디지털 값으로 변환한 후 프로세서가 사용하게 된다.

 AVR의 경우에는 이러한 A/D변환기를 내장하고 있는 경우가 많아서 외부에 A/D변환기를 별도로 연결할 필요 없이 편리하게 사용할 수 있다. ATmega8(A)의 경우에도 A/D변환기를 내장하고 있다.

ATmega8(A) 강좌 전체 목록 >>>


c{am8},n{a8m0004}

Posted by 살레시오
,

 메모리는 단어가 의미하는 그대로 데이터를 기억해주는 장치이다. 디지털 시스템의 모든 데이터는 1/0으로 표현되며 메모리 소자들도 이러한 이진 데이터를 기억하며 보통은 8개(바이트), 16개(워드) 등과 같이 이진 데이터(비트)를 8의 배수개로 묶어서 저장한다. 메모리는 크게 롬과 램으로 분류할 수 있다.

램 (RAM, random access memory)

 데이터를 일시적으로 저장하는 장치이다. 즉 램상의 데이터는 자주 변경되며 램에 전원이 인가되는 동안에만 그 데이터를 유지한다. 크게 SRAM (static RAM)과 DRAM (dynamic RAM)으로 나뉜다. SRAM은 재충전(refresh)이 필요 없고 속도가 빠른 반면 가격이 비싸다는 특징이 있다. 고속 동작이 요구되는 비디오 카드의 기억 장치로 사용된다. 반면 DRAM은 재충전이 필요하므로 속도가 SRAM에 비해 느린 반면 가격이 싸다는 특징이 있어서 PC의 메인 메모리로 사용된다.


[그림 1] 램의 예

롬 (ROM, read only memory)

 데이터를 영구적으로 저장하는 장치이다. 즉 롬상의 데이터는 특정한 작업을 하지 않는 이상 변경되지 않으며 롬에 전원이 인가되지 않더라도 저장된 데이터는 그대로 유지된다. 종류로는 마스크롬 (mask ROM), EP롬 (erasable programmable ROM), EEP롬 (electrically erasable PROM), 플래시EEP롬 (flash EEPROM, 보통 플래시롬이라고 함)등이 있다.


[그림 2] ROM의 예


● 마스크롬 (mask ROM)

 한 번만 구울 수 있는 롬이며 달리 칩 제조업체가 제품 출하 전에 굽는다.

● EP롬 (erasable and programmable ROM)

 칩 표면에 부착된 유리창을 통해 자외선을 쬐어 데이터를 지울 수 있으며 다시 전기적으로 롬에 데이터를 쓸 수 수 있다. 자외선 이레이져가 필요하고, 삭제하는데 많은 걸린다.

● EEP롬 (electriaclly erasable and programmable ROM)

 회로 상에서 전기적으로 지우고 다시 프로그램 할 수 있으므로 ISP가 가능하다. 주로 마이크로콘트롤러에서 시스템 매개변수(네트워크 주소, 시리얼번호 등)나 저장용으로 소형 EEPROM을 사용한다.


[그림 3] 롬라이터의 예

● 플래시롬(FLASH EEPROM)

 가장 최신 ROM 기술이고 시장 점유율도 가장 높다. ISP(in-system progrmamming, 시스템에 장착된 상태로 프로그래밍하는 것을 의미함)가 가능하고, 지우고 프로그램하는 속도도 상대적으로 빠르다. 소형 마이크로콘트롤러에서는 1-2메가 미만의 플래시들이 사용되고, 32비트 마이크로프로세서에서는 2메가 이상의 플래시들이 주로 사용된다.


메모리에 데이터가 저장되는 방식

 디지털 시스템에서의 데이터는 0/1로 표현되는 2진수이며 이를 비트(bit)라고 한다. 메모리는 이러한 데이터를 저장하는 물리적인 장치인데 8개의 비트를 묶어서 바이트(byte)라고 하고 이 바이트에 하나의 주소를 할당하면 8비트 메모리이다. 그리고 16개의 비트를 묶어서 워드(word)라고 하고 이 워드에 하나의 주소를 할당하면 16비트 메모리라고 한다. 각각의 바이트/워드는 최하위 비트부터 bit0, bit1, bit2, .., 와 같이 번호를 붙여서 참조한다.


 주소(address)는 특정한 데이터를 읽거나 쓰는 장소를 식별할 수 있는 번호인데 0번지 부터 시작하여 1번지, 2번지 와 같이 되어 있다. 마지막 번지가 몇 번지인가에 따라 메모리의 용량이 결정된다. 예를 들어 끝번지가 $FFF라면 16KByte메모리가 된다.


 다음 그림은 8비트 메모리의 예를 나타내며 본 교재에서는 b0~b7로 표기하여 각각의 비트를 참조하도록 하겠다.


[그림 4] 8비트 메모리 구조


 반면 16비트 메모리의 경우 2바이트(word)당 주소가 하나씩 할당되어 있으며 하나의 번지당 하위바이트와 상위바이트로 나뉘며 bit0~bit15로 각각의 비트를 지칭한다.

[그림 5] 16비트 메모리 구조


참고로 AVR의 경우 내장 메모리는 크게 프로그램을 저장하는 플래시 메모리와 SRAM, 그리고 EEPROM으로 나뉘는데 플래시메모리는 16비트 메모리이고 SRAM과 EEPROM은 8비트 메모리이다.


ATmega8(A) 강좌 전체 목록 >>>


c{am8},n{a8m0003}

Posted by 살레시오
,

 마이크로프로세서는를 크게 활용 분야와 내부 명령어 구조에 따라서 분류해 볼 수 있다.

활용분야에 따른 분류


① 범용 마이크로프로세서


 uP는 전술한 바와 같이 CPU의 기능 대부분을 하나의 반도체 칩에 집적한 것이다. PC에서 사용되고 있는 인텔의 펜티엄(pentium) 프로세서가 대표적인 범용 마이크로 프로세서이다. 마이크로프로세서 한 개만으로는 동작하지 않으며, 외부에 롬, 램 및 주변장치를 장착하기 위한 부가회로가 필요하다. 주변장치를 효율적으로 관리하기 위해 운영체제 (operating system, OS)가 필요하다.


[그림 1] 범용 마이크로프로세서의 예


② 마이크로컨트롤러 (micro-controller, uC)


 주로 기기의 제어 용도로 사용되는 프로세서로서 내부에 롬(ROM), 램(RAM) 및 I/O포트를 내장하여 간단한 외부 회로만으로 동작이 가능하다. 이 밖에도 기기를 제어할 때 많이 사용되는 부가회로들 즉, A/D(analog/digital) 변환기, PWM (pulse width modulation) 발생기, 타이머/카운터(timer/counter) 등을 프로세서 내부에 내장하고 있는 경우도 많다. 대표적인 8비트 uC로서 8051계열, PIC계열 그리고 AVR계열의 디바이스들이 있다.


[그림 2] 여러가지 마이크로콘트롤러


③ DSP (digital signal processor)

 많은 연산이 필요한 영상처리나 복잡한 실시간 제어에 uP를 활용하기 위해서는 그 여러 가지 기능 중에서 빠른 연산 속도가 가장 중요하다. DSP는 다양한 신호 처리 및 고속 연산에 유리하도록 특별히 제작된 프로세서로 하드웨어적으로 부동 소수점 (floating point) 연산기능, MAC (multiplication and accumulation, 덧셈과 곱셈을 한 사이클에 수행) 연산기능, 빠른 외부 메모리 인터페이스 등이 특징이다.


[그림 3] DSP의 예


내부 명령어의 구조에 따른 분류


① CISC (complex instruction set computer) 프로세서


 어떤 필요한 기능을 수행하기 위한 명령어가 프로세서에 지속적으로 추가되어 상대적으로 명령어가 복잡하고 많은 형태이다. 명령어의 길이가 가변적이고 다양한 주소지정 모드 (addressing mode)를 가진다. 현재의 마이크로 프로세서 아키텍쳐들 중에 x86과 m68k 아키텍쳐만이 CISC이다. 추가된 많은 명령어를 잘 활용하면 짧은 프로그램 코드로 빠른 결과를 얻을 수 있지만 프로세서 설계가 복잡해지는 단점이 있다.

② RISC (reduced instruction set computer) 프로세서


 1980년대에 RISC에 대한 연구가 미국의 버클리 대학과 스탠포드 대학에서 굉장히 활발하였고, 버클리 대학의 패터슨 교수가 RISC이라는 용어를 처음으로 만들어 냈다. RISC 프로세서는 CISC 프로세서의 복잡한 명령어들의 집합대신 자주 쓰이는 간단한 명령어들만 남겨두고, 대신 이러한 명령어들이 보다 빨리 수행될 수 있도록 프로세서를 설계한 것이다. 적은 명령어 수와 적은 주소지정 모드(addressing mode)를 가지며 명령어의 길이가 고정적이다. 이전에는 고성능의 워크스테이션에서 주로 사용되었으나 최근에는 간단한 마이크로컨트롤러, DSP 등에도 적용되고 있다.

ATmega8(A) 강좌 전체 목록 >>>


c{am8},n{a8m0002}

Posted by 살레시오
,

 마이크로(micro, 1/1000000)라는 말은 매우 작다는 의미를 내포하며 프로세서는 ‘어떠한 일을 처리하는 장치‘라는 뜻으로서 이 두 단어의 합성이인 마이크로프로세서 (microprocessor, 이후 uP로 표기함)는 단어의 뜻으로만 보면 ’극소형의 처리장치‘정도로 해석될 수 있을 것이다. 좀 더 기술적인 설명은 작은 면적의 실리콘에 복잡한 전자회로를 집적시킨 것으로, 이 전자회로는 미세한 도선으로 연결된 수천 혹은 수백만 개의 콘덴서나 트랜지스터(transistor) 등으로 구성되어 있다.


 인텔이 발표한 최초의 uP는 1971년에 소개된 4004로 2300개의 트랜지스터를 가지고 있었으며 클럭속도는 108KHz이고 4bit 프로세서이다. 이 μP는 간단한 계산을 수행하는 계산기를 만드는데 사용이 되었으나 그 이후에 발전에 발전을 거듭하여 개인용 컴퓨터를 탄생시키는 등 우리의 생활을 광범위하게 바꾸는 계기가 되었다.


 참고로 [그림 1]에 내부회로가 도시된 펜티엄3는 약 9백5십만 개의 트랜지스터를 집적하였음을 보면 마이크로프로세서의 발전 속도를 짐작할 수 있다.


[그림 1] 인텔의 4004 외형 / 인텔 4004 내부 회로 / 펜티엄4의 내부 회로


 일반적으로 uP는 [그림 2]에 도시된 바와 같이 레지스터(register), 산술논리장치 (arithmatic logic unit, ALU), 제어장치, 데이터버스 등의 구조를 가지며 이러한 기능을 가지는 장치들을 하나의 칩에 집적한 것이다.

[그림 2] uP의 구성 요소

레지스터 (register)

 레지스터는 CPU내부의 기억장치이고 ALU에서 수행한 연산의 결과를 임시로 저장하는 역할을 한다. 고속으로 데이터에 접근, 처리가 가능하며 외부메모리는 번지로 구별하는데 반해 레지스터는 이름으로 구별한다. 크게 범용레지스터 (누산기 등)와 특수 목적 레지스터(프로그램 카운터, 명령어 레지스터 등)로 나뉜다.

산술논리장치 (ALU)

 산술 및 논리 연산 수행하는 장치이다. 레지스터에서 피연산자를 받고 연산 결과를 다시 레지스터에 저장한다. 조합논리회로로 구성되어 있다.

제어장치

 CPU 내부의 신호의 흐름를 제어하는 신호를 발생한다.

각종 버스(bus)

 버스(bus)라는 것은 디지털 시스템에서 동일한 기능을 수행하는 신호선들의 집합이다. uP내부에서 하나의 신호선은 두가지 상태(0, 1)만을 가질 수 있다. 이러한 선이 여러개 모이면 다양한 경우의 수가 생겨서 여러 상태나 값을 가지고 전달할 수 있게 된다.

  • 데이터(data) 버스 : uP가 내외부의 메모리와 데이터를 주고받는데 사용하는 신호선이다.

  • 어드레스(address) 버스 : uP가 내외부의 메모리 번지를 지정하는데 사용하는 신호선이다.

  • 신호(signal) 버스 : uP가 수행할 작업의 종류 및 상태를 메모리나 입출력기기에 알려주고, 외부의 요구를 받아들이는 신호선이다.


 참고로 디지털 시스템(digital systme)에서는 전압값을 이용하여 0/1 신호를 구분한다. 신호 0은 0V (혹은 GND라고 표시함) 이고 신호 1은 5V/3.3V/1.8V 등의 전압값이 사용된다. 이러한 2진 신호를 여러 개 묶어서 어떤 정보나 데이터 값을 전달하게 되는 것이다. 2진 신호가 몇 개가 묶였느냐에 따라서 다음과 같이 구분한다.

  • 비트 (bit) : 0/1을 표시하는 최소 데이터 단위

  • 바이트 (byte) : 8 bits

  • 워드 (word) : 2 bytes = 16 bits

  • 더블 워드 (double word) : 2 words = 4 bytes = 32 bits


ATmega8(A) 강좌 전체 목록 >>>


c{am8},n{a8m0001}

Posted by 살레시오
,

1장 마이크로프로세서 개요
    1.1 마이크로프로세서란 개요
    1.2 마이크로프로세서 분류
    1.3 디지털 시스템의 메모리 분류 
    1.4 마이크로컨트롤러의 I/O 장치들
    1.5 디지털 신호를 표시하기 위한 2진수와 16진수

2장 AVR 개요
    2.1 AVR 마이크로컨트롤러 개요
    2.2 ATmega8(A) 소개
    2.3 ATmega8(A)의 세부적인 특징
    2.4 ATmega8(A)의 메모리 구조
    2.5 락 비트(lock bit)와 퓨즈 바이트(fuse byte)
    2.6 전원과 리셋(reset) 회로
    2.7 클럭 소스 (clock source)
    2.8 개발 환경 : atmel studio 소개
    2.9 오픈소스 다운로더 USBasp / USBaspLoaser
    2.A AVR툴체인의 자료형
    2.B AVR의 플래시롬에 데이터 읽고 쓰기
    2.C AVR의 EEPROM에 데이터 읽고 쓰기
    2.B 기본적인 라이브러리 함수 요약

3장 포트(port)를 이용한 기초 실험
    3.1 포트 개요
    3.2 LED를 이용한 포트 실험 (Part 1)
    3.3 헤더 파일 "Am8USBasp.h"의 구조
    3.3 
LED를 이용한 포트 실험 (Part 2)
    3.5 7세그먼트를 이용한 포트실험 (Part 1)
    3.6 
7세그먼트를 이용한 포트실험 (Part 2)

4장 인터럽트(interrupt)
    4.1 인터럽트 개요
    4.2 인터럽트 프로그래밍
    4.3 외부 인터럽트 설정
    4.4 외부 인터럽트와 스위치 실험 1
    4.5

5장 타이머/카운터
    5.1 타이머/카운터 개요와 T/C0 소개
    5.3 T/C0 의 레지스터와 프리스케일러
    5.3 T/C0를 이용한 실험

    5.4 T/C2 (8비트 타이머/카운터) 개요 및 기능
    5.5 T/C2의 레지스터와 프리스케일러
    5.6 T/C2의 정상 모드와 CTC 모드
    5.7 T/C2의 PWM 모드

    5.8 TC1 (16비트 타이머/카운터) 개요 및 기능
    5.9

6장 아날로그-디지털 변환(ADC)
    6.1 ADC 개요
    6.2 ADC 관련 레지스터들
    6.3 ADC 수행 절차
    6.4 CdS 광센서를 이용한 실습 예제
    6.5

'주제별 글목록' 카테고리의 다른 글

심파이(sympy) 강좌 목록  (0) 2015.06.03
파이썬(python) 기초 강좌 목록  (1) 2015.05.23
아두이노 강좌 목차  (3) 2015.05.17
리눅스(Linux) 강좌 목차  (2) 2015.05.16
C++ 강의 글 목록 (목차)  (2) 2015.04.21
Posted by 살레시오
,