2월, 2025의 게시물 표시

sd 카드 플래싱 쉘로 자동화하기

이미지
virtual box에서 윈도우 클립보드 공유하는 법은 다음과 같다. 이렇게 양방향 설정하고, 같은 메뉴에서 게스트 확장 CD 이미지 삽입을 누른다. 옆에 cd가 뜰텐데 누르고 재부팅 해주자.  이러면 클립보드 공유되고. 윈도우에서 ctrl + c하고, 우분투에서는 ctrl + shift + v 해주면 된다. 우선 디렉토리를 만들자 $ cd ~ $ mkdir flashing $ cd flashing 다음 쉘 스크립트 2개를 작성한다. 1. sd_flashing.sh if [ $# -ne 1 ] ; then echo $# arg number error echo arg1 can be disk character like a, b, c, d. exit -1 fi sudo umount /dev/sd $11 sudo umount /dev/sd $12 sudo ./partitioning.sh $1 sudo mkfs.vfat -F 32 /dev/sd $11 sudo mkfs.ext4 /dev/sd $12 sudo mount /dev/sd $11 /mnt rm -rf /mnt/* sudo cp ./MLO /mnt sudo cp ./u-boot.img /mnt sudo cp ./zImage ./am335x-boneblack.dtb ./uboot.env /mnt sudo sync sudo umount /mnt sleep 2 sudo mount /dev/sd $12 /mnt rm -rf /mnt/* sudo tar -xvf core-* -C /mnt sudo sync sudo umount /mnt 2. partitioning.sh #!/bin/expect set timeout 10 set number [ lindex $argv 0 ] spawn fdisk /dev/sd $number expect "Command (m for help):" send "d\n" ...

[ BBB - yocto (8) ] gpio

이미지
0) 참고하면 좋은 자료 https://github.com/derekmolloy/boneDeviceTree/tree/master/docs 어떤 핀 헤더에 따른 핀 정보가 다 나와있다. 핀 번호를 참조해서 하면 된다. 핀헤더에 네이밍에 대한 정보는 bbb pinout을 검색해보면 된다. 1) gpio 제어 방법 소개 1. sysfs를 사용하는 방법 커널이 /sys/class/gpio쪽에 gpio폴더를 만들어둔다. 여기서 제어하는 방법은 아래 bash명령어를 따라해 주면 된다. #output 설정의 경우 $ echo 'PIN번호' > /sys/class/gpio/export #gpio output 설정 $ echo out > /sys/class/gpio/gpio 'PIN번호' /direction #gpio high $ echo 1 > /sys/class/gpio/gpio 'PIN번호' /value #gpio low $ echo 0 > /sys/class/gpio/gpio 'PIN번호' /value #gpio input 설정 $ echo in > /sys/class/gpio/gpio 'PIN번호' /direction #gpio 읽는 법 $ cat /sys/class/gpio/gpio 'PIN번호' /value c에서 명령어를 실행하는 방법은 bash 명령어를 실행할 수 있는 <stdlib.h>의 system 함수를 쓰면 된다. 파일을 읽으려면 open함수로 파일을 열고 read로 읽어주면 된다. 그런데 sysfs 제어 방식은 추천하지 않는다.  GPIO Sysfs Interface for Userspace — The Linux Kernel documentation 이 api는 개발 중단되었으며, 향후 없어질 것이라는 내용이다.  앞으로 gpio를 짜는 어플을 개발한다면, /dev/gpiochip*을 사용하여 gpio 드라...

[ BBB - yocto (7) ] c에서의 멀티 스레드, 세마포어

이미지
1) 멀티 스레드 프로그램을 돌리면 프로세스가 되고, 프로세스 내에서 돌아가는 작은 실행 단위를 스레드라고 하는건 다들 알고 있는 사실일거야 1. 프로그램 컴파일을 통해 만들어진 바이너리 파일. 아직 실행되지 않았으면 프로그램 이것을 "./[바이너리 파일 이름]"으로 실행했으면 프로세스가 된다. 2. 프로세스 실행된 프로그램 3. 스레드 프로세스 내에서 돌아가고 있는 작은 실행단위 멀티 스레드는 스레드가 여러개인 환경을 의미해 여러개의 스레드를 c로 돌리는 방법은 pthread_create와 pthread_detach를 주로 사용해 1. pthread_create int pthread_create( pthread_t * __restrict__ __newthread, const pthread_attr_t * __restrict__ __attr, void * ( * __start_routine)( void * ), void * __restrict__ __arg) pthread_create는 pthread_create로 스레드 컨트롤 블록을 동적할당해 pthread_detach를 사용하면 스레드를 활성화 시켜서 멀티 스레드로 동작하게 만들 수 있어. __newthread : pthread_t의 주소를 넘겨주면 스레드 식별자 번호를 반환해줘. __attr : thread 속성을 지정해, 사용을 안할때는 NULL로 채워둬... 거의 사용을 안해 __start_routine : 스레드로 실행할 함수의 주소 __arg : 스레드에 넘겨줄 인자 값 반환 값 : 실패시 -1, 성공시 0 2. phread_detach int pthread_detach( pthread_t __th) 스레드를 분리하는 하는 함수 pthread_create로 생성된 스레드 컨트롤 블럭의 자원을 스레드 종료시 자동으로 해제하게 한다. __th : 스레드 식별자 번호 반환값 : 실패시 errno, 성공시 0 간단히 동작을 살펴보도록 하자 //main.c #includ...

