임베디드 보드에 부착된 각종 주변 장치에 대한 제어 프로그램 작성을 위해서는 먼저 이들 장치에 대한 주소를 알아야 한다. 임베디드 보드에서의 LED 장치는 프로세서의 주소버스를 디코딩하여 주소가 결정된다.


LED 장치 주소가 0x0C00 0C00번지라고 가정하여 제어 프로그램을 작성해보자 



led.h소스 



#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define CS3_BASE 0x0c000000
#define LED_OFFSET 0x0C00

unsigned char *CS3_base;
unsigned char *led;

static int fd;

led.h 소스에는 기본 헤더 파일들과 임베디드 보드에서 설정된 LED를 가리키기 위해 프로세서의 chip select 신호의 기본 주소인 0x0C00 0000을 CS3_BASE로 정의하고 있다. 또 이 기본 주소에서 LED 장치 주소와의 차이값인 0x0C00을 LED_OFFSET에 정의하고 있다. CS3_base는 chip select 신호의 기본주소를 가리키는 포인터 변수이고, led는 LED 장치 주소를 가리키는 포인터 변수이다.

led.c 소스

#include "led.h"

int memopen(void)
{
   fd = open("/dev/mem",0_RDWR);
   if(fd<0){
       perror("/dev/mem FAIL!\n");
       exit(1);
  }

return 0;
}

int ledaddr(void)
{
  CS3_base = (unsigned char *)mmap(NULL,1024,PROT_READ|PROT_WRITE,MAP_SHARED,fd,CS3_BASE);
    if((int)CS3_base == -1){
            perror("mmap FAIL! \n");
            return -1;
   }
   led = CS3_base + LED_OFFSET;
   return 0;
}

void memrelease(void)
{
  munmap((unsigned char * )CS3_base,1024);
}

void outled(int sel)
{
 switch(sel){
      case 0:
          {
               printf("LED data = 0xFF\n");
               ledaddr();
               *led = 0xff;
               memrelease();
               break;
          } 
       case 1:
   ........생략.......

       case 2:
  ......
   }
 }

int main(void)
{ 
  int i;
  memopen();

for(i =0; i<10;i++){
  outled(0);
  sleep(1);
  outled(1);
  sleep(1);
  outled(2);
}
  close(fd);
}

위의 led.c 소스에서 fd = open("/dev/mem",0_RDWR); 는 /dev/mem 파일을 열어 파일 기술자를 반환한다. /dev/mem 파일은 O_RDWR 모드로 열리며 이 파일은 메모리 입/출력을 하기 위한 문자 디바이스 파일이다. 

open() 함수에 의해서 반환된 파일 기술자는 변수 fd에 할당되고, 이 값을 아래 mmap() 함수의 파라미터로 사용해 CS3_BASE 주소에 해당하는 현 프로세스 메모리 주소를 구한다.


이 mmap() 함수는 CS3_BASE주소를 가리키는 현 프로세스 주소 공간에서의 주소값을 변수 CS3_base에 리턴한다 

led_addr = CS3_base + LED_OFFSET; 여기서 베이스 주소와 LED 장치와의 오프셋 값인 LED_offset을 베이스 주소에 더하여 변수 led에 LED 장치의 주소를 얻게 된다. 


 *led = oxff; 여기서 실제 LED 장치로 값을 출력한다.. 


