728x90
반응형

임베디드 28

[라즈베리파이] 3단 선풍기 만들기

개요 버튼 1 : 선풍기 on / off 버튼 2 : 선풍기 속도 up 버튼 3 : 선풍기 속도 down FND : 현재 속도 1~3 단계까지 표시 LED : 선풍기의 on / off 여부 회로구성 준비물 : 버튼 3개, FND, LED 하나, DC모터 (본인은 DC모터가 고장나서 전동모터로 대신함) 코드 from gpiozero import PWMLED, Button,LED from time import sleep led = LED(2) btn_on = Button(17) #onoff btn_up = Button(27) #up btn_down = Button(22) #down a=LED(5) b=LED(6) c=LED(13) d=LED(19) e=LED(26) f=LED(16) g=LED(20) dp=..

임베디드 2022.04.24

[라즈베리파이] 도어락 만들기

개요 - 버튼 0과 1로 구성된 비밀번호 네자리를 누르면 잠금장치가 풀린다. - 네자리 비밀번호를 정확히 눌렀을때, 녹색 LED가 켜지고 서보모터가 동작한다. 1초후 원상복구 - 비밀전호가 틀렸을때, 빨강 LED가 켜지고 1초후 꺼진다. 회로구성 준비물 : LED 빨간색, 녹색, 버튼 2개, 서보모터 라즈베리파이 코드 from gpiozero import AngularServo,LED,Button from time import sleep red = LED(2) green = LED(3) btn0 = Button(17) #onoff btn1 = Button(27) #up def up(): global red, green,servo green.on() red.off() servo.angle = 90 def ..

임베디드 2022.04.23

[Thread] 멀티스레드와 임계영역의 mutex init/lock/unlock/destory

멀티스레드를 사용하다보면 데이터가 공유되기 때문에 의도한 대로 데이터가 변경되지 않을 수 있다. 그럴 때 mutex lock 을 이용하여 임계영역을 설정하고 데이터를 보호할 수 있다. 임계영역 (Critical Section) 스레드나 프로세스가 동시에 접근해서는 안되는 곳으로, mutex_lock으로 보호해주어야한다. 멀티스레드 버그가 발생하는 이유 개발자의 의도는 40000 이 출력되도록 만드는 것이다. 그런데 실제로 실행해보면 아니다. 순서는 보장이 안되는 걸 아니까 누가 먼저 실행될지는 모르지만 어쨌든 10000을 네번 도니까 40000이 나올것이라고 예상할 것이다. 그런데 40000은 안나오고 매번 그 이하의 숫자가 나온다. 이런 일이 발생하는 이유는 스레드와 메모리 사이의 데이터 이동 순서가 ..

임베디드 2022.04.22

[Thread] 멀티스레드 인자 값 넘기기

thread 에 인자값을 넘길 수 있다. create시 변수의 주소를 넘기는 방식을 이용한다. 구조체 변수를 이용하면 더 많은 값을 넘길 수 있다. 멀티스레드 인자값 넘길 때 문제점 예를 들어 다음과 같은 코드를 실행하면 어떤 값이 나올 것 같은지 예상해보자. 0~3로 변하는 i 값이 printf 되고, 스레드는 순차적으로 진행되지 않다는 특징을 알고있다면 0 1 2 3 3 2 1 0 3 1 0 2 뭐 이런식이겠지 싶을것이다. 그런데 실제로는 이렇게 나오지 않는다.듣도 보도 못한 4가 나온다.. 잘 보면 숫자가 중복돼서 나올 때도 있다. 스레드 동작이 이상한 이유 왜그럴까..? 힌트는 main 함수도 스레드라는 것이다. 원인은 스레드를 생성하는 것보다 main 함수가 반복문을 도는 것이 더 빠르기 때문이..

임베디드 2022.04.21

[Thread] POSIX 멀티스레드 예시 작성하기

멀티스레드를 구현하기 위해서 POSIX API를 이용해야한다. POSIX 임베디드 어플리케이션 개발자는 제품마다 사용되는 OS가 다 다르기 때문에 각 OS마다 API 각각 알아야했다. 이런 불편함을 줄여주는 POSIX API는 OS마다 제공되는 API를 하나로 통일하였다. IEEE에서 제정한 API 표준 규격으로, POSIX API만 배워두면 여러 임베디드 OS에서도 편리하게 어플리케이션 개발이 가능하다. 멀티스레드가 필요한 이유 특정 함수를 동시에 동작시키고 싶을 때 사용한다. 이전 글에서 이용한 예시를 이어서 스레드의 필요성에 대해 설명해보겠다. 위 코드는 abc 함수가 끝나지 않기 때문에 bts 함수가 시작도 못한다. 하지만 개발자의 의도는 abc 함수와 bts 함수가 동시에 동작하는 것이다. 그렇..

임베디드 2022.04.19

[Thread] 멀티프로세스와 멀티스레드

