일상다반사 로그

임베디드 리눅스 - LED 본문

IT/임베디드 리눅스

임베디드 리눅스 - LED

일상다반사로그 2017. 10. 11. 21:58
반응형

실습10 mmap 함수를 통한 가상번지 접근


- 실습목표 -

* 리눅스 시스템에서 파일이나 장치 디바이스를 메모리에 대응시키는 여러방법 중 하나인 mmap() 함수를 사용하여 파일 기술자를 통하여 특정메모리 주소를 액세스해 본다.

* 이 과정을 통해서 하드웨어 번지와 사용자가 사용할 수 있는 가상번지 간의 매핑을 이해하고 작성된 프로그램을 컴파일하기 위한 Makefile 작성법을 익힌다.


- 준비물 -

리눅스 시스템호스트, EmposII, 크로스 UTP LAN 케이블, RS-232C 직렬 케이블


- 실습내용 -


 임베디드 시스템이 적은 메모리와 일반컴퓨터처럼 완벽하게 구현된게 아니기 때문에 가상번지를 이용하여 메모리접근한다.


1. SRAM 하드웨어 번지를 정의한다.

        #define ADDRESSOFSRAM 0x0c000000 <-- 가상번지

2. 가상번지를 저장할 변수를 저장하고, open  함수로 fd를 얻는다.


3. mmap 함수를 이용하여 SRAM 영역의 가상번지를 얻어온다.

        addr_sram = mmap(NULL,1,PROT_READ,MAP_SHARED,fd,ADDRESSOFSRAM);

4. 얻은 번지의 내용을 확인하는 코드를 삽입한다.


5. Makefile을 작성하여 컴파일한다.

        파일명이 짧거나 작성이 간단할 경우 make 파일 작성안해도 된다.

6. 로더에서 SRAM 영역에 값을 넣은 후 위의 응용 프로그램으로 값을 확인한다.


실습11 LED 제어 프로그램


- 실습목표 -


* mmap 함수를 이용하여 LED 디바이스를 제어해 본다.

* LED 응용 프로그램은 사용자의 키 입력을 받아 LED가 왼쪽으로 혹은 오른쪽으로 시프트 되는 프로그램을 작성하고 작성된 프로그램을 컴파일하여 램 디스크에 적재하여 실행하거나, RS-232C 직렬 통신으로 전송하여 실행해본다.


- 실습내용 -


 타켓보드에는 8개의 SMD 형태의 LED가 있으며, PXA 255 CPU의 데이터 버스와 연결되어 특정번지에서의 데이터 비트 출력으로 LED의 On/Off 를 할 수 있다. LED 디바이스는 LED1에서 LED8RK지 각각 한 개의 비트에 대응된다. LED에 접근하기 위한 물리번지는 0x1060 0000dlek.

1. 프로그램 구성을 위해 필요한 헤더 파일과 외부 LED의 물리번지를 선언한다.

2. 매인함수내에 필요한 변수들을 선언한다.

fd - 메모리에 대한 파일 기술자, i - 반복에 사용할 변수, *led_addr - mmap에서 넘겨받을 외부LED 접근할 번지를 저장할 포인터, blink_count blink_delay - 반복에 사용할 변수, LED 상태를 유지할 변수

blink_delay 값이 작으면 LED가 너무 빨리 변화되어 LED 상태가 변화는 것을 눈으로 구분하기 쉽지 않다.


3. mmap 함수를 정의한다.

외부 LED에 접근할 주소를 led_addr 포인터에 저장하고 포인터를 얻지 못하면, 메모리 파일 기술자를 닫고 프로그램을 종료해야한다.

4. LED점등 프로그램

*led_addr = 0xAA로 LED를 초기화하여 LED를 off 시키도록 한다. blink_count만큼 led_status를 시프트시키면서, 외부 LED에 led_status를 출력한다.

5. LED 디바이스 해체

LED를 모두 끄고 munmap함수로 mmap에서 사용한 주소를 해제하고, 메모리파일 기술자를 닫고 프로그램 종료

반응형
Comments