* mmap함수


 리눅스/유닉스에서는 프로세스와 프로세스 사이의 보호를 위해 각 프로세스는 서로 별도의 주소 공간을 가지게 된다. 이를 위해서 CPU가 하드웨어적으로 지원하는 MMU(Memory Management Unit)가 필요하며 32비트급 임베디드 시스템용 프로세서는 대부분 MMU를 가지고 있다. 각 프로세스가 별도의 주소 공간을 가지면 한쪽 프로세스에서의 잘못된 동작이 다른 쪽 프로세스에 영향을 미치지 않으므로 프로세스의 보호는 잘 이루어지지만 프로세스와 프로세스 사이에 데이터를 전달하거나 공유할 경우 별도의 대책이 필요하다.


 각 프로세스가 별도의 주소 공간을 가지면 한쪽 프로세스에서의 잘못된 동작이 다른 쪽 프로세스에 영향을 미치지 않으므로 프로세스의 보호는 잘 이루어지지만 프로세스와 프로세스 사이에 데이터를 전달하거나 공유할 경우 별도의 대책이 필요하다. LED 장치의 주소는 물리주소 공간에서 0x0C00 0C00으로 되어 있으나 현 프로세스 주소 공간에서의 주소 0x0C00 0C00는 서로의 주소공간이 다르므로 실제 LED 장치를 가르키는 것이 아니다. 이를 위한 여러 방법 중 하나가 mmap()함수를 사용하는 것이다. mmap() 함수는 현 프로세스의 메모리 공간을 파일이나 공유 메모리 특정영역으로 맵핑시킨다. 파일은 운영체제에서 글로벌 자원이므로 다른 프로세스와 공유가 가능하다. 따라서 파일로 맵핑된 메모리 영역은 프로세스 사이의 데이터 교환에 사용될 수 있다.




블로그 이미지

종환 Revolutionist-JongHwan

github.com/alciakng 항상 겸손하자.

댓글을 달아 주세요

ARM 아키텍처는 임베디드 기기에 많이 사용되는 RISC 프로세서이다. 저전력을 사용하도록 설계하여 ARM CPU는 모바일 시장에서 뚜렷한 강세를 보인다.


ARM 프로세서 명령어 세트 


데이터 처리 명령어 세트


ex) ADD {condition} {S} Rd, Rn, shifter_operand 


덧셈 명령으로써 두 개의 오퍼랜드(Rn, shifter_operand)를 서로 더해 결과를 목적지 레지스터 Rd에 저장한다. 조건(condition) 부분은 플랙에 따른 명령어 실행 조건을 의미한다.


Load/Store 명령어 세트


Branch 명령어 세트


기타 명령어 세트


PXA 시리즈 프로세서


pxa 시리즈 프로세서는 인텔 32비트 Xscale RiSC 코어를 기반으로 하고 여러 주변 장치를 탑재한 임베디드 시스템용 프로세서이다. CPU 부분인 Xscale은 ARM 버전 5구조를 기반으로 하며 비교적 저전력에 고성능을 제공한다. PXA2xx 시리즈와 PXA3xx 시리즈가 있다.


(학교 임베디드 시스템 수업 PXA255 사용함)


PXA 255는 주변 장치 인터페이스를 위해서 시리얼 통신을 위한 UART 포트, MMC 카드 기능, USB 1.1 클라이언트 기능, 적외선 시리얼 통신을 위한 IrDA, 오디오 코텍, 시리얼 통신 기능인 I2C 등을 가지고 있다. UART는 표준 UART, FF UART, 블루투스 UART를 모두 지원한다. 


GPIO


PXA255는 모두 85개의 GPIO 핀 신호를 가지며 각 핀은 입력이나 출력으로 설정될 수 있고 인터럽트 요청 라인이나 UART의 신호들, LCD 디스플레이를 위한 데이터 라인 등 각종 외부 장치와의 연결이나 인터페이스로 사용한다. 대부분의 GPIO는 단순히 디지털 입출력뿐만 아니라 부가적인 기능을 추가로 가진다. GPIO 핀의 각 기능을 설정하고 사용하기 위한 GPIO 레지스터들의 이름과 기능은 다음 표와 같다. 


GPDR(GPIO PIN Direction Register)  - 입출력 방향 설정 레지스터


이 레지스터는 핀 방향, 즉 입출력 방향 설정 레지스터로서 GPIO 핀을 입력 또는 출력으로 설정할 것인지를 결정한다. 0이면 입력으로 설정되어 GPLR을 통해서 GPIO 핀 상태를 읽을 수 있고 1이면 출력으로 설정되어 GPSR이나 GPCR을 사용해 '1'이나 '0'을 출력할 수 있다. 


GAFR(GPIO alternate function register) - Alternate 기능 설정 레지스터


GPIO 부가기능을 설정한다. 


GRER() - 상승 에지 검출 레지스터


