Embedded 96

자원을 공유하는 다중 쓰레드 실습 소스코드 (뮤텍스-mutex 적용)

안녕하세요.  "[도서]임베디드 소프트웨어 베이직, 13.1 자원을 공유하는 다중 쓰레드 실습" 중 마지막 내용에 전체 소스코드 내용이 없어서  공유합니다.  거의 마지막 실습이고 소스코드 내용을 요약하자면 이전 내용에서 다루었던 pthread를 이용을 하는데 있어 공유하는 변수 2~4개의 다른 쓰레드에서 접근했을 때 어떻게 처리해야 하는지 간략하게 알려줍니다.  세마포어, 뮤텍스 등 방법이 있지만 여기서는 뮤텍스(Mutex)를 활용해서 1씩 증가하고 감소하는 쓰레드와 값이 정상적으로 동작하는지 확인하는 코드입니다.   1. 뮤텍스 활성화 및 쓰레드 4개 테스트 소스코드  100,000번 1씩 증가, 감소하는 쓰레드 함수와 300,000번 1씩 증가, 감소하는 쓰레드를 실행하고, 공유자원으로 사용할 변수..

라즈베리파이(Raspberry Pi)에서 스레드(pthread) 테스트

안녕하세요.  읽고 있는 책(하단 참고 도서 참고)에 내용 중 pthread 내용  조금 수정이 필요한 코드 부분이 있어 수정과 확인을 위해서 공유합니다.  1. POSIX Threads (pthread)란?POSIX Threads(pthreads)는 POSIX (Portable Operating System Interface) 표준을 따르는 멀티스레딩 API입니다.멀티스레딩(multi-threading)을 지원하여 하나의 프로세스 내에서 여러 스레드가 동시에 실행될 수 있도록 설계되었습니다.Unix 계열 시스템(Linux, macOS 등)에서 널리 사용되며, C 및 C++에서 멀티스레드를 구현하는 표준 방법입니다.2. 주요 특징경량 프로세스: 스레드는 동일한 프로세스 내에서 실행되므로 메모리 공간과 리..

라즈베리파이(Raspberry Pi) 리눅스 커널 구성 확인 및 빌드(build) 해보기

안녕하세요.   Rasbperry Pi를 사용하지만, 실질적으로 커널을 빌드해 볼 일을 많이 없을 것이라 생각됩니다. Device Driver 개발을 위해 커널 소스 혹은 해더를 다운로드하는 정도일 것입니다. 간단하게 커널 구성 내용과 빌드하는 방법 정도는 알아 두면 좋을 듯합니다.  언제 시점에서 테스트하느냐에 따라서 디렉터리 경로가 변경될 수 있으니 참고해서 따라 하시면 도움일 될 것입니다.  1. 커널 빌드를 위한 패키지 설치 git : 버전 관리 시스템으로, 소스 코드를 효율적으로 관리하고 공동 작업을 지원합니다. Git은 로컬과 원격 저장소 간의 코드 동기화를 가능하게 합니다. bc : 고급 계산기 언어로, 명령줄에서 수학적 계산을 수행할 수 있습니다. 특히, 스크립트에서 복잡한 계산을 처리할 ..

리눅스(Raspberry Pi)에서 램 디스크(RAMdisk) 장단점 확인 및 램 디스크 테스트 하기

