1. 문자형을 숫자형으로

atoi​,atol,atof는 문자열을 숫자로 바꾸어 주는 함수이다.

사용하기 위해서 stdlib.h 이 헤더를 호출해야 한다.


 
include <stdlib.h>
 


 -. atoi는 ascii to integer --> 문자열을 int형

 -. atol은 ascii to long --> 문자열을 long형

 -. atof는 ascii to float --> 문자열을 double형으로 바꾸어 준다.


​앞에 -가 올 경우도 그대로 출력해 주고 문자나 띄어쓰기를 만나면 그 전까지의 숫자를 모두 바꾸어 준다.

또 시작하자마자 문자를 만날 경우 0을 반환한다.


간단한 예제를 살펴보자!


 
#include 
int main()
{
   char buf1[10], buf2[10];
   int num1, num2;
   
   memset(buf1, 0x00, sizeof(buf1));
   memset(buf2, 0x00, sizeof(buf2));
   
   sprintf(buf1, "20");
   sprintf(buf2, "30");
   num1 = atoi(buf1);
   num2 = atoi(buf2);
   
   printf("num1 + num2 = %d \n", num1+num2);
   
   return 0;
} 
 



2. 숫자형을 문자형으로

 -. itoa : integer 값을 2진, 8진, 10진, 16진 문자열로 변환합니다.

 -. ltoa : long 값을 2진, 8진, 10진, 16진 문자열로 변환합니다.

 -. ultoa : unsigned long 값을 2진, 8진, 10진, 16진 문자열로 변환합니다.

 -. fcvt : 실수(고정 소수점:float) 값을 문자열로 변환합니다.

 -. ecvt : 실수(부동 소수점:double) 값을 문자열로 변환합니다.

 -. gcvt : 실수 값을 부호와 소수점을 포함하여 문자열로 변환합니다.

1. 카메라 동작확인
  -. PiCAM 구입 후 파란색이 USB, 은색이 hdmi쪽을 향하게 모듈을 삽입한다.
  -. sudo raspi-config 명령어에서 5번 메뉴 camera를 enable시킨다.
     (안되면 sudo apt-get update, sudo ap-get upgrade 선행)
  -. 메뉴를 빠져나오면서 재부팅을 한다.
  -. raspistill -o image.jpg 라고 입력하여 이미지가 잘 생성되는지 확인한다.

2. 먼저 필요한 라이브러리를 설치
   $ sudo apt-get install libjpeg8-dev imagemagick libv4l-dev

3. build시 필요한 파일을 include해 두기
   $ sudo ln -s /usr/include/linux/videodev2.h /usr/include/linux/videodev.h

4. mjpg-streamer 소스를 받는다
  -. Git에서 받아도 되고 검색해서 일반 사이트에서 받아도 된다.

5. 빌드
   $ cd mjpg-streamer-code-182/mjpg-sreamer
   $ make mjpg_streamer input_file.so output_http.so (Makefile에서 필요한거 주석 풀어준다)
  (위에가 귀찮으면 make clean all)

6. 주요 library root로 복사
   $ sudo cp mjpg_streamer /usr/local/bin
   $ sudo cp outpu_http.so input_file.so /usr/local/lib/
   $ sudo cp -R www /usr/local/www

7. stream이 될 jpg파일이 저장될 폴더 생성
   $ mkdir /tmp/stream

8. 실행
   $ raspistill --noreview -w 640 -h 480 -q 5 -o /tmp/stream/pic.jpg -tl 100 -t 9999999 -th 0:0:0 & (임시 저장 폴더에 이미지를 반복하여 저장)
   $ LD_LIBRARY_PATH=/usr/local/lib mjpg_streamer -i "input_file.so -f /tmp/stream -n pic.jpg" -o "output_http.so -w /usr/local/www"

9. 포트 변경
기본 포트는 8080으로 mjpeg stream 서버가 열리는데 이를 바꿔 주기 위해서는 -p 옵션을 사용한다.
   $ LD_LIBRARY_PATH=/usr/local/lib mjpg_streamer -i "input_file.so -f /tmp/stream -n pic.jpg" -o "output_http.so -p 8888 -w /usr/local/www"

*동작원리는 mjpeg용 서버를 열어서 실제 웹페이지에서는 해당 서버의 스트리밍을 받아서 사용.(포트가 겹치지 않도록 주의)


참고 사이트 :

http://jskorl.blog.me/220379225762


1. 툴체인 받기
   $ git clone https://github.com/raspberrypi/tools raspi_toolchain

2. 툴체인 환경 변수에 추가
   $ cd raspi_toolchain
   $ cp -av  arm-bcm2708/ /opt/toolchains/
   $ vi ~/.bashrc
   