이 레지스터의 입력 핀 상태가 LOW에서 HIGH로 되면, GEDR의 해당 비트가 "1"로 된다. 단 GPDR의 해당 비트가 "0"으로 되어 있어 입력 상태여야 하고, GAFR의 해당비트가 "0"으로 되어 있어 부가기능을 사용하지 않는 상태이어야 한다.



GFER(GPIO Falling edge detect register) - 하강 에지 검출 레지스터 


이 레지스터의 입력 핀 상태가 high에서 low로 되면 gedr의 해당 비트가 '1'로 된다. 단 gpdr의 해당 비트가 '0'로 되어 있어 입력 상태이어야 하고, GAFR의 해당 비트가 0으로 되어 있어 부가기능을 사용하지 않는 상태이어야 한다.



GPSR(GPIO Pin output set register) - 출력 '1' 설정 레지스터


이 레지스터에 "1"을 설정하면 해당 핀은 HIGH 상태로 되고 "0"을 설정하면 해당 핀은 변화 없이 이전 상태를 유지한다. 


GPCR(GPIO Pin output clear register) - 출력 '0' 설정 레지스터


이 레지스터에 "1"을 설정하면 해당 핀은 LOW 상태가 되고, "0"을 설정하면 해당 핀은 변화 없이 이전 상태를 유지한다. 


GPLR(GPIO PIN-LEVEL REGISTER) - 입력 레벨 검출 레지스터


이 레지스터는 GPIO의 핀에 인가된 전압 레발 값을 가지므로 현재의 입력핀의 상태를 읽을 수 있다. 전압 레벨이 LOW이면 0으로 HIGH 이면 "1"로 읽힌다. 


GEDR(GPIO edge detect status register) - 입력 에지 검출 레지스터


GPDR해당 비트가 "0"으로 되어 있어 입력 상태이어야 하고, GAFR의 해당 비트가 0으로 되어 있어 부가기능을 사용하지 않는 상태에서 GRER이나 GFER의 해당 비트가 설정되어 있을 경우 상승/하강 에지가 발생하면 해당 비트가 "1"로 되고 이때 인터럽트를 발생시킬 수도 있다. 

블로그 이미지

종환 Revolutionist-JongHwan

github.com/alciakng 항상 겸손하자.

댓글을 달아 주세요

* 포워딩과 라우팅


포워딩 - 패킷이 라우터의 입력 링크에 도달했을 때 라우터는 그 패킷을 적절한 출력링크로 이동시켜야 한다.


라우팅 - 송신자가 수신자에게 패킷을 전송할 때 네트워크 계층은 패킷 경로를 결정해야 한다. 이러한 경로를 계산하는 알고리즘을 라우팅 알고리즘이라 한다.


포워딩은 라우터가 입력 링크 인터페이스에서 적당한 출력링크 인터페이스로 데이터그램을 전송하는 내부적인 동작을 말한다. 반면에, 라우팅은 네트워크 전반에 걸쳐 출발지에서 목적지까지 데이터그램의 종단간의 경로를 결정하는 것이다.


라우팅 알고리즘은 라우터 포워딩 테이블에 삽입되는 값을 결정한다.


패킷 스위치(링크 계층 스위치) - 링크 게층 프레임의 필드값에 근거하여 포워딩을 결정한다. 


라우터 - 네트워크 계층 필드값에 근거하여 포워딩을 결정한다.


* 가상회선과 데이터그램 네트워크 


데이터그램 네트워크(비연결형) - 데이터 그램 네트워크는 각 패킷의 전달 경로가 다를 수 있다. 이 때문에 목적지에 도착하는 패킷의 순서가 송신지에서 보낸 순서와 맞지 않을 수 있기 때문에, 목적지에서 패킷의 재조합이 필요하다. 송신지와 목적지 경로를 설정할 필요없이 그냥 목적지 주소만 넣어서 패킷을 보내면 된다. 또한 고정된 경로만을 이용하는 것이 아닌, 네트워크 상황에 따라 일부 경로에 장애가 생긴 경우 다른 경로를 사용하여 목적지까지 전송될 수 있다.


