분류

2018년 1월 30일 화요일

ARM Embedded / 라즈베리파이 초보 개발자의 이슈 정리

본 문서는 ARM+Embedded 초보로서 발생했던 문제들에 대한 정리이며, 지속적으로 업데이트 되어 갈 것임을 알려 드립니다.

ARM을 접하기 시작 한지 어느덧 한 달이 되어가면서, 발생했던 이슈에 대한 정리를 하나하나 해가려 합니다. 제일 처음 ARM 보드를 접했을 때 발생한 문제는 여러가지 있습니다. 그리고 그 물음들은 차차 해결되어가고 있습니다.

1. ARM 보드에 파일 전송은 어떻게 해야 돼?

처음 ARM 보드를 접했을 때 WINDOW 환경인 제 PC에서 ARM 보드에 파일을 적재 하는 것이 쉽지 않았습니다. 일단 Linux용으로 포맷 된 플래카드를 WINDOW 에서 사용할 수 없으니 답답했고, COM 포트와 SSH를 이용한 접속은 되지만, 기이하게도 파일 전송을 할 수 없는 보드가 있었습니다.  현재 사용하는 보드는 임베디드 리눅스가 설치된 Cortex A5,7,8,9 보드입니다.

보드의 제조사 마다 다른 것 같은데 라즈베리 파이가 설치된 5 7 8은 sftp 서버가 설치되어 있어 대수롭지 않게 파일 전송을 할 수 있었는데 a9보드만(i.mx6solo) sftp가 깔려있지 않았습니다.


위 사진과 같이 ssh는 dropbear 라는 녀석이 깔려있고, sftp는 커맨드가 없습니다. 처음에 이 녀석에 sftp 서버를 크로스컴파일 해서 설치 해보자 라는 생각을 했는데 인터넷에 나온 여러 방식들을 수행해본 결과, make 오류가 납니다. 하지만 초보라서 이 오류에 대한 해결을 할 수 없었습니다. (애써 툴 체인과 컴파일 환경 설정을 하느라 4시간이 걸렸습니다.)

그래서 ssh에서 파일 전송 안되나 하는 것을 생각해봤고 ssh 파일 전송을 검색하니 winscp라는 녀석이 검색되었습니다. 저는 윈도우 환경에서 vm으로 리눅스를 사용합니다. 따라서 window던 리눅스던 파일 전송만 되면 됩니다.
Winscp의 지원 프로토콜 목록
WinSCP :  sftp, SCP, ftp, webDAV 라는 4개의 프로토콜을 지원해주는데 이중 SCP라는 프로토콜이 SSH에서 파일 전송을 가능하게 해줍니다. 게다가 익숙한 GUI 환경입니다.

SCP 프로토콜위키 링크

2. 알수없는 컴파일 오류