안녕하세요. 기존 HDD에서 처리하다 보면 시간이 오래 걸리기 때문에 RAM에 필요한 코드 부분을 올려놓고 사용하는데요. 원하는 임의의 디스크를 만들어서 HDD에서 하는 것처럼 작동시켜 얼마나 빨리 처리되는지 확인해 보겠습니다.  1. Ramdisk란  시스템의 RAM(주기억장치)을 디스크 드라이브처럼 사용하는 가상 저장 장치를 의미합니다. 쉽게 말해, 메모리(RAM)를 파일 시스템처럼 활용하는 기술입니다. 이 디스크는 실제 물리적 디스크(HDD, SSD)가 아닌 메모리의 일부를 할당해 동작합니다.  운영 체제에서는 이를 임시 파일 시스템으로 다루며, Linux에서는 tmpfs나 ramfs 명령어로  파일 시스템이 RAMDisk로 구현하는 데 사용합니다.  2. 작동 방식   할당 : 시스템 메모리(RA..

임베디드 프로그래밍에서 알아야 할 volatile 키워드

임베디드 소스코드를 보다 보면 가끔 변수 타입 앞에 단어 volatile 하나가 더 붙어 있는 경우를 볼 수 있습니다. 뭐 특별한 기능을 하고 있는 것 같지도 않은데 말이죠.  1. volatile의 정의  영어 단어로서 volatile 의미는 휘발성의, 불안정한, 휘발하는 뜻을 가지고 있습니다. 이런 의미로 프로그래밍에서 volatile은 컴파일러에게 특정 변수의 값이 프로그램 흐름에 의해 예측할 수 없으므로, 항상 메모리에서 직접 읽고 쓰도록 지시하는 키워드입니다.  최적화 과정에서 해당 변수의 값이 캐시 되지 않도록 보장하고 주로 하드웨어 레지스터, 멀티스레드 환경의 공유 변수, 인터럽트 핸들러에서 사용되는 변수에 적용됩니다.  2. 하드웨어 코드 예시  변수의 값을 최적화하지 말고 메모리에서 직접..

Embedded 2025.01.06

[참고 강의] 재미있게 배우는 전기회로 강의 목차 및 간단한 정리 12회 차 – 정현파 교류

안녕하세요.   이번 내용은 정형파에 대한 내용이며 오일러 공식과 복소수의 내용이 나옵니다. 실제 강의 내에서는 복소수의 기초적 강의 부분이 없기 때문에 참고 사이트를 먼저 보고 강의를 보시면 도움이 되지 않을까 합니다.  1. 교류의 기초  1) 직류, 교류    - 직류(Direct Current) : 시간의 변화에 대해 크기와 방향이 일정한 전류 또는 전압   - 교류(Alternating Current) : 시간의 변화에 따라 방향과 크기가 변하는 전류 또는 전압    교류형태 : 정현파, 구형파, 삼각파, 램프파(사다리꼴파)     교류전압은 전자유도현상에 의해 발생 : 코일에서 시간에 따른 쇄교자속이 변화하면서 자속의 변화를 방해하는 방향으로 기전력이 유도되는 현상 2)  정형파 교류  - 정..

[참고 강의] 재미있게 배우는 전기회로 강의 목차 및 간단한 정리 11회 차 – 2차 회로의 과도해석

안녕하세요.  2차 회로 해석은 1차 회로 해석보다 하나 더 소자가 붙기 때문에 계산식이 좀 더 복잡해집니다.아래 내용으로는 계산을 풀어 볼 수는 없고 간단하게 이런 내용이 나왔구나 확인 정도만 할 수 있습니다. 그래서 실제 강의를 보셔야 할 듯합니다. 그리고 본 강의로 부족하기 때문에 마지막 하단에 있는 참고사이트를 추가로 보시면 이해하는데 조금 더 도움이 될 것 같습니다.  1. 2차 회로와 해석  1) 2차 회로   - 인덕터와 커패시터와 같은 저장소자가 동시에 2개가 존재하는 회로  - 2차 미분 방정식으로 표현되고, 특성이 결정된다.  2) 2차 과도회로의 해석 방법   - 미분방정식 적용 : 회로에 대한 미분방정식을 세우고 미분 방정식을 풀어해 구함  - 단계적 해석 : 미리 알려진 경우에 따..

Raspberry Pi CM4에 ModbusTCP Server 실행해 보기 - 4편(ModbusTCP server와 유량센서와 연동)

안녕하세요.  실제로 연동하는 프로그램을 만들어 보려고 합니다.  이전 ModbusTCP내용과 PulseCount를 잘 조합하면 될 것으로 생각했습니다.그런데 가상환경에서 RPi.GPIO의 add_event_detect() 함수를 사용하면 이벤트를 받아서 처리할 수가 없었습니다.    이전 내용을 참고하시면 pigpio 라이브러리 사용하는 방법을 다시 찾아서 확인하였습니다.최종적로 ModbusTCP와 pigpio를 이용해서 작업을 마무리할 수 있었습니다.  1. 코드 구성 확인 소스코드를 보기 전게 간단하게 맥락을 설명하면 아래와 같습니다.  1) 필요한 라이브러리 및 모듈 pyModbusTCP: ModbusTCP 서버를 구현하기 위한 라이브러리pigpio: GPIO 핀에서 센서 데이터를 안정적으로 읽어..

