본문 바로가기

Embedded21

FreeRTOS와 Semaphore, Queue를 이용한 시리얼 통신 FreeRTOS RTOS(real time Operating System)는 프로세스와 주변 자원을 공유하거나 동작 여부를 보장해주는 방법들의 집단입니다. 여기에는 thread를 기본으로 task를 구성하는 방법과, 자원을 공유하는 뮤텍스 세마포어등이 기본으로 들어갑니다. 향후에 이에 관한 세부 내용을 정리하겠습니다. 이글에서는 RTOS 중에서 마이크로프로세서에 많이 사용되는 FreeRTOS를 이용해서 Arduin 에서 시리얼 통신을 구현하는 방법을 알아보겠습니다. Arduino의 FreeRTOS Arduino에서 FreeRTOS를 이용해서 시리얼 수신하는 방법을 알아보겠습니다. 우선 다른 글에서 다루었던 Queue 생성 내용을 먼저 참조해야 합니다. 먼저 아두이노에서 라이브러리 매니저에서 FreeRTO.. 2021. 10. 24.
Arduino, FreeRTOS, semaphore, mutex 개요 RTOS 동기화 RTOS에서 태스크 동기화(task synchronization)는 한마디로 특정 자원을 여려 태스크가 공유해 사용할 때 발생하는 교착상태(deadlock)를 해소하는 방법을 의미합니다. 교착상태는 하나의 자원을 여러 태스크가 서로 사용하겠다고 또는 어떤 이유에서 인지 태스크가 반환하지 못하는 경우에 발생해서 관련된 태스크들이 동작을 멈추는 현상으로 RTOS가 가지는 문제 중 하나입니다. 예를 들어 아두이노에서 Serial.pintln()을 두 개의 태스크가 서로 사용하려 하면 둘 중에 하나의 태스크만 사용할 수 있거나, 둘 다 사용하지 못하는 경우가 발생합니다. 이와 같은 문제를 해결하는 방법이 동기화이고 FreeRTOS는 세마포어(semaphore)와 뮤텍스(mutex)를 사용합니다... 2021. 10. 23.
Arduino, FreeRTOS, LED Toggle RTOS 임베디드 장치에서 RTOS(real time Operating system)의 활용은 이미 정착된 기술입니다. ARM을 비롯해서 아두이노에서도 이를 이용하는 것이 기초처럼 되었습니다. 특히 FreeRTOS를 사용하는 경우가 많습니다. 이 글을 포함에서 몇 번에 걸쳐서 FreeRTOS의 활용방법에 대해서 알아볼 것이고, 이글에서는 가장 기초적인 내용인 LED를 운영하는 방법을 알아보겠습니다. FreeRTOS로 LED를 토글 아두이노는 LED_BUILTIN 이미 정의된 LED와 포트가 있습니다. 이를 이용해서 현재 펌웨어가 잘 진행 중인지를 표시하는 방법이 있습니다. FreeRTOS로 LED를 계속 토글(Toggle)하여 이를 표시하는 방법이 가장 많이 사용됩니다. FreeRTOS로 스레드를 하나 .. 2021. 10. 23.
라즈베리파이에서 UART 사용 UART 사용하기 UART 방식의 통신이 여전히 임베디드에서 사용되고 있습니다. 참으로 오래된 통신 방식이고 단점도 있지만 매우 간단하고 편리하면서 값싸게 구현이 가능하게 때문이겠죠. 물론 관련된 기술적 정보도 튼튼히 많이 있기도 합니다. 이 글에서는 라즈베리에서 UART를 사용하기 위한 기초인 설정과 검토 방법을 알아보겠습니다. 시리얼 통신과 UART 흔히 UART 통신을 시리얼 통신(serial communication)이라고 부르지만 엄밀히 말하면 잘못 용어를 적용한 것입니다. 시리얼 통신은 통신 데이터의 비트 표현을 시간에 따라 한 번에 한 비트씩 보내는 방법입니다. 그래서 직렬 통신이라고 부릅니다. 이와 대응하는 방법이 병렬 통신 (paralled communication)로 데이터를 표현하는 .. 2021. 10. 10.
시리얼 통신을 위한 Queue의 생성 Queue 임베디드 시스템의 프로세서 속도가 빠르기 때문에 오히려 인터럽트 발생이 많은 시리얼 통신을 RTOS를 이용해서 안정적으로 통신을 관리하는 방법이 사용됩니다. 이를 위해서는 RTOS가 제공하는 queue를 사용하거나, 자신이 queue를 만들어서 활용하기도 합니다. 그런데 RTOS가 제공하는 queue는 몇 개의 단점이 보여서 queue 클래스를 만들어서 활용하고 있습니다. 이 글에서는 아두이노를 위한 queue 생성 코드를 알아보겠습니다. //- 중복 컴파을 방지용 #ifndef MY_QUEUE_H #define MY_QUEUE_H //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #include #i.. 2021. 8. 17.
RaspberryPi-온도에 따라 제어되는 FAN 구성 라즈베리 파이의 팬 제어 라즈베리파이에서 CPU 온도에 따라 냉각 팬을 동작하도록 구성이 가능합니다. 다음 명령어로 GPIO 핀을 팬을 도작하도록 유도할 수 있습니다. sudo raspi-config 그리고 팬을 제어할 GPIO 포트 번호를 선택하면 됩니다. 이때 14번이 기본으로 되어 있습니다. 팬 제어 회로 그런데 조그만 팬이고 5V로 동작하는 팬은 그냥 사용해도 되지만, 큰 전류와 전압을 사용하는 팬은 GPIO 핀에서 전력을 직접 공급받아 사용할 수 없습니다. 그래서 다음과 같은 팬 인터페이스 회로를 사용할 필요가 있습니다. 광고좀 꾹 눌러주시면 고맙겠습니다. 위의 내용을 참조용으로만 사용해주세요. 무단 도용이나 무단 복제는 불허합니다. 기타 문의 사항은 gigasound@naver.com에 남겨 .. 2021. 8. 14.
RaspberryPi-한글 설정 Raspberry Pi를 한글로 설정해서 설치하면, 처음에 한글 부분이 모두 보이지 않습니다. 이는 터미널에서도 동일합니다. 다음과 같은 내용을 설치하고 reboot 하면 한글 부분이 잘 보입니다. sudo apt-get install ibus -y sudo apt-get install ibus-hangul -y sudo apt-get install fonts-unfonts-core -y 2021. 8. 11.
MobaXterm, WinSCP의 설치와 활용 ssh 접속을 위한 MobaXterm ssh를 통해 Raspberry Pi에 접속해서 원격 작업을 많이 수행하게 됩니다. 가장 많이 사용하는 방법은 Putty를 이용하는 거겠죠. 그러나 Putty는 다중 모니터 환경을 제공하고 있지 않기 때문에 아주 조금 불편합니다. 'MobaXter은 4개의 다중 모니터 환경을 제공합니다. 즉 4개의 Raspberr Pi에 동시에 접속하거나, 한 개의 Raspberry Pi에 다른 4개의 경로에 접속해서 사용해도 됩니다. MobaXterm은 https://mobaxterm.mobatek.net/download.html에서 구할 수 있는데, 가정에서 사용하는 조건이면 무료입니다. 그러니 사무실에서 사용하려면 구매를 해야 합니다. 설치된 MobaXterm에서 4개의 모니터.. 2021. 8. 11.
RaspberryPi- sysv-rc-conf로 부팅 프로그램 관리 그리고 런 레벨 Raspberry Pi에서 부팅을 통해 동작하는 프로그램을 설정할 수 있습니다. 이를 관리하는 간단한 프로그램이 sysv-rc-conf로 다음과 같이 설치합니다. 이 프로그램은 sudo와 함께 사용해야 합니다. sudo apt-get install sysv-rc-conf 그러면 다음과 같이 리눅스의 런 레벨에 따라 동작할 프로그램을 지정할 수 있습니다. 사용 방법은 스크린 맨 위에 표시됩니다. 부팅 시, 동작하고자 하는 프로그램과 런 레벨을 x 표시로 묶어서 활성화하면 됩니다. 대부분의 프로그램이 적합한 런 레벨을 설정해 줍니다. 또한 프로그램의 실행 여부를 결정할 수도 있습니다. (service 명령어와 동일합니다.) 런 레벨(run level)은 어떤 내용으로 리눅스를 실행할 것인지 설정하는 방식입니.. 2021. 8. 11.
Linux-DOS format 파일의 사용 windows에서 생성된 파일을 linux에서 사용하려면 오류가 발생할 때가 있습니다. 이는 window에서 생성된 파일은 기보적으로 DOS format으로 기록되기 때문입니다. 이를 linu에서 사용하려면 다음의 파일을 설치하면 됩니다. sudo apt-install dos2unix 그리고 변환고자 하는 파일을 선택하여 실행하면 됩니다. sudo dos2unix test.txt 2021. 8. 11.
Linux- Shell 명령어에서 외부 변수 사용하기 shell를 사용할 때 가끔 외부 변수를 조건으로 사용하고 싶을 때가 있습니다. 다음과 같이 test.sh의 shell을 작성하면 두 개의 입력 변수를 받아서 화면에 출력하게 됩니다. #!/bin/Bash echo "> $1" echo ">> $2" 다음과 같이 실행해 보겠습니다. sh test.sh abc 1234 그러면 다음과 같이 출력됩니다. > abc >> 1234 shell에서 $0인자는 자기 자신을 의미합니다. c 언어에서 arg []의 첫 번째 내용이 자신의 이름을 표시하는 것과 같습니다. 그러므로 사용하고자 하는 인자는 $1부터 시작합니다. 2021. 8. 11.
RaspberryPi- 바탕화면 바로가기 아이콘 Raspberry Pi의 바탕화면에 아이콘을 만들어 사용하는 방법입니다. 바탕화면의 아이콘은 /home/pi/Desktop/test.desktop 형식으로 기록됩니다. 여기서 test.desktop은 실험용 아이콘 이름입니다. 그러므로 다음과 같은 명령어로 아이콘을 생성합니다. sudo nano ~/home/pi/Desktop/test.desktop 그리고 다음 내용을 입력합니다. [Desktop Entry] Type=Application Encoding=UTF-8 Name=test Path=~/home/pi/test Exec=sh test.sh Terminal=true Icon=~/home/pi/test/test.png 그러면 바탕화면에 test 아이콘이 생성됩니다. Terminal=false로 하면 .. 2021. 8. 10.
Linux- netstat, nmap. ufw로 네트워크 접근 관리 hr contenteditable="false" data-ke-type="horizontalRule" data-ke-style="style5" /> netstat netstat -a 명령어로 모든 network의 동작 상태를 볼 수 있습니다. netstat -l은 리스닝 상태만 보여줍니다. netstat -lnpt로 tcp의 리스닝 상태의 포트만 볼 수 있습니다. Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:8084 0.0.0.0:* LISTEN 556/mono tcp 0 0 0.0.0.0:22 0.0.0.0:* L.. 2021. 8. 10.
Linux- 네트워크 통신 속도 알아보기 네트워크의 송신 수신 속도를 알아보려면 다음과 같은 내용을 먼저 설치합니다. sudo apt=get install ifstat -y ifstat를 실행하면 사용 중인 모든 네트워크 카드의 통신 상태가 1초 간격으로 계속 출력됩니다. ^C를 눌러서 진행을 멈출 수 있습니다. eth0 wlan0 KB/s in KB/s out KB/s in KB/s out 0.00 0.00 0.04 0.13 0.00 0.00 0.04 0.13 0.00 0.00 0.04 0.11 0.00 0.00 0.04 0.11 이번엔 무선랠카드의 상태를 1초 간격으로 3번만 출력하겠습니다. ifstate -i wlan0 1 3 wlan0 KB/s in KB/s out 0.04 0.11 0.04 0.11 0.04 0.11 무선랜 상태를 한번.. 2021. 8. 10.
RaspberryPi- 하드웨어 정보 얻기 CPU 온도 알아보기 CPU의 온도를 다음과 같은 명령어로 알아볼 수 있습니다. vcgencmd measure_temp 그러면 다음과 같은 내용이 화면에 보입니다. temp=47.2'C 여기서 숫자만 추출해서 기록하고 싶으면 다음과 같은 shell 명령어를 만들면 됩니다. cgencmd measure_temp | grep -o '[0-9]*\.[0-9]*' 그러면 온도 부분의 숫자만 출력됩니다. CPU 사용률 CPU의 사용률을 구하려면 먼저 다음의 파일을 설치해야 합니다. sudo apt-get install sysstat -y 그리고 다음과 같이 실행하면 CPU의 전반적인 상태를 보여줍니다. mpstat Linux 5.10.52-v7+ (pi3-27) 2021년 08월 10일 _armv7l_ (4 CP.. 2021. 8. 10.
RaspberryPi- booting하고 자동으로 프로그램 시작하기 부팅과 동시에 프로그램을 실행하고 싶으면 아래의 파일을 열고 수정합니다. sudo nano /etc/profile.d/bash_completion.sh 파일의 맨 아래에 원하는 프로그램명을 추가합니다. 이때 맨 뒤에 '&'를 추가해서 백그라운드로 동작하도록 유도합니다. /home/pi/dasp/mono dasp.exe & 2021. 8. 10.
Linux- ssh의 root 접근 ssh를 root 권한으로 접근하려면 아래와 같이 파일을 열고 수정하면 됩니다. sudo nano /etc/ssh/sshd_config #PermitRootLogin without-password PermitRootLogin yes 2021. 8. 10.
RaspberryPi- 부팅 화면 조정하기 Raspberry Pi의 부팅 화면의 표시를 조정 가능합니다. 다음의 블로그를 참조하였습니다. https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=asdf2017&logNo=221312591395 부팅 레인보우 지우기 부팅에서 화면에 보이는 레인보우 형태의 표시를 지웁니다. 다음과 같이 파일을 엽니다. sudo nano /boot/config.txt 그리고 다음의 내용을 추가합니다. disable_splash=1 avoid_warnings=1 부팅 로고 변경 부팅 화면에 보이는 로고를 변경할 수 있습니다. 다음 경로에 파일을 원하는 내용으로 그림을 수정하고 다시 기록하면 됩니다. WinScp.exe와 같은 프로그램을 사용해서 Windo.. 2021. 8. 10.
Linux- dhcp의 고정 IP 할당 RaspberryPi- 네트워크에서 고정 IP로 할당하고 싶을 때 다음과 같은 파일로 접근합니다. sudo nano /etc/dhcpcd.conf 그리고 아래와 같이 원하는 IP 주소를 할당합니다. interface eth0 static ip_address=192.168.0.30 static netmask=255.255.255.0 static routers=192.168.0.1 static domain_name_servers=168.126.63.1 interface wlan0 static ip_address=192.168.0.40 static netmask=255.255.255.0 static routers=192.168.0.1 static domain_name_servers=168.126.63.1 2021. 8. 10.
RaspberryPi- IPv6 사용하지 않기 Raspberry Pi에서 IPv6를 사용하지 않도록 조정이 가능합니다. 다음과 같이 파일을 엽니다. sudo nano /boot/cmdline.txt 한 줄로 작성된 내용에 다음을 추가합니다. ipv6.disable=1 2021. 8. 10.