시스템 프로그래밍의 시작으로 멀티 프로세스와 멀티 스레드에 대해서 알아보고자 한다. 멀티프로세스 (Multi Process) CPU는 한번에 한가지 동작만 수행한다. (싱글 코어일 경우) 그렇기 때문에 한 프로세스를 수행하고 있다면, 다른 프로세스는 멈춰있는 상태가 될 것이다. 그런데 우리는 컴퓨터로 동시에 블로그도 하고 게임도 하고 영상통화도 할 수 있다. 이건 어떻게 가능한 것일까? CPU가 하나이기 때문에 이걸 가능하게 하는 것은, 매우 빠른 속도로 모든 프로세스를 하나씩 돌아가면서 수행하는 것이다. 그렇게 해서 우리 눈에는 동시에 수행하는것 처럼 보여지는 것이다. 멀티스레드 (Multi Thread) 멀티스레드는 한 프로세스 내에서 두개 이상의 함수를 동시에 실행시키고 싶을 때 사용한다. 예를 들..

임베디드 2022.04.18

[메모리] 메모리구조 : text data bss stack heap

시스템 프로그래밍의 꽃인 멀티 스레딩을 배우기 전 메모리 구조를 잘 알아야 임계영역과 뮤텍스를 좀 더 쉽게 이해할 수 있다..!! stack 과 heap 공간의 차이를 알면 코딩테스트를 준비할 때에도 도움이 될 수 있다. (stack / heap 의 메모리 공간 제한이 있는 경우가 있다) 메모리 0과 1로된 CPU 명령어를 저장한다. 메모리 공간을 각 프로세스마다 나누어서 사용하고, 프로세스마다 세부적인 공간을 가진다. 프로세스 구성 하나의 프로세스는 text / data / bss / stack / heap 으로 구성되어있다. text 코드 영역 data 초기화된 전역변수 bss 초기화 안된 전역변수 heap malloc으로 만든 변수 stack 지역변수 위와 같이 세그먼트가 구성되어있다. int da..

임베디드 2022.04.17

[시스템] 폰노이만 구조와 캐시메모리

폰노이만 구조 / 폰노이만 아키텍처 / CPU 와 메모리 / 메모리 / 캐시메모리 / DRAM vs SRAM / 메인메모리와 캐시메모리 차이점 / 컴퓨터구조 / 시스템구조 컴퓨터 구조가 어떻게 되어있는지 알아보자. 컴퓨터 공학도라면 폰노이만 구조를 정확히 알고 있어야한다. 이를 기본으로 캐시메모리까지 배워보자. CPU CPU 는 0과 1로 구성된 명령어를 하나씩 수행하는 장치이다. 여기에는 명령어를 저장할 넉넉한 공간이 없기 때문에 하드디스크에 CPU가 동작할 명령어를 저장해두어야한다. CPU에 명령어가 하나씩 전달되고, 이에 따라 명령어를 수행한다. 하지만 CPU와 하드디스크만 두고 컴퓨터를 만든다면 CPU 효율이 너무 떨어진다는 문제점이 있다. CPU는 엄청 빠른데, 하드디스크는 너무 느리다. 하드디..

임베디드 2022.04.16

[C언어] Byte / Bit 단위 데이터 파싱

바이트 단위 데이터 파싱과 비트 단위 데이터 파싱에 대해 알아보겠다. 임베디드 개발자는 비트 / 바이트 단위 데이터 파싱에 대해 매우 잘 알고 있어야한다. 하드디스크 데이터시트를 보고 비트 / 바이트단위로 데이터를 가져올 수 있어야 하기 때문이다. Byte 단위 데이터 파싱 Union 한 union 속 멤버들은 서로 값을 공유한다. Union을 이용해서 바이트 단위의 파싱을 편리하게 할 수 있다. 참고로 순서가 거꾸로인건 메모리에 리틀엔디안으로 저장되어있기 때문이다. 리틀엔디안에 대한 자세한 설명은 다음 포스팅을 참고 바란다. [메모리] 빅/리틀 엔디안 (Big/Little-Endian) 빅엔디안 / 리틀엔디안 / Big Endian / Little Endian / 엔디안 / 메모리 저장 순서 / 엔디안..

임베디드 2022.04.12

[C언어] 문자열 파싱 2 - sscanf sprintf strtok strchar strstr strtol

C언어 / 문자열 파싱 / sscanf sprintf strtok strchar strstr strtol / 임베디드 개발 / 임베디드 문자열 파싱 / 임베디드 파싱 전 포스팅에 이어 문자열 파싱에 대해 이야기해보겠다. sscanf 문자열을 내가 원하는 형식으로 쪼개어 저장한다. 예시 char vect[30]="[Blog] IT 2022"; char title[10]; char msg[10]; int num; sscanf(vect, "[%s]%s%d", &title, &msg, &num); // title 에 Blog, msg에 IT, num에 2022 저장됨 sprintf 문자열을 내가 원하는 형식으로 합쳐서 저장할 수 있다. 예시 char vect[30]; char title[10] = "Blog";..

임베디드 2022.04.11
728x90
반응형