[참고 강의] 재미있게 배우는 전기회로 강의 목차 및 간단한 정리 10회 차 – 1차 회로의 과도 해석

안녕하세요.  이전 내용과 다르게 수학적인 부분이 많이 있어서 많이 어렵게 느껴집니다.그래서 현재 강의로만 이해하기 힘들 것이라 생각되어 하단에 참고 사이트 추가해 둔 교수님의 강의 등을 추가로 들어야 조금이나마 이해가 되지 않을까 합니다.   다음 내용 또한 2차 회로 또한 동일할 것이라고 생각됩니다. 아래 내용은 내용 이해용이라고 보기보다는 간단한 어떤 무료강의에 어떤 내용이 포함되어 있는지 확인용이라고 보시면 됩니다. 1. 1차 회로와 미분방정식   1차 회로는 저항과 커패시터 (R, C) 혹은 저항과 인덕터(R, L)로만 구성된 회로이며, 참고로 2차 회로는 저항과 커패시터, 인덕터(R, L, C)로 구성된 회로 1) 1차 회로와 해석  (1) 1차 회로의 해석 방법    - 미분방정식 직접 적용..

pyinstaller로 실행파일을 만들고 강제종료(ctrl + c) 시 PYI-3170:ERROR 에러 발생 메시지 해결 방법(?)

안녕하세요.  pyinstaller로 실행파일을 만들고 ctrl + c 눌러 종료할 때 보통 아래와 같은 메시지가 나타납니다. 종료할 때 깔끔하게 끝나지 않고 조금 애매하게 종료되는 것 같아서 조금 찾아보았습니다.  1. 테스트 환경   - HW : Raspberry Pi CM4   - OS : bookworm 64bit  - SW :     pip install pyinstaller로 인스톨러를 설치  2. 에러(?) 현상  Python 파일로 실행할 경우 문제없이 종료됩니다. 메모리 혹은 특정 리소스를 점유하고 해제가 필요한 코드에서 에러가 발생하는 것으로 생각됩니다. 현재 시점에서 [PYI-3170:ERROR]로 구글링해도 많이 나오지 않았습니다.  pyinstaller python 프로그램으로 만..

[강의 링크] 재미있게 배우는 전기회로 강의 목차 및 간단한 정리 9회 차 - 커패시터와 인덕터

안녕하세요.   강의를 다 보고 몰아서 정리하려니 양이 많아서 회차별 내용을 간단하게 정리해서 올려보았습니다.  1. 커패시터(Capacitor) 1) 커패시터 : 전하를 축적하여 에너지를 저장하는 수동소자  - 고정 커패시터 : 정전용량이 결정됨 - 가변 커패시터 : 정전용량을 조정 가능 - 전해 커패시터 : 극성을 가짐 2) 커패시터의 충전   - 중성 상태 -> 전원 연결 -> 양쪽 도체판에 음전하, 양전하를 띠게 됨 -> 전압원 전압과 같아지면 전자 이동 멈춤   3) 커패시터의 방전   - 양전하, 음전하 쌓인 도체판 -> 전구연결 -> 음전하 이동 -> 중성상태 -> 전류이동 멈춤  4) 정전용량 : 단위전압당 커패시터가 저장할 수 있는 전하의 양 (기호 : C, 정전용량 단위 : F)   5..

[강의 링크] 재미있게 배우는 전기회로 강의 목차 및 간단한 정리 1~8회 차

안녕하세요.   최근에 전기 기초에 대한 부분이 다시 기억해 보고자 무료 강의를 찾아보았습니다. 강사분이 직접 설명해 주는 것이 아니라서 조금 설명이 부족할 수 있는데(보충 설명할 때는 동영상으로 추가 설명이 있습니다), PPT로 간단간단 강의 자료가 요약 설명이 잘 되어 있습니다. 그래서 빠르게 볼 수 있습니다. 그리고 간단한 예제들로 알려주고 있어 다시 기억해 본다는 차원에서 볼 만했습니다. 1. 강의 목차   1회 차 전기의 기초  2회 차 전기회로와 옴의 법칙  3회 차 키르히호프의 법칙  4회 차 전기회로의 노드 해석법  5회 차 전기회로의 폐로해석법  6회 차 다양한 회로 해석 기법  7회 차 연산 증폭기의 원리와 응용  8회 차 전기와 자기의 상호작용  9회 차 커패시터와 인덕터  10회 차..

