반응형

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. }  


문제 발생시 지나치지 마시고 댓글 남겨주시면 가능한 빨리 답장드립니다.


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

+ Recent posts