* 추가 내용
export PATH="$PATH:/opt/toolchains/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian:/opt/toolchains/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin"
추가 후 저장 종료

   $ source ~/.bashrc
   $ echo $PATH   <-- 잘 적용 됬는지 확인

3. 소스 받기
   $ git clone --depth=1 https://github.com/raspberrypi/linux raspi_kernel

4. 소스 빌드
   $ cd raspi_kernel

   $ KERNEL=kernel7
   $ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig
   $ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs(-j n옵션으로 빠르게 빌드 가능)


Target board에서 Kernel build!!

1. Source 받기
   $ git clone --depth=1 https://github.com/raspberrypi/linux

2. bc라는 패키지 설치(근데 이게 먼지 찾아봐도 모르겠음..)
   $ sudo apt-get install bc

3. Build configuration 설정
 -. 라즈베리파이 1은...
   $ cd linux
   $ KERNEL=kernel
   $ make bcmrpi_defconfig

-. 라즈베리파이 2는...
   $ cd linux
   $ KERNEL=kernel7
   $ make bcm2709_defconfig

4. build 하기
   $ make zImage modules dtbs

5. 모듈도 build 하기
   $ sudo make modules_install

6. 빌드한거 적용하기
   $ sudo cp arch/arm/boot/dts/*.dtb /boot/
   $ sudo cp arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/
   $ sudo cp arch/arm/boot/dts/overlays/README /boot/overlays/
   $ sudo scripts/mkknlimg arch/arm/boot/zImage /boot/$KERNEL.img

* 라즈베리파이 2는 kernel7.img 로 복사한다.


라즈베리 파이의 부팅 순서는 다음과 같다.


1. 보드에 전원이 들어오고 GPU가 활성화된다.

2. SoC 내 ROM에 있는 첫번째 부트로더(Firmware)를 읽어들인다.

3. 첫번째 부트로더가 SD카드에 있는 두번째 부트로더(bootcode.bin)을 호출한다.

4. 두번째 부트로더가 SD카드에 있는 config.txt를 읽고 실행한다.

4. 두번째 부트로더가 세번째 부트로더(start.elf)를 호출 및 실행하여, ARM Core를 활성화한다.

6. ARM Core가 활성화되면 네번째 부트로더(kernel.img)를 호출, 실행한다.

Context Switch(문맥교환)는 여러 프로세스가 실행하기 위해 다른 프로세스로 전환 시 실행중이던 프로세스의 상태를 보관 후 다른 프로세스로 전환하는 것을 만한다.
따라서 Context란 프로세스의 상태를 말하며 ps 명령어를 통해 정보를 볼 수 있다.



 
$ ps -aux | grep "gnome"

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
neo 2955 0.0 0.2 442460 11292 ? Sl Sep11 0:00 /usr/bin/gnome-keyring-daemon --daemonize --login
neo 2966 0.0 0.1 394824 5344 ? Ssl Sep11 0:00 gnome-session --session=gnome-fallback
neo 3009 0.0 0.0 26560 440 ? S Sep11 0:00 /usr/bin/dbus-launch --exit-with-session gnome-session --session=gnome-fallback
neo 3019 0.0 0.4 701588 16388 ? Sl Sep11 0:09 /usr/lib/gnome-settings-daemon/gnome-settings-daemon
neo 3038 0.0 0.0 369696 2604 ? Sl Sep11 0:00 /usr/lib/gnome-settings-daemon/gsd-printer
neo 3060 0.0 0.2 613832 11384 ? Sl Sep11 0:05 gnome-panel
neo 3069 0.0 0.1 307732 4856 ? Sl Sep11 0:00 /usr/lib/policykit-1-gnome/polkit-gnome-authentication-agent-1
neo 3077 0.0 0.1 455172 7152 ? Sl Sep11 0:00 /usr/lib/gnome-settings-daemon/gnome-fallback-mount-helper
neo 3225 0.0 0.1 331740 5156 ? Sl Sep11 0:00 /usr/lib/gnome-disk-utility/gdu-notification-daemon
neo 3241 0.0 0.1 400240 5208 ? Sl Sep11 0:00 /usr/lib/gnome-online-accounts/goa-daemon
neo 3247 0.0 0.1 310060 5056 ? Sl Sep11 0:00 gnome-screensaver
neo 3274 0.0 0.4 606928 17604 ? Sl Sep11 0:08 gnome-terminal
neo 3278 0.0 0.0 14788 768 ? S Sep11 0:00 gnome-pty-helper
neo 3636 0.0 0.2 568668 11600 ? Ssl Sep11 2:09 gnome-terminal
neo 3649 0.0 0.0 14788 752 ? S Sep11 0:00 gnome-pty-helper
neo 123805 0.0 0.0 13592 936 pts/3 S+ 10:56 0:00 grep --color=auto gnome
 

COMMAND : 명령어의 이름 
PID : 프로세서 ID, 각 프로세서를 구분하기 위한 고유의 ID 
RSS : 프로세서에 의해 사용되는 실제 메모리의 용량(K byte 단위) 
USER : 프로세서를 실행시킨 소유자의 계정을 보여준다. 
SZ : 프로세서의 자료와 스텍 크기의 (K byte 단위) 
TIME : 현재까지 사용된 CPU의 시간(분,초) 
TT : 프로세서의 제어 터미널(t3=/dev/tty3) 
%CPU : 마지막 분동안 프로세서가 사용한 CPU시간의 백분율 
START : 프로세서가 시작된 시간 
STAT : 프로세서의 상태

이 중 STAT 필드는 몇 가지의 부호를 사용해서 프로세서의 상태를 표시하고 있다. 
그것들을 정리해 보면 다음과 같다.

P : 수행 가능/수행 중 
T : 일시 정지 
D : 디스크 입출력 대기 같은 인터럽트할 수 없는 대기상태 
S : 20초 미만의 짧게 잠듦(sleep) 
I : 20초 이상의 길게 잠듦 
Z : 좀비(zombi) 프로세서

좀비(zomb) 상태라는 것은 프로세서가 사라질 때 시그널 처리의 문제로 완전히 소멸되지 못한 상태를 말한다.

Program counter의 약자로, 중앙처리장치 내부에 포함된 레지스터 중에 하나로 중앙처리장치가 처리해야 할 다음 명령어의 주소를 가르키는 역할을 한다.

ARM이나 MIPS에서는 PC(Program Counter)라 하지만 x86에서는 IP(Instruction Pointer)라고 한다.


프로젝트를 새로운 리눅스 환경에 옮기고 npm install를 하니 다음과 같은 문제 발생

 
neo@ubuntu:~/$ npm install
npm http GET https://registry.npmjs.org/body-parser
npm http GET https://registry.npmjs.org/cookie-parser
npm http GET https://registry.npmjs.org/express/3.0.5
npm http GET https://registry.npmjs.org/jade/0.30.0
npm http GET https://registry.npmjs.org/socket.io

npm ERR! Error: failed to fetch from registry: jade/0.30.0
npm ERR! at /usr/share/npm/lib/utils/npm-registry-client/get.js:139:12
중략...
npm not ok
 

아래와 같이 해결

 
neo@ubuntu:~/$ sudo apt-get purge nodejs npm 
neo@ubuntu:~/$ curl -sL https://deb.nodesource.com/setup | sudo bash - sudo apt-get install -y nodejs
 
설정 방법은 아주 간단하다. 

아래 내용에 해당되는 곳에 ico 파일을 넣어주면 express가 구동될 때 자동으로 웹 페이지에 파비콘을 설정한 채로 실행이 된다.

 
var favicon = require('serve-favicon');
app.use(favicon(path.join(__dirname, 'public/images', 'favicon.ico')));
 



리눅스를 이용해서 라즈베리파이에 웹서버 올리는 소스가 있을까요?

라즈베리파이에 LED연결해서 불들어오게 하려고 하는데...



답변 드립니다.



리눅스를 이용해서 라즈베리파이에 웹서버를 올리는 소스는 따로 없습니다.
직접 만든 웹서버 소스(또는 오픈 소스)를 가지고 있으시다면, ssh 통신이나 아니면 직접 시리얼을 통해 라즈베리 파이에 접근하여 서버를 구성하셔야 합니다.

php나 jsp를 사용하실 거라면 tomcat과 같은 서버를 설치하여 올리시면 되고
nodejs와 같은 경우엔 서버이기 때문에 그대로 사용 하시면 됩니다.

개인적으로 간단한 LED 불들어 오게 하는 정도로 구상 중이시라면 nodejs를 추천드립니다.
nodejs에서 제공하는 수많은 library중에 라즈베리파이의 gpio를 컨트롤(LED켜기) 하는 기능도 포함되어있기 때문에 쉽게 작업하실 수 있으실 거에요(검색해보시면 자료도 많고요)

또한 서버 구성을 하여 웹으로 LED제어 하도록 만드신 후 해야 할 일은 라즈베리파이가 재부팅 되었을 경우에 다시 웹서버가 실행 되어야 겠죠.
이를 위해선 리눅스의 기본 개념을 이해하셔야 하며, 간단히 방법만 알려 드리면 init.rd에 부팅 시 호출하고자 하는 시스템을 추가하시면 됩니다.


+ Recent posts