[ BBB - yocto (6) ] 파일 입출력 함수

이미지
 1) 입출력 함수 파일을 읽고 쓰는 함수는 매우 중요해, 'everything is file'이라는 설계 철학 아래에 만들어진 리눅스는 OS가 할 수 있는 대부분의 작업을 파일로 관리하기 때문이야. 파일 입출력 사용 가능한 함수는 3가지가 있어 1. open 함수 int open ( const char * __file, int __oflag, ...); 파일을 여는 역할을 하는 함수야. 파일을 파일 디스크립터라는 프로세스가 접근하는데 사용하는 추상적인 값을 반환해 여기서 프로세스는 우리가 짠 프로그램을 동작시킨거야. 이를태면 "./[프로그램 이름]" 이 있지. 쉽게 말해 연 파일에 번호(파일디스크립터)를 매겨 프로세스(우리가 짠 프로그램이 동작하고 있는 것)가 사용할 수 있게 해줘. *__file : 열 파일 경로 __oflag : 파일을 열 때 옵션이야. 사용 가능한 값으로 아래 값이 있어 o_flag 옵션 설명 O_CREAT 열고자 하는 파일이 없으면 파일을 만듦 O_EXCEL 열고자 하는 파일이 이미 존재하는 파일이면 open 함수가 오류를 반환하게 함 O_RDONLY 쓰기 전용으로 파일을 엶 O_WRONLY 읽기 전용으로 파일을 엶 O_RDWR 쓰기 읽기 둘다 허용으로 파일을 엶 O_NOCCTY 터미널 제어 문자(ctrl c[작업 강제 중지], ctrl z[작업 일시 중지]등)를 무시함. O_TRUNC 파일을 열고, 파일에 있는 모든 값을 지움 O_APPEND 파일 오프셋을 맨 뒤로 설정함 O_SYNC 파일 읽고 쓰기 동기화 진행. 파일시스템에서 파일에 쓰면 가끔 동기화가 안되서 재부팅 시 파일이 저장이 안되는 경우가 있음. 그때 사용, 옵션을 중첩해서 주려면 or '| ' 를 사용해야해 파일 오프셋의 개념은 아래서 설명할게 ... (mode) : 가변인자로 뒤에 주로 mode가 들어가, mode는 리눅스 파일의 권한을 의미해, 파일 권한은 사용자, 그룹,  다른 사용자로 나뉘며 ls -la를 치면...

[ BBB - yocto (5) ] makefile 작성법과 컴파일 자동화

이미지
1. 헤더파일 소스파일 우선 makefile에 들어가기 전에 헤더파일과 소스파일에 대해서 간단히 알아보자 - 헤더파일  1) *.h로 끝남 2) 함수, 매크로, 구조체, 열거형...등을 다른 소스파일 혹은 헤더파일에서 인클루드(#include)하여 사용할 수 있도록 해주는 파일이라 생각하면 될거야 - 소스파일 1) *.c로 끝남 2) 로직의 동작 과정을 짜는 공간이라 생각하면 됨, 주로 함수의 동작을 코드로 적어놓은 파일이야 - 해더파일과 소스파일 사용시 주의사항 1) 중복 인클루드 방지 /* gpio.h */ #ifndef __GPIO__ #define __GPIO__ //대충 함수 #endif 이 과정을 보면, #ifndef 매크로와 #define매크로로 중복 인클루드 방지 처리를 해놓은 것을 볼 수 있어 저게 없으면 헤더파일을 중복하여 인클루드하는 경우 오류가 발생하지. #ifndef [매크로 변수] : 매크로 변수가 정의되어 있지 않으면 #define [매크로 변수] : 매크로 변수를 정의한다. #endif : #if 매크로의 끝 이렇게 하면 헤더 파일을 중복 인클루드 하면 매크로 변수가 정의되어 있어 #endif로 바로 점프하게 되어 헤더파일 중복 인클루드를 방지할 수 있어. 2) 전역 변수 선언하지 않기 중복 방지를 했다고 해서 컴파일하는데 오류가 안나는건 아니야 아래 코드를 봐보자. /* gpio.h */ #ifndef __GPIO__ #define __GPIO__ int gpio; #endif 파일이 이렇게 있어 > gpio.c gpio.h main.c 코드를 이렇게 짰다고 하자 겉보기에는 아무런 문제가 없어 보여 하지만 이것을 gpio.c에서 gpio.h를 포함하려고 하고, main.c에서 gpio.h를 포함하려고하면 문제가 되어 버리지 main.c에서 gpio.h를 읽어, gpio 인트형을 만들고 gpio.c에서 gpio.h를 읽어, gpio 인트형을 만들려고 보니 이미 선언돼있네? 이래서 오류가 발생해,...