1 Hanbat National University Prof Lee Jaeheung 1
임베디드 실습 #1 기초 실습 Hanbat National University Prof. Lee Jaeheung 1
리눅스 사용 방법 q VI 실습 # vi test. c #include <stdio. h> int main() { int i, j; int n = 5; for( i=0 ; i<n ; i++ ) { for( j=0; j<=i ; j++ ) { printf("*"); } printf("n"); } return 0; } Hanbat National University Prof. Lee Jaeheung 5
리눅스 사용 방법 q VI 설정 $ vi ~/. vimrc set cindent set number Hanbat National University Prof. Lee Jaeheung 6
리눅스 사용 방법 q GCC 컴파일러 – GCC 컴파일러란? § GCC(GNU Compiler Collection)는 GNU 프로젝트의 일환으 로 개발되어 널리 쓰이고 있는 컴파일러 § C/C++, JAVA, 포트란, 에이다등 여러 언어를 컴파일 가능 § GCC 가장 최근버전은 7. 3 – GCC 버전 확인 방법 § gcc -v [test: ~]$ gcc -v Using built-in specs. Target: i 486 -linux-gnu Configured with: . . /src/configure -v --with-pkgversion='Ubuntu 4. 3. 2 -1 ubuntu 12' --withbugurl=file: ///usr/share/doc/gcc-4. 3/README. Bugs --enable-languages=c, c++, fortran, objc, obj-c++ -prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --with-gxx-include-dir=/usr/include/c++/4. 3 --programsuffix=-4. 3 --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-mpfr -enable-targets=all --enable-checking=release --build=i 486 -linux-gnu --host=i 486 -linux-gnu -target=i 486 -linux-gnu Thread model: posix gcc version 4. 3. 2 (Ubuntu 4. 3. 2 -1 ubuntu 12) Hanbat National University Prof. Lee Jaeheung 7
리눅스 사용 방법 q GCC 컴파일러 – 컴파일 방법 § gcc -o [생성할목적파일이름] [컴파일할소스파일이름] § ex) gcc -o test. c § 오류가 없는 경우 [test: ~/test]$ gcc -o test. c [test: ~/test]$ § 오류가 있는 경우 [test: ~/test]$ gcc -o test. c: In function ‘main’: test. c: 9: error: expected ‘, ’ or ‘; ’ before ‘for’ test. c: 9: error: expected ‘; ’ before ‘)’ token test. c: 9: error: expected statement before ‘)’ token [test: ~/test]$ Hanbat National University Prof. Lee Jaeheung 8
C언어 기초 실습 q 파일 처리 – FD 지원 함수 § 읽기 – read : FD로부터 원하는 만큼의 데이터를 얻어옴 • [ int read(int fd, void *buffer, int length) ] – Ex) 파일 오픈 후 100 Byte를 읽어옴 #include <unistd. h> int fd, len; char buffer[100]; fd = open(“test. txt”, O_RDONLY); len = read(fd, buffer, 100); Hanbat National University Prof. Lee Jaeheung 14
C언어 기초 실습 q 파일 처리 – FD 지원 함수 § 쓰기 – write : FD로 원하는 만큼의 데이터를 내보냄 • [ int write(int fd, void *buffer, int length) ] – Ex) 파일 오픈 후 문자열을 덧붙임 #include <unistd. h> int fd, len; char buffer[100]; fd = open(“test. txt”, O_RDWR | O_APPEND); sprintf(buffer, “TEST APPENDn”); len = write(fd, buffer, strlen(buffer)); Hanbat National University Prof. Lee Jaeheung 15
C언어 기초 실습 q 파일 처리 – FD 지원 함수 § 닫기 – close : FD를 닫음 • [ int close(int fd) ] – Ex) 파일 오픈 후 FD를 닫음 #include <unistd. h> int fd; fd = open(“test. txt”, O_RDWR); close(fd); Hanbat National University Prof. Lee Jaeheung 16
C언어 기초 실습 q 파일 처리 – 파일 크기 구하기 § stat – Ex) 파일크기 구하기 #include <sys/stat. h> int filesize; struct stat_buf; stat(“test. txt”, &stat_buf); filesize = stat_buf. st_size; printf(“File. Size = %dn”, filesize); Hanbat National University Prof. Lee Jaeheung 18
C언어 기초 실습 q 실습 #include <stdio. h> #include <fcntl. h> #include <sys/stat. h> #include <stdlib. h> #include <unistd. h> int main() { int fd, len; int filesize; struct stat_buf; char *buffer; stat("test. txt", &stat_buf); // 파일 정보 읽기 filesize = stat_buf. st_size; // 파일 사이즈 구하기 buffer = (char *)malloc(filesize* sizeof(char)); // 메모리 동적할당 fd = open("test. txt", O_RDONLY); // 파일 읽기 len = read(fd, buffer, filesize); // 버퍼에 파일 내용 가져오기 printf("%s", buffer); // 버퍼 출력 close(fd); // 파일 닫기 return 0; } Hanbat National University Prof. Lee Jaeheung 20
스레드 q 함수 – int pthread_create( // pthread 생성 pthread_t *thread, const pthread_attr_t *attr, void *func (void *arg), void *arg); – int pthread_join( pthread_t th, void **retval); // // thread ID를 저장할 변수 thread 속성(옵션) thread 생성 후 실행될 함수 func 함수에 전달하는 인자 // thread 종료를 대기 // 대기할 thread // 종료시 반환 값 Hanbat National University Prof. Lee Jaeheung 22
스레드 q 사용법 #include <stdio. h> #include <pthread. h> #include <unistd. h> void *print_thread(void *arg); int main(){ pthread_t th_1; int id_1 = 0; id_1 = 1; pthread_create(&th_1, NULL, print_thread, &id_1); getchar(); id_1 = 0; pthread_join(th_1, NULL); return 0; } void *print_thread(void *arg){ int *id = (int *)arg; while( *id > 0 ){ printf("Thread ID = %dn", *id); usleep( 1000 * 1000 ); } return NULL; } # gcc –o thread_test. c –lpthread Hanbat National University Prof. Lee Jaeheung 23
스레드 q 실습 : 스레드 테스트 #include <stdio. h> #include <pthread. h> #include <unistd. h> void *print_thread(void *arg); int main(){ pthread_t th_1, th_2, th_3; int id_1, id_2, id_3; id_1 = 1; id_2 = 2; id_3 = 3; pthread_create(&th_1, NULL, print_thread, &id_1); pthread_create(&th_2, NULL, print_thread, &id_2); pthread_create(&th_3, NULL, print_thread, &id_3); getchar(); id_1 = id_2 = id_3 = 0; pthread_join(th_1, NULL); pthread_join(th_2, NULL); pthread_join(th_3, NULL); return 0; } void *print_thread(void *arg){ int *id = (int *)arg; while( *id > 0 ){ printf("Thread ID = %dn", *id); usleep( 1000 * 1000 ); } return NULL; } Hanbat National University Prof. Lee Jaeheung 25
소켓 통신 q 함수 – int socket(int domain, int type, int protocol); – int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); – int listen(int sockfd, int backlog); – int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); – int connect(int socket, const struct sockaddr *address, socklen_t address_len); Hanbat National University Prof. Lee Jaeheung 27
소켓 통신 q 실습파일 - http: //artoa. hanbat. ac. kr/lecture_data/embedded_sw/tcp/server. c - http: //artoa. hanbat. ac. kr/lecture_data/embedded_sw/tcp/client. c Hanbat National University Prof. Lee Jaeheung 29
q 서버 모드 ( server. c ) - $ gcc –o server. c - $. /server 1234 #include #include if(bind(serv_sock, (struct sockaddr*)&serv_adr, sizeof(serv_adr))==-1) error_handling("bind() error"); <stdio. h> <stdlib. h> <string. h> <unistd. h> <arpa/inet. h> <sys/socket. h> if(listen(serv_sock, 5)==-1) error_handling("listen() error"); clnt_adr_sz=sizeof(clnt_adr); #define BUF_SIZE 1024 void error_handling(char *message); clnt_sock=accept(serv_sock, (struct sockaddr*)&clnt_adr, &clnt_adr_sz); if(clnt_sock==-1) error_handling("accept() error"); else printf("Connected client %d n", i+1); int main(int argc, char *argv[]) { int serv_sock, clnt_sock; char message[BUF_SIZE]; int str_len, i; while(1){ str_len=read(clnt_sock, message, BUF_SIZE-1); message[str_len]=0; printf("Message from client: %s", message); write(clnt_sock, "I got your message", strlen("I got message")); } struct sockaddr_in serv_adr; struct sockaddr_in clnt_adr; socklen_t clnt_adr_sz; if(argc!=2) { printf("Usage : %s <port>n", argv[0]); exit(1); } serv_sock=socket(PF_INET, SOCK_STREAM, 0); if(serv_sock==-1) error_handling("socket() error"); memset(&serv_adr, 0, sizeof(serv_adr)); serv_adr. sin_family=AF_INET; serv_adr. sin_addr. s_addr=htonl(INADDR_ANY); serv_adr. sin_port=htons(atoi(argv[1])); close(clnt_sock); close(serv_sock); return 0; } void error_handling(char *message){ fputs(message, stderr); fputc('n', stderr); exit(1); } Hanbat National University Prof. Lee Jaeheung 30
q 클라이언트 모드 ( client. c ) - $ gcc –o client. c - $. /client 127. 0. 0. 1 1234 #include #include <stdio. h> <stdlib. h> <string. h> <unistd. h> <arpa/inet. h> <sys/socket. h> if(connect(sock, (struct sockaddr*)&serv_adr, sizeof(serv_adr))==-1) error_handling("connect() error!"); else puts("Connected. . . "); while(1) { fputs("Input message(Q to quit): ", stdout); fgets(message, BUF_SIZE, stdin); #define BUF_SIZE 1024 void error_handling(char *message); int main(int argc, char *argv[]) { int sock; char message[BUF_SIZE]; int str_len; struct sockaddr_in serv_adr; if(!strcmp(message, "qn") || !strcmp(message, "Qn")) break; write(sock, message, strlen(message)); str_len=read(sock, message, BUF_SIZE-1); message[str_len]=0; printf("Message from server: %sn", message); if(argc!=3) { printf("Usage : %s <IP> <port>n", argv[0]); exit(1); } } close(sock); return 0; sock=socket(PF_INET, SOCK_STREAM, 0); if(sock==-1) error_handling("socket() error"); } memset(&serv_adr, 0, sizeof(serv_adr)); serv_adr. sin_family=AF_INET; serv_adr. sin_addr. s_addr=inet_addr(argv[1]); serv_adr. sin_port=htons(atoi(argv[2])); void error_handling(char *message) { fputs(message, stderr); fputc('n', stderr); exit(1); } Hanbat National University Prof. Lee Jaeheung 31
- Slides: 31