신제품을 개발중인데,  GPIO 의 3개 핀을 HW Divice Version를 구별하는 용도로 사용하였습니다.

 

bootloader 실행하자 마자 nand 및 gpio, pmic 등을 초기화 하는 함수로 뛰게 했는데,

이 함수 첫부분에서  바로 GPIO 3개핀을 읽어 HW Device를 구별하게 했습니다.

 

근데 이 함수가 bootloader 실행하자 마자 한번 호출되고,  start_armboot 가 실행된 후에

다시 한번 불러지게 되더군요 (전에 작업한 사람이 왜 그랬는지 하여튼 2번 호출됩니다)

 

문제는 첫번째 불러질 때는 정상적으로 HW Device Version을 읽어내는데,  두번째 불러질

때는 정말 황당한 일이 벌어집니다.

원래대로라면 첫번 불러질 때나 두번째 불러질 때나 값이 같다면 if 문안에서도 그 값에

따라 분기하는 곳도 같아야 겠죠...그런데 값은 한가지로 나오는데 황당하게 if 문 안에서

분기되는 위치가 틀립니다.

 

간략하게 소스에서 주석을 봐주세요..

 

==============================================================================

* gpio a 4,5,6 모두 open 상태로 high로 검출되어 야 함. 그래서 그런지 rGPADATA 값은 항상 0xfffd 로 검출..

   rGPADATA  : 0번 비트부터 gpioa 0,1,2,3...15 까지 .

  그리고 rINFORM7 은 값을 저장하기 위한 register ...

  (chip 에서 값을 저장하는 용도로 쓰라고 만들어 놓은게 있습니다)

 

 rGPAMCON = (rGPAMCON & ~(GP04_MASK|GP05_MASK|GP06_MASK))    <<<<  일단 인풋 설정
               | (GP04_INPUT|GP05_INPUT|GP06_INPUT);

rGPAPUD = (rGPAPUD & ~(GP04_MASK|GP05_MASK|GP06_MASK))    <<<< pull up 으로 처리하고
               | (GP04_PULLUP|GP05_PULLUP|GP06_PULLUP);

       if ( (rGPADATA & (1<<6))== (1<<6) )     <<<< 첫번 호출될 때는 이곳에서 정상적으로 if 문을 인식해 바로 아래로 분기
       {                                                                     <<<< rGPADATA 값이 0xfffd 이므로 정상임
               rINFORM7 = HW_G3_BOARD;

       }
       else if ( (rGPADATA & (1<<6))== 0 )
       {
               rINFORM7 = HW_G4_BOARD; 

       else                                             <<<< 문제의 두번째 호출.. rGPADATA 값이 0xfffd  임에도 불구하고 바로 이곳으로
       {                                                  <<<<  분기함. 말이 안되는 것이 비트셋팅은 1 or 0 인데 이곳으로 분기하는 것이 특이함

              //에러...절대 이곳으로 분기 할 수 없음.
       }

   rGPAPUD = (rGPAPUD & ~(GP04_MASK|GP05_MASK|GP06_MASK))    <<<<<  위의 처리가 끝나고 pull down 처리
           | (GP04_PULLDOWN|GP05_PULLDOWN|GP06_PULLDOWN);

==============================================================================

 

두번째 함수 호출될때 비트셋팅이 1 or 0 둘중 하나로 가야하는데 엉뚱한 곳으로 뛰어 버리는게 문제입니다.

정상적이면 high 로 인식하여 if 문 첫번째 조건에 걸려야 되느데 엉뚱하게도 else 로 뛰네요.

비트 셋팅이 1 or 0 인데 양자컴퓨터도 아니고 엉한데로 뛰니..쩝~~..

 

이거 miss align 문제는 아닌가 생각도 되지만 역어셈을 해봐야 될 거 같기도 하네요..

 

혹시 왜 이런지 아니면 저와 비슷한 경험이있으신 분은 답변좀 적어주시면 감사하겠습니다.

그리고 역어셈 할려면 어떻게 해야 하는지 간략히 알려주심 더 감사하겠습니다...

 

ps : 그리고 또 특이한게 위의 gpio 확인하는 함수가 딱 1번만 호출되면 정상적으로 동작을 합니다.

     

번호 제목 글쓴이 날짜 조회 수
공지 [공지] 프로그래밍 관련 Q&A 게시판 입니다. woos 2016.04.09 22246
» C 문법을 위반하는 경우가 생긴건지도 모르겠네요...뭐가 이러지?.. [6] 김영일 2010.12.06 7738
117 모듈오류가 나는데 이유가 뭔지 안잡히네요.. [5] 김영일 2010.11.30 14557
116 아직 끼우지 못한 단추가 남았습니다. [6] 박한범 2010.11.30 8218
115 HVM 실험 좀 부탁합니다. [6] 백창우 2010.11.17 6454
114 리눅스에서 armulator 구동하는 방법 김성오 2010.11.08 7660
113 arm에서 mmu 설정 문제... [1] 유대철 2010.11.03 9741
112 멀티프로세서+멀티코어에 대해 궁금한게 있습니다. [14] 박한범 2010.11.01 8789
111 멀티프로세서+멀티코어에 대해 궁금한게 있습니다!? [8] 박한범 2010.10.30 7672
110 리눅스 인터럽트 금지 해제 관련 [9] 홍문화 2010.09.30 11634
109 gcc 디버깅방법 [1] 피승현 2010.09.27 8820
108 컴파일러 최적화 부분에서... [2] 김국진이 2010.09.04 8666
107 특정 라이브러리만 정적링킹하도록... [3] 김경태 2010.08.17 9812
106 8차 스터디 인원 모집에 대해 문의 드립니다. [1] 신창호 2010.08.17 4837
105 address_space 구조체에 대한 질문 [9] 송원준 2010.07.27 9948
104 S3c2440의 USB host 기능 실현에 대한 질문입니다. 이죽송 2010.07.16 9451
103 커널 스터디에 관해 질문드립니다. 김진수 2010.07.16 5119
102 pgd_offset_K() 커널함수에 대한 질문입니다. [2] 백철민 2010.06.23 9942
101 커널 스터디에 참여하고 싶은데요.. [1] 박영현 2010.06.22 5516
100 dd명령어 써서 디스크 카피 할 시 신재욱 2010.06.16 7362
99 linux에서partition분할하지 않고 포멧한 경우 신재욱 2010.06.16 6379
XE Login