반응형

2015.9.6

다시 확인해보려고 실행시켜 봤는데 실행시키면 아래와 같은 에러가 뜨면서   

Bus error


dmesg 명령으로 확인해보면 아래와 같은 에러 메시지가 보였습니다.

Unhandled fault: external abort on non-linefetch (0x1018) at 0xb6f55134

아래 세 줄을 코드에 추가해주어야 에러 없이 정상적으로 수행이 됩니다.(http://stackoverflow.com/a/20874882)
system("echo 5 > /sys/class/gpio/export");
system("echo 65 > /sys/class/gpio/export");
system("echo 105 > /sys/class/gpio/export");



비글본 블랙 P8의 2번과 8번에 LED를 연결하고 Gpio2_3의 값을 변경해서 LED가 깜빡이게 해보았습니다.

이미지 출처 : http://www.ctrlinux.com/blog/?p=87

 

AM335x Sitara™ Processors데이터 시트의 Memory Map에서 확인한 GPIO2 시작 주소는 0x481AC000이고 크기는 4K입니다.

 

GPIO를 입력으로 사용할지 출력으로 사용할지 결정하기 위해서 필요한 레지스터로 원하는 비트를 0으로 설정하면 출력상태가 됩니다.

 

GPIO 출력 핀의 값을 설정하기 위해서 사용되는 레지스터입니다. 1로 세팅하면 LED가 켜지고 0으로 세팅하면 LED가 꺼지게 됩니다.

 

 

전체 소스코드입니다.

 

  1. #include <stdlib.h>  
  2. #include <stdio.h>  
  3. #include <sys/types.h>  
  4. #include <sys/stat.h>  
  5. #include <fcntl.h>  
  6. #include <sys/mman.h>  
  7.     
  8.     
  9. #define GPIO2_BASE 0x481AC000  
  10. #define GPIO_OE 0x134  
  11. #define GPIO_OUT 0x13c  
  12. #define PIN1 (1<<3)  
  13.     
  14.     
  15. int main()  
  16. {  
  17.     int fd = open( "/dev/mem", O_RDWR|O_SYNC );  
  18.     if ( fd < 0 ){  
  19.         printf( "can't open /dev/mem \n" );  
  20.         exit(-1);  
  21.     }  
  22.     
  23.     
  24.     char *gpio_memory_map = (char *)mmap( 0, 4096, PROT_READ|PROT_WRITE,  
  25.         MAP_SHARED, fd, GPIO2_BASE );  
  26.     
  27.     if ( gpio_memory_map == MAP_FAILED )  
  28.     {  
  29.         printf( " Error : mmap \n" );  
  30.         exit(-1);  
  31.     }  
  32.     
  33.         
  34.     volatile unsigned int* gpio = (volatile unsigned int*)gpio_memory_map;  
  35.     gpio[GPIO_OE/4] &= (~PIN1);  
  36.     
  37.     int i;  
  38.     for ( i=0; i<5; i++ )  
  39.     {  
  40.         gpio[GPIO_OUT/4] |= PIN1;  
  41.         sleep(1);  
  42.     
  43.         gpio[GPIO_OUT/4] &= (~PIN1);  
  44.         sleep(1);  
  45.     }  
  46.     
  47.     munmap( gpio_memory_map, 4096);  
  48.     
  49.     return 0;  
  50. }  


반응형

포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
댓글로 알려주시면 빠른 시일내에 답변을 드리겠습니다.

여러분의 응원으로 좋은 컨텐츠가 만들어집니다.
지금 본 내용이 도움이 되었다면 유튜브 구독 부탁드립니다. 감사합니다 : )

유튜브 구독하기


제가 쓴 책도 한번 검토해보세요.

  1. _FL 2016.04.14 13:36

    감사합니다 이게 mmap으로도 되는군요

  2. 2017.05.29 22:44

    비밀댓글입니다

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2017.05.29 22:56 신고

      우선은 다음 포스팅을 확인해보세요..
      작성한지 오래되서 지금하고 맞는지 모르겠네요..

      http://webnautes.tistory.com/698


      내용이 방대한데다 .. 저도 모르는 부분도 있고 해서 지금은 정리해서 작성하기가 힘드네여..

      다음 순서대로 하면 되지 않을까 싶네요..(이미 하신건 건너띄시면 됩니다.)

      우분투 관련 사용법 공부
      C언어 프로그래밍 공부
      리눅스 드라이버
      BeagleBone Black 에서 사용중인 CPU 관련 데이터 시트 분석

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2017.05.30 13:35 신고

      라즈베리파이 쪽 자료가 상대적으로 더 많으니 참고해보세요..

      beaglebone black이나 라즈베리파이나 둘다 리눅스 운영체제를 사용하기에 유사한 부분들이 많습니다.

      제 블로그에도 있고 구글에서 검색해도 상당히 많이 나옵니다.

+ Recent posts