Raspberry Pi 가상환경(-m venv)에서 add_event_detect 에러 발생 시 차선책(?)

안녕하세요.   ModbusTCP는 가상환경에서 동작하는 것을 이전 글에서 확인했습니다. 그러나 가상환경에서 GPIO 엣지 검출(Pulse)을 하려고 하는데 생각과 달리 잘 되지 않아서 차선책으로 찾은 방법을 남겨두려고 합니다.   그냥 폴링(Polling)으로 하기에는 정확도와 비효율적이라는 생각이 들어서 해결방법은 없을지 찾아보았습니다.  1. 기본 가상환경 생성 및 설정  Python 표준 라이브러리의 venv 모듈을 사용하여 가상 환경(virtual environment)을 생성합니다. 가상 환경은 Python 프로젝트마다 독립적인 패키지와 Python 인터프리터를 사용할 수 있게 해 줍니다.  아래와 같이 가상환경을 생성 후 RPi 라이브러리 설치 (이전 ModbusTCP 확인 때문에, 설치했다..

Raspberry Pi CM4에 ModbusTCP Server 실행해 보기 - 3편(ModbusTCP server 수정된 함수사용)

안녕하세요.  이전 글에서 deprecated 된 get_words() 함수 관한 부분을 완료하지 못하고 마무리했습니다.이 부분을 다시 확인하고 정리해보려고 합니다. 기본 자료형과 구조는 동일합니다.  1. DataBank Class 최신 함수  최신 버전에서는 DataBank를 직접 호출하는 대신, ModbusServer 객체의 data_bank 속성을 통해 접근합니다 1) DataBank의 메모리 구조 DataBank는 Modbus 표준 메모리 구조를 관리하며, 아래 4가지 메모리 타입을 제공합니다: Coils (1-bit): 읽기/쓰기 가능한 디지털 값Discrete Inputs (1-bit): 읽기 전용 디지털 값Holding Registers (16-bit): 읽기/쓰기 가능한 16비트 값Inp..

PCB Editor 혹은 Or CAD에서 LoadLibrary fails to load with error 126 or error 87 발생할 경우

안녕하세요.   오늘은 OrCAD로 회로 설계하다가 경험할 수 있는 에러에 대해서 공유드립니다.  평상시와 같이 회로설계를 하면서 footprint show를 눌렀는데, OrCAD가 에러 하나를 내고 죽는 현상이 나타났습니다.     저장하고 있지 않은 상황이라 살짝 당황했습니다. 그래서 급하게 검색했습니다.  1. 원인 검색   정확하진 않지만, AMD 계열 그래픽 원인으로 파악되었습니다. ATI 그래픽 카드로 교체했거나, NVIDIA와 같이 사용하는 경우 호환이 되지 않아 나타나는 듯합니다.   OrCAD, PCB Editor에서만 나타나는 것이 아니라, 그래픽 프로그램 (Photoshop, AutoCad) 등에서도 발생하는 듯합니다.  2. 해결책 1) 알려진 해결책   - ATI 그래픽 최신 드라..

Raspberry Pi CM4에 ModbusTCP Server 실행해 보기 - 2편(pyModbusTCP 설치)

안녕하세요.   1편에 이어 ModbusTCP에 대해서 확인해 보겠습니다.테스트 환경은 라즈베리파이 CM4에서 진행했습니다. 이번 글의 목표는 간단하게  pyModbusTCP를 설치해 보고 작동하는 되는 것을 확인하는 것입니다.   1. pymodbusTCP 설치      # install the last available release (stable)$ pip install pyModbusTCP    설치하려고 하면 아래와 같이 에러가 발생할 수 있습니다. 그래서 가상의 환경을 만들어 진행합니다.    가상 환경을 만들더라도 네트워크 환경은 동일하게 유지되며, 가상 환경은 Python 패키지와 종속성만을 격리할 뿐, 네트워크 설정이나 시스템 자원에는 영향을 주지 않습니다. 1) 가상 환경 생성 $ py..