가상회선 네트워크(연결형) -  가상회선 네트워크는 송신지에서 목적지로 패킷을 보내기 전에 전달될 패킷이 이용할 경로를 미리 예약한다. 패킷을 전달하기 전에 경로를 설정해야 한다는 부담이 있지만 한번 경로가 설정되면 송신지에서 목적지로 전달되는 패킷들은 순서가 보장되어 전달되기 때문에 목적지에서 재조합 될 필요가 없다.


* 라우팅 기법의 분류


정적 라우팅 기법 - 정적 라우팅 기법은 입력된 라우팅 정보가 재입력을 하기 전까지 변하지 않고 고정된 값을 유지하는 라우팅 기법이다. 전체 네트워크에 대한 라우팅 정보를 관리자가 수동으로 입력해 준다. 만일 네트워크의 규모가 커져서 연결된 라워의 숫자가 늘어나게 되면 관리자가 입력해야 할 정보도 함께 늘어나게 되는 것이다.


동적 라우팅 기법 - 동적 라우팅 기법은 정적 라우팅 기법에서 라우팅 정보를 네트워크 관리자가 일일이 입력해야 하는 불편함을 해결한다. 라우팅 프로토콜은 라우터가 가지고 있는 라우팅 정보를 인접한 다른 라우터들과 자동으로 교환할 수 있게 해준다. 하나의 라우터의 라우팅 정보고 네트워크상의 모든 라우터들로 전파된다.


디폴트 라우팅 기법 - 임의의 라우터가 패킷을 수신하게 되면 라우팅 테이블 상 네트워크 주소를 검색하여 수신된 패킷을 어디로 보낼 것인가를 결정하게 된다. 이와 같은 라우터에 디폴트 라우터가 설정이 되어 있다면 라우팅 테이블에 등록되어 있지 않는 주소를 갖는 패킷들은 디폴트 라우터에서 지정된 경로로 전송된다.


* 영역에 따른 라우팅 프로토콜의 분류 


1. AS(자치시스템) 

  독자적인 관리체계와 동일한 운영정책을 가지는 네트워크 집합이다. 예) ISP


2. IGP

  하나의 AS내에서 라우팅 정보를 교환하는 데 사용되는 프로토콜이다.


3. EGP

  AS와 AS 간의 정보를 교환하는 데 사용되는 프로토콜이다.


IGP 에는 RIP, IGRP, OSPF 프로토콜이 있으며

EGP 에는 BGP가 잇다. 


* 라우팅 알고리즘 


- 거리벡터 알고리즘 - 각 라우터가 인접해 있는 라우터와 경로설정 정보를 교환하여 네트워크의 구성이나 장치 배치에 관한 모든 정보, 즉 네트워크 토폴로지에 관한 정보를 교환하는 구조를 말한다. 이때의 라우팅 메트릭에는  네트워크 지연시간, 대역폭, 신뢰성, 부하율등이 고려된다.


거리벡터 알고리즘은 비교적 간단해서 쉽게 설정할 수 있다. 그러나 네트워크 규모가 점점 커지게 되면 네트워크 정보에 관한 프로세스 처리나 통신량이 많아져서 네트워크에 부담이 가중된다. 거리 벡터 알고리즘은 기본적으로 인접 라우터가 어떤 정보를 가지고 있는 지 고려하지 않기 때문에 네트워크 토폴로지 변화에 대한 경로설정 정보의 재편성과 같은 사태에 대해 진단하지 못한다는 단점이 있다.또한,라우팅 테이블 전파속도가 느리며 RIP의 경우 최대 Hop Count15를 넘지 못하며, 라우팅 테이블에 대한 정보를 주고받을 때 네트워크 대역폭을 많이 소비하고, 대규모 네트워크에는 적당하지 않다.


라우팅 테이블에 변화가 생겼을 경우 이 변화된 내용을 다른 라우터가 인식하는데 까지 걸리는 시간을 컨버전스 타임(Convergence time)이라 한다.


- 링크상태 알고리즘 