ARM에 대해 학습할 시간도 없이 프로그램 테스트에 투입되면서 마주친 건 이유 없는 컴파일 오류였습니다.
프로그램 테스트 때에는 이상이 없었던 프로그램이 컴파일러로 넘어가면서 오류가 나는 것이었는데 알고 보니 윈도우 줄 바꿈 문자열 인식 불가에 의한 오류였습니다. 아래는 해당 내용입니다.
(CRLF는 Windows에서 사용하는 줄 바꿈 문자이고 LINUX에선 사용되지 않는다고 합니다.)
root@ubuntu:/home/test# ls
test.c  TEST2.c  make_test1.sh  make_test2.sh  main.c
root@ubuntu:/home/test# file make_test1.sh
make_test1.sh: ASCII text, with CRLF line terminators<---CRLF 라인이 포함되어있음        
root@ubuntu:/home/test# file make_test2.sh
make_test2.sh: ASCII text<---ASCII만으로 구성되어 있음                                            
root@ubuntu:/home/test# ./make_test1.sh                                                             
COMPILING TEST PROGRAM FOR LINUX
/tmp/ccqjcWXL.o: In function `main':
main.c:(.text+0xb4): undefined reference to `tesfunct'                                               
collect2: error: ld returned 1 exit status   <---오류가 발생하면서 컴파일이 종료됨           
/tmp/ccsrD3GX.o: In function `main':                                                                     
main.c:(.text+0xb4): undefined reference to `tesfunct'                                              
collect2: error: ld returned 1 exit status                                                                 
root@ubuntu:/home/test# ls
test.c  TEST2.c  make_test1.sh  make_test2.sh  main.c
root@ubuntu:/home/test# ./make_test1.sh
COMPILING TEST PROGRAM FOR LINUX
main.c: In function ‘tesfunct’:                                                                               
main.c:333:20: warning: comparison between pointer and integer                               
    while ((line[i] != NULL) && (i<(MAXLINE - 1)) && (line[i] != 0xff)) {                         
                    ^                     <---경고가 발생하지만 컴파일이 수행됨                     
test.c: In function ‘tesfunct’:                                                                                
test.c:333:20: warning: comparison between pointer and integer                                 
    while ((line[i] != NULL) && (i<(MAXLINE - 1)) && (line[i] != 0xff)) {                         
                    ^                                                                                              
root@ubuntu:/home/test# ls
test.c  TEST2.c   make_test1.sh  make_test2.sh  main.c
test     test2.exe  test1.exe 
컴파일 된 test 폴더와 test1.exe, test2.exe 파일이 생성됨 
완전히 동일한 내용의 파일에서도 window 환경에서 편집한 문서일 경우 컴파일이 안되면서 특이한 오류가 발생하게 됩니다. 까다로운 녀석이 엔터 값, 탭 값 하나 그냥 넘어가 주지 않습니다. ㅎㅎ;

3. 디버깅 환경 어떻게 해야되?

ubuntu 에서는 기본적으로 컴파일러를 통한 디버깅이 가능하다고 합니다.
GDB DEBUGGER 라는 것을 사용할 수 있다고 하는데요, 저는 개인적으로 ECLIPSE를 선호하기에 ECLIPSE에서 디버깅을 하려고 합니다.
우분투에서 이클립스를 통한 디버깅 환경 설정에 대한 문서는 타 블로그에 자세히 나와있습니다.
우분투에서 이클립스를 통한 c/c++ 개발환경 구축 (크로스컴파일 포함)


4.VMWARE에서 SD카드 어떻게 연결해?

VM에서는 노트북 자체에 달려있는 SD카드 리더기는 읽어들이지 않네요. 이부분 불편합니다.  (PCIE 방식의 카드리더는 GUEST-OS에서 사용할 수 없다고 합니다. )
그래서 어쩔 수 없이 카드리더기를 구매했습니다.

처음에는 VMWARE에 IDE를 설정해서 연결하는것을 해봤는데, 장치를 뺄경우 오류가 뜨면서 VM이 종료됩니다. 그냥 이동형 장치로 한번씩 눌러주는 것이 낫습니다.


① 가상머신에서 오른쪽 마우스 클릭
② Removable Device
③ 자신의 usb 명칭을 선택 (대체로 storage 가 들어있음)
④ Connect 클릭 하면 df명령으로 추가된 놈들이 보입니다.

해당 디스크를 보려면 DF 명령도 있지만
$sudo fdisk -l 을 보시는 편이 낫습니다.  디스크 별로 파티션이 나와서 보기 편해요 ㅎㅎ


5. 라즈베리파이는 어떻게 설치해야되?

라즈베리파이는 기본이 쉽고, 여러곳에서 지원해서 어려울게 없네요 ㅎㅎ;;
위키가 매우 잘 구성되어있습니다. 한글로요 https://wikidocs.net/3277
라즈베리안 os 다운로드 https://www.raspberrypi.org/downloads/raspbian/

6. 라즈베리파이 커널은 어떻게 변경해야돼?

라즈베리 파이 커널은 https://github.com/raspberrypi/linux/ 요기 들어가시면 확인할 수 있구요 커널 목록이 무엇이 있는지 확인할 수 있습니다.  (라즈베리 파이는 git에서 rpi- 이후에 나오는 숫자가 커널버전입니다. )
빨간 줄 친 저곳을 누르면 모든 브랜치 목록을 확인할 수 있어요. 특정 커널의 브랜치만 다운 받으시고 싶으시면 해당 커널의 숫자를 입력하면 나옵니다. 저는 3.18을 사용해야 합니다. 커널 빌드하기는 https://wikidocs.net/3243 문서를 참조하시면 되고, 커널 버전을 변경하고 싶으면 소스를 받는 부분만 고치시면 됩니다.
git clone --depth=1 https://github.com/raspberrypi/linux 부분을 
git clone --depth=1  -b rpi-3.18.y https://github.com/raspberrypi/linux 이렇게 바꾸시면 됩니다. 
기본적인 다른 부분은 동일하기에 별다른 설명도 필요 없습니다.

7. 콘솔에서 wify 어떻게 설정해야해 ?

2개의 파일을 편집하면 됩니다.
1) 네트워크 설정
우선 네트워크 설정파일을 변경합니다.
$ sudo vi /etc/network/interfaces
auto lo
iface lo inet loopback 


allow-hotplug wlan0
iface wlan0 inet dhcp 

wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf 

auto eth0
iface eth0 inet dhcp
그 다음 wpa-conf  파일로 지정한 파일을 수정합니다.
$ sudo vi /etc/wpa_supplicant/wpa_supplicant.conf 

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1 


network={
ssid="wifi의 ssid"
psk=비밀번호 


6. 컴파일러 여러개인데 편하게 쓸수 있어? 

컴파일러는 보드의 버전에 따라 여러개 사용할 수도있고, 여러 작업 환경에 의해 바뀔 수 있습니다. 따라서 alternative라는 단축키 비슷한 것을 사용할 수 있습니다. 리눅스에서도 windows와 마찬가지로 단축 아이콘이 존재합니다. ln이라는 명령을 통해서 만들 수 잇고, alternatives로 미리 저장해놨다가 필요할때 변경하면서 사용할 수 있습니다.

update-alternatives  라는 명령에 대해 간략하게 이야기 하자면 4개의 명령어로 나뉩니다.
1. alternatives 조회 
$ update-alternatives --list <이름>

2. alternatives 추가 
$ sudo update-alternatives --install    <링크파일> 이름   <실제파일>      구분 
예) sudo update-alternatives --install /usr/bin/gcc  gcc  /usr/bin/gcc-4.9    49

※ 하나의 파일이 바뀔때 같이 바뀌어야 하는 파일이 있다면 이런식으로 종속 설정을 할 수 있습니다.  --slave <링크파일> 이름  <실제파일> 

예) sudo update-alternatives --install /usr/bin/gcc gcc  /usr/bin/gcc-4.9 49 --slave /usr/bin/g++ g++ /usr/bin/g++-4.9

3. alternatives 삭제 
$ sudo update-alternatives --remove 이름  <실제파일>
예) sudo update-alternatives --remove gcc /usr/bin/gcc-4.9

4. 변경 (혹은 선택)
$ sudo update-alternatives --config 이름
예) sudo update-alternatives --config gcc

  Selection    Path              Priority   Status
------------------------------------------------------------
* 0            /usr/bin/gcc-4.9   49        auto mode
  1            /usr/bin/gcc-4.9   49        manual mode
  2            /usr/bin/gcc-6     6         manual mode


Press <enter> to keep the current choice[*], or type selection number: 0

선택창이 나와서 번호를 입력하여 선택할 수 있습니다. 

댓글 없음:

댓글 쓰기