연구 노트/Embedded
Node.js로 라즈베리파이 GPIO 제어하기 (Blink)
라즈베리파이에서 GPIO를 제어하기 위해 흔히 쓰는 라이브러리로 WiringPi가 있습니다. WiringPi는 C로 만들어진 라이브러리여서 Node.js에서 바로 사용할 수 없습니다. Node.js의 패키지 관리자인 npm에서 WiringPi를 검색해보면 꽤 많은 패키지가 나옵니다. 하지만 제대로 동작하지 않는 것도 있었습니다. 제가 시도해본 것은 'wiring-pi' 'node-wiring-pi', 'rpio', 'onoff' 인데, 이 중에서 제대로 동작한 것은 'rpio'와 'onoff' 입니다. 저는 둘 중에서 'onoff'를 사용하기로 하였습니다. 'onoff'를 선택한 이유 'rpio'와 'onoff' 중에 'onoff'를 선택한 가장 큰 이유는 인터럽트 가능 여부입니다. 'rpio'는 공식적..
라즈베리파이에 Node.js 설치하기
우선 패키지 관리자의 패키지 리스트를 업데이트하고 설치된 패키지를 업그레이드합니다. sudo apt update sudo apt upgrade Node.js 패키지 저장소를 패키지 관리자에 추가합니다. 아래는 2022년 10월 5일 기준 LTS 버전인 16.17.1을 추가하는 과정입니다. curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - 만약 최신 버전인 18.0을 설치하려 한다면 다음과 같이 명령을 입력합니다. curl -fsSL https://deb.nodesource.com/setup_current.x | sudo -E bash - 저장소 추가가 완료되었다면 Node.js를 설치합니다. sudo apt install nodejs ..
[ODROID] Linaro gcc? ARM 아키텍처를 위한 gcc!
오드로이드 위키 페이지를 살펴보면 커널 빌드에 필요한 툴 체인이 무엇인지 알려주고 있습니다. "Linaro gcc"라고 하는데요, gcc는 gcc인데, Linaro는 무엇일까요? Linaro는 2010년에 만들어진 ARM 기반 리눅스 오픈 소스를 지향하는 엔지니어 중심의 비영리 단체입니다. 전 세계의 굵직한 회사들이 참여해서 ARM 기반 리눅스 소프트웨어에 필요한 도구를 개발하고 있습니다. 매월 마지막 주 목요일마다 최신 툴 체인을 배포한다고 합니다. 데비안 계열의 리눅스에서 "apt" 패키지 관리자로는 원하는 버전의 arm을 위한 gcc를 설치할 수 없습니다. 하지만 다행히도 Linaro 홈페이지에 방문하면 여태껏 배포된 gcc를 내려받을 수 있습니다. gcc 버전 4.9 ~ 7.5 저장소 gcc 버전..
임베디드 리눅스 애플리케이션 개발 환경 준비하기
임베디드 리눅스 애플리케이션 개발을 시작하려고 합니다. 그런데 개발 환경을 어떻게 구성하면 좋을까요? 우리에겐 두 가지 선택지가 있습니다. 타깃 디바이스에서 직접 개발 하는 방법과 호스트 PC에서 개발하는 방법입니다. 보통 타깃 디바이스 성능이 일반 PC보다는 좋지 않으므로 별도로 개발용 PC를 두고 작업을 하시는 게 낫습니다. 반면 당장 호스트 PC를 사용할 수 없거나 아직 개발 환경이 준비되지 않았는데 빨리 검토해봐야 한다면 타깃 디바이스에서 직접 코드를 작성해서 테스트해볼 수 있습니다. 이 글에서는 먼저 타깃 디바이스에 직접 개발 환경을 만들어 "Hello World!"를 출력해보는 예제를 설명할 것입니다. 그리고 호스트 PC에서 크로스 컴파일 개발 환경을 준비하는 과정을 살펴봅니다. 호스트 PC에..
[ODROID] Vu8M 디스플레이 연결 설정하기
ODROID에 연결할 수 있는 디스플레이로 Vu8M이라는 제품이 있습니다. 그러나 연결만 한다고 해서 바로 디스플레이가 작동하지 않습니다. Petitboot와 리눅스에서 필요한 설정을 해야만 화면에 영상을 띄울 수 있습니다. 확인 사항 Vu8M을 사용할 수 있는 환경인지 확인해야합니다. Petitboot 버전과 리눅스 커널 버전이 다음과 같아야 합니다. Petitboot: v20220424 이상 리눅스 커널: 4.19.219-202204111511-focal 이상 Petitboot 버전은 ODROID에 HDMI를 연결해서 전원을 켜면 처음에 뜨는 Petitboot 메뉴 화면 상단에서 확인할 수 있습니다. 리눅스 커널 버전은 리눅스 터미널에 아래처럼 명령을 입력해서 알 수 있습니다. dpkg -s linu..
GNU 어셈블러와 링커 스크립트 매뉴얼
GNU 어셈블러와 링커 스크립트 공식 매뉴얼 링크이다. 거의 날것에 가까운 HTML로 작성된 문서이지만 이것만큼 확실하게 설명된 것이 없었다. 어셈블러와 링커 스크립트와 관련해서 모르는 게 생기면 가장 먼저 찾아봐야 할 문서들이다. 한글 문서는 번역된 지 오래되어 영문의 최신 문서와 조금 다른 점이 있을 수도 있다. 어셈블러 공식 문서 한글 번역판 링커 스크립트 공식 문서 한글 번역판 1 한글 번역판 2
[STM32] 레지스터 직접 접근 방식으로 UART 통신 예제 구현하기
HAL 드라이버 없이, 레지스터 접근만으로 UART 통신 예제를 만들었다. 처음 시작할 때는 어디서부터 시작해야 할 지 몰라 막막했고, 하나하나 이해하면서 진행하느라 완성하는 데 약 2시간이 걸렸다. 전체 흐름을 이해하니 생각보다 별것 아니라는 것을 알게 되었다. 레지스터에 직접 접근하는 것도 익숙해졌고, 각 페리페럴에 공급될 클록 신호가 만들어지는 과정도 살펴볼 수 있었다. 프로젝트를 만들 때 HAL 드라이버를 포함하지 않았기 때문에 접근할 레지스터 주소를 데이터 시트를 확인해가며 직접 입력하여 만들었다. Reference Manual(RM0008)의 3.3 Memory Map을 참고하면 좋다. 이번 예제에 필요한 레지스터 주소는 아래와 같다. (사실 USART1은 사용하지 않는데 모르고 만들었다. 아..
ABI, EABI 그 의미를 이해하고 툴 체인 이름까지 해석하기
ABI와 EABI, 그게 뭐야? 아무 생각 없이 공부 자료를 보다가 문득 'ABI'의 의미를 알아야겠다는 생각이 들었습니다. 이에 대해 알아보고 정리한 자료입니다. ABI 'Application Binary Interface'의 약자입니다. 바이너리 수준의 인터페이스 규약을 말합니다. 서로 다른 컴파일러가 소스 코드를 컴파일하더라도 오브젝트 파일끼리 링킹이 될 수 있도록 합니다. EABI 임베디드 환경의 ABI를 의미합니다. ABI와 EABI의 차이점 이런 것들이 있습니다. 권한 명령이 응용 프로그램 코드 안에서 실행됩니다. 동적 링크 요구하지 않으며 아예 허용하지 않을 수도 있습니다. 메모리 저장을 위해 더 작은 스택 프레임을 가집니다. 위에 적힌 차이점 중에서 가장 크게 ..