한 라우터가 목적지 네트워크로 가는 모든 경로에 대한 정보를 모두 가지고 있는 방식

- 라우터는 먼저 어디에 어떤 네트워크가 있는지, 그 네트워크로 갈려면 어떤 라우터를 통과해야 하는지에 대한 정보를 토폴로지 데이터베이스로 만든다.

SPF(Shotest Path First) : 라우터는 이렇게 만들어진 토폴로지 데이터베이스를 기초로 하여 어떤 경로로 가야 가장 빠른 길인지를 계산하는데 이때 사용하는 알고리즘이며, SPF TreeSPF의 계산의 결과물이다.

절차 : 라우터간의 정보를 취합하여 토폴로지 데이터베이스 생성->SPF 알고리즘을 이용해 가장 빠른 경로 계산

-> SPF 트리 생성->라우팅 테이블 생성

목적지 경로를 다 알고 있기 때문에 어떤 한 경로에 문제가 생기더라도 알아내는 시간이 훨신 짧다. 또한 주변의 라우터들과 라우팅 테이블을 주고 받을 때 변화가 있는 부분만 주고 받기 때문에 네트워크 트래픽 발생도 적다.

단점 : 각각의 라우터가 모든 경로에 대한 정보를 다 관리해야 하기에 메모리 소비가 심하고, SPF 계산등 연산할 일이 많기 때문에 CPU에 부담을 준다.

대규모 네트워크에 설치되는 고성능 라우터에 적합한 방식이다.

대표적인 링크 상태 알고리즘에는 OSPF(Open Shortest Path First)가 있다.


* 라우팅 프로토콜 구현 사례


- 역내 라우팅 프로토콜의 예(IGP)


RIP - 거리,벡터 라우팅 기법을 사용하는 가장 보편적인 프로토콜로, 라우터가 가지고 있는 모든 라우팅 정보를 다른 라우터에 주기적으로 전송한다. 그러나 이는 홉의 제한을 소규모나 중간규모의 네트워크에 적합하다.


OSPF - OSPF 라우팅 프로토콜은 최근에 주목받고 있는 경로설정 프로토콜이다. OSPF는 동일한 AS 내에서 사용되는 IGP이며, RIP의 문제점을 해결하기 위해 고안된 링크 상태 프로토콜이다. 


- 역외 라우팅 프로토콜의 예(EGP)


EGP - 경로제어 정보를 교환하는 두 IP 라우터가 서로 다른 두 AS에 속할 때 이를 역외환경이라 한다. 이와 같이 역외환경에서 라우터가 도착 가능성 정보를 다른 AS에 알리기 위해 사용하는 프로토콜이 EGP이다.




* OSPF 라우팅 프로토콜 


- OSPF의 라우팅 계위


OSPF에서는 RIP와 달리 라우팅 알고리즘을 적용하기 위한 계위구조를 취한다. 자치시스템은 공통적인 라우팅 정보를 공유하면서 하나의 관리 체제에 의해 관리되는 네트워크의 집합으로 정의된다. AS는 다시 여러 개의 서브네트워크로 나누어지고, 연속적인 네트워크 및 접속된 시스템들의 집합으로 구성된다. 하나의 AS내에서 서브네트워크을 연결해주는 네트워크를 '백본 네트워크'라고 한다. 


내부라우터 - 서브네트워크에 직접 접속한 라우터이며 백본 네트워크에 접속한 라우터도 이 범주에 속한다.


영역경게 라우터 - 서브네트워크와 백본 네트워크를 연결시켜주는 라우터


백본 라우터 - 백본 네트워크에 접속한 모든 라우터 


AS 경계라우터 - 다른 AS 속한 라우터와 경로 정보를 주고 받는 라우터









'이론 > 컴퓨터통신' 카테고리의 다른 글

Network Layer(L3)  (0) 2015.10.17
Transport Layer(L4)  (0) 2015.10.17
Application Layer(L7)  (0) 2015.10.14
컴퓨터 네트워크 개론  (0) 2015.10.13
블로그 이미지

종환 Revolutionist-JongHwan

github.com/alciakng 항상 겸손하자.

댓글을 달아 주세요