240202

Yonggeun Park·2024년 2월 2일
0

Serial 연결

빨간색 선은 제외하고 3개만 사용

검정색은 GND
흰색은 8번(TXD0)
초록색은 10번(RXD0)

통신

PL2303(파란색 usb 부분) 안에 ic가 있다
동기식은 클럭이 포함 - 속도가 빠름
외부 동기선을 통해 하면 노이즈가 있고 데이터가 깨진다
PC랑 target은 GND를 연결해야한다
pc가 보드로 보낼 때 pc는 TX가 되고 보드는 RX가 된다
보드에서 pc로 보낼 때 보드가 TX가 되고 pc가 RX가 된다
그냥 보내면 안되고 RX232를 양쪽에 사용해서 전압을 convert 해줘서 증폭시킨다
1~2볼트에서 노이즈가 있으면 10볼트에선 무시할 수 있으므로 데이터를 잘 보낼 수 있다

장치관리자에서 port-this is not ~~ 제거하기/드라이버 삭제 체크 후


그러면 이렇게 된다



근데 이것만 해서 되는건 아니고, 라즈베리파이에서 시리얼을 enable 해줘야한다


명령어를 통해 접근하고

한 줄만 all에 추가한다

하나 더 할 것이 있는데,

yy p 하면 줄단위 복사 후 붙여넣기
D는 뒤로 지우기


수정하고 reboot 해준다
위에는 tty1로 되어있는데 ttyS0으로 변경해야함

오류 날 수 있는 상황 : 결선 잘 해야함, pi의 문제

라즈베리 sd카드 이미지 옮기기

https://kyubot.tistory.com/132 참고


체크를 하고

df를 통해 마운트 된 것 확인

언마운트(sdb인지 확인할 것)

사라짐

dd : 복구한다는 것
약 30분정도 걸림

sync 하면 메모리의 임시파일과 하드디스크를 동기화 하겠다는 뜻

image 용량 줄이기



내 권한으로 가져왔다

~$ sudo fdisk -l sdimage.img



(gui가 뜨는거라서 우분투에서 바로 실행하기/푸티 X)



1/4로 줄였다(물론 할당만 안하고 파일 사이즈는 아직 그대로다)
그리고 초록색 체크표시로 완료한다

다시 putty에서

사이즈가 줄어든 것을 확인할 수 있다

하지만 사실 32기가이다


truncate --size=$[(15736831+1)*512] sdimage.img

end sectors의 숫자를 넣어준다

이러면

진짜 작아졌다!

진짜 마지막으로 extension되게 한다


리눅스 프로그래밍의 기초

시스템 콜 인터페이스 : 어플리케이션에서 커널로 진입하는 유일한 통로
시스템 콜 함수가 정의되어있다
시스템 프로그래밍 - 하드웨어 제어

디바이스 드라이브 - 디바이스 제어

lsmod : 모듈을 확인
rmmod : 모듈을 삭제

블럭 디바이스 : 블럭 단위로 저장하는 디바이스
문자 디바이스 : 나머지

파일 시스템 : 파일 다루듯이 하드웨어도 다루겠다

시스템 콜 함수 : 커널에 진입하기 위한 함수
표준 입출력 함수 : 일반 c 라이브러리, 중간에 버퍼를 둔다 / 빠름
저수준 입출력 함수는 중간에 버퍼를 두지 않음

c tag 먼저 작성
sudo apt install ctags

include : 헤더파일
lib : 라이브러리

sudo ctags -R
ls -l tags

sudo apt install vim

ctrl+] > 찾아가기
ctrl+t > 돌아가기



복사가 된 것을 확인할 수 있다

1번은 쉘 명령어
2번은 시스템 콜 명령어
3번은 일반 명령어


필요한 헤더파일을 알려준다

top 명령어
kernel timer : f=250Hz / T=4ms

프로그램이 실행되면 프로세스
프로세스 0~3 4개가 있으면
p0가 실행되면 4ms를 보장한다
4ms가 되면 메모리 스택에 저장(스태킹)
다음 4ms는 p1 프로세스, ...
16ms가 지나서 p0가 다시 돌아간다