Raspberry Pi CM4에 ModbusTCP Server 설치해 보기 - 1편(ModbusTCP 기본지식)

안녕하세요.   ModbusTCP Server 샘플을 만들어 보기 전에 간단하게 ModbusTCP 이해가 필요할 것 같아서 자료를 찾아보았습니다. 다음 시간에 실제적으로 설치하고 프로그래밍하는 내용을 남겨보려고 합니다.  1. Modbus 프로토콜 개요  Modbus는 산업용 통신 프로토콜로, 공정 자동화에서 주로 사용되며 특히 장비 간의 간단하고 신뢰성 있는 데이터 교환을 위해 설계되었습니다. Modbus는 Master-Slave 방식으로 동작하며, 주로 센서, PLC(Programmable Logic Controller), SCADA(Supervisory Control and Data Acquisition) 시스템과 같은 장치들이 Modbus를 통해 서로 데이터를 주고받습니다.     통신 구조: M..

데이터 시트 트랜지스터 이름에 담긴 의미

안녕하세요.   이번에는 간단하게 트랜지스터에 대해서 설명할 수 있게 정리해 보았습니다.실제적으로 트랜지스터 내부 동작을 보려면 하단의 참조사이트 링크를 참고하시면 됩니다.  1. 트랜지스터(Transistor) 1) 정  의   - 1947년 벨 연구소에서 반도체를 이용한 스위치의 필요성이 대두되어 개발  - 트랜지스터는 3개 이상의 단자를 가지고 있는 능동소자  - 전류 증폭과 스위치 기능  - 매우 낮은 베이스 전류를 가지고 컬렉터와 이미터 간의 전류를 조절  - 나중에 전압을 제어용 입력 신호로 하는 소자인 전계효과 트랜지스터(FET)가 개발됨 2) 구  조   - 접합형 트랜지스터 구조 2가지  - n형에 가운데 p형을 끼워 넣으면 NPN 접합형 트랜지스터가 된다.  - p형에 제어용 전극 n형..

Raspberry Pi에서 유량센서(YF-B10-S)로 유량계산하기

안녕하세요.   이전 글에서 유량센서(YF-B10-S) 제품에 대해서 확인해 보았습니다. 이번 글에서는 실제로 어떻게 값을 구할 수 있는지, Raspberry Pi를 이용해서 확인해 보겠습니다.     YF-B10-S(유량센서) 확인해 보기안녕하세요.  사이드 프로젝트로 유량파악해서 ModbusTCP로 전달이 필요하다는 요청을 받았습니다. 우선 유량을 확인할 수 있는 센서를 확인해 보겠습니다.  파이프 규격과 재질에 따라 가격과remnant24c1.tistory.com  1. 유량센서 테스트 환경  - 라즈베리 파이 CM4 - YF-B10-S 유량 센서 (하네스 SM 3핀 Female 커넥터 장착) - 10kΩ 풀업 저항 (NPN 출력 신호 안정화용) - 점퍼 와이어 혹은 연결 커넥터 하네스 커넥터(SM..

Raspberry pi CM4에 OpenCV 4.6.0과 Contrib 모듈 설치해보기

안녕하세요.   에지 컴퓨팅이라고 해서 단말 장치에서 가까운 위치에서 컴퓨팅을 하는 것을 말합니다. 그래서 라즈베리 파이가 단말장치가 되고 여기서 컴퓨팅, 분석까지 하는 것으로 생각해서 OpenCV를 설치해서 분석을 해보려고 합니다.  OpenCV 설치는 하단 을 따라 진행하였으며, OpenCV 4.5.4에서 에러가 났다고 글이 쓰여 있어서 그 상위 버전으로 테스트해 보았습니다. 그리고 Raspberry Pi OS는 Bullseye 32bit에서 초기화한 상태에서 내용 조금 수정하여 진행하였습니다. 만약 기존 버전이 설치되어 있다면  하단 을 참고해서 삭제 후 진행하시길 추천드립니다.  1. OpenCV 컴파일 전 필요한 패키지 설치 pi@raspberrypi:~ $ sudo apt updatepi@ra..