그런데 만약 영상을 보려하는데 4ms만 보고 끊기면 안되므로 나머지 1,2,3을 대기상태에 보내 잠자게 한다(sleep, block)

제일 먼저 실행된 task는 맨 아래 스택으로 들어간다(RR, round robin)

C는 메모리 구조를 알면 매우 쉽다!
메모리 때문에 쓰는 것

printf, scanf 등등 모두 주소를 넘겨주는 포인터다
문자열은 주소가 리턴된다 주소를 넘겨주면 널문자가 나올때까지 읽는다

history 하면 실행했던 명령어들을 보여주고
!숫자 하면 해당 번호에 실행한 명령어를 실행하고
!! 하면 바로 전에 실행한 것을 실행
!gcc 하면 gcc로 실행했던 명령어 중 가장 최근 것으로 실행한다

  1 #include <unistd.h>
  2 #include <fcntl.h>
  3 #include <stdio.h>
  4 #include <sys/stat.h>
  5 #include <sys/types.h>
  6 #include <string.h>
  7
  8 int main(int argc, char **argv)
  9 {
 10     int n, in, out, i, j;
 11     char buf[1024];
 12
 13     printf("argc : %d\n", argc);
 14     for (i=0; i<argc; i++)
 15     {
 16         printf("%s\n", argv[i]);
 17         for (j=0; j<strlen(argv[i]); j++)
 18         {
 19             printf("%c\n", argv[i][j]);
 20         }
 21     }
 22
 23     if (argc < 3) {
 24         write(2, "Usage : copy file1 file2\n", 25);
 25         return -1;
 26     }
 27
 28     if ((in = open(argv[1], O_RDONLY)) < 0) {
 29         perror(argv[1]);
 30         return -1;
 31     }
 32
 33      if ((out = open(argv[2], O_WRONLY|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR)) < 0) {
 34           perror(argv[2]);
 35           return -1;
 36       }
 37
 38      while ((n = read(in, buf, sizeof(buf))) > 0)
 39          write(out, buf, n);
 40
 41      close(out);
 42      close(in);
 43
 44      return 0;
 45 }

 38      while ((n = read(in, buf, sizeof(buf))) > 0)
 39          write(out, buf, n);
    // 여기서 write 할 때 sizeof(n) 하면 뒤에 담긴 쓰레기 값 때문에 문제가 있다


이렇게 용량을 확인할 수 있다

socket 통신

공유폴더의 hello로 시작하는 클라이언트/서버 파일을 옮긴다
/srv/samba에 저장되니 mv로 linuxC로 옮겨온다


하단 부분의 127.0.0.1이 IP이다

통신은 어디서나 같다(윈도우, 리눅스, 핸드폰, ...)

서버 프로세스는 운영체제에게 소켓을 1개 요청한다
운영체제가 프로세스에게 리턴해준다

바인드 : 파일 디스크 넘버와 물리적인 주소와 포트 번호를 매핑한다

몇개의 클라이언트에 할지 결정한다(대기큐 5개 / blocking 한다)

클라이언트 실행하면 커넥트 한다(서버 주소, 포트를 이용해서)

네트워크(라우터)를 통해 주소를 찾아간다
찾으면 서버에 접속을 한다

그러면 잠들어있던 프로세스가 깨어나면서 read/write한다
클라이언트도 동시에 read/write 한다
지속적으로 서로 read/write 하려면 while문 안에서 돌리면 된다

위의 내용을 도식화하면 다음과 같다

https://www.joinc.co.kr/
여기서 socket 검색해서 찾아볼 수 있다


ipv4 ipv6의 주소크기가 달라서 넣어야함

과제 : copy.c가 복사하는 코드인데 서버 클라이언트 통신과 엮어서 하는 코드 반복
1. 클라이언트에서 파일을 읽고 서버로 100바이트씩 전송
2. 서버는 100바이트씩 클라이언트에서 수신하고 파일 write
3. 클라이언트에서 write가 0이면 종료
4. 서버는 read가 0이면 종료
5. 과제 기한은 일요일 저녁까지
6. tidyone@naver.com

profile
Dragon_muscle

0개의 댓글

관련 채용 정보