altair의 프로젝트 일기
Pi Pico에서 내가 만든 tar파일 압축 해제하기 본문
개요
얼마 전에 러스트로 tar를 직접 구현해보았다. 비록 표준과는 많이 다르지만 개인적으로 간단하게 사용하기에는 충분했다. 소스코드도, 실행파일도 내가 직접 빌드하고 실행할 수 있으니 어느 날 컴퓨터 아키텍쳐가 모조리 바뀌고 cargo가 이를 지원하지 않는 상황이 오지 않는 이상, 개인적인 파일을 압축하고 보관하기엔 충분하지 싶다.
라즈베리파이 피코에서도 이를 사용할 수 있는지 궁금했다. 물론 러스트로 피코용 실행 파일을 만드는 방법도 존재한다. 하지만 이 방법은 나중으로 미루고 일단 C를 사용해 가능성만 확인해보고자 했다.
필요한 것
- 라즈베리파이 피코 - Picoprobe를 사용하고자 한다면 두 개의 피코가 필요하다.
- 아두이노 SD카드 모듈 - SZH-EKBZ-005를 사용했다.
- 마이크로 SD 카드 - Fat32 또는 exFat 등 Fat계열로 포맷해야 한다.
파일 읽고 쓰기
일반적인 프로그래밍 환경에서 파일을 읽고 쓴다는 것은 대략 다음과 같은 순서를 갖는다.
- 사용자 모드에서 프로그램이 파일을 읽으려(쓰려) 한다.
- 프로그램은 fopen, fwrite과 같은 함수를 호출한다.
- 이 함수들은 시스템 콜을 호출한다.
- 시스템 콜의 호출은 운영체제로의 트랩을 일으킨다.
- 하드웨어는 사용자 모드에서 커널 모드로 변경하고 운영체제에게 트랩을 전달한다.
- 운영체제는 트랩을 처리하고, 커널모드에서 시스템 콜을 실행한다.
- 트랩이 처리되었다면 하드웨어는 사용자 모드로 다시 변경하고 트랩 이후의 명령어로 이동한다.
간단하게 말하자면, 프로그램과 하드웨어 사이에 운영체제가 관여하는 것으로 볼 수 있다. 운영체제는 프로그램에게 일종의 API를 제공하고 프로그램은 이를 통해서만 하드웨어를 제어할 수 있다는 뜻이다. 현대적인 컴퓨터에서 운영체제 없이는 파일에 접근할 수 없다.
하지만 라즈베리파이 피코는 다른 컴퓨터들과 달리 운영체제가 없는 마이크로 컨트롤러다. 그 말은 C에서 쓰던 fopen과 같이 운영체제의 시스템 콜을 호출하는 함수를 사용할 수 없다는 뜻이다.
그러나 방법이 없는 것은 아닌데, FatFs와 같은 라이브러리를 사용하면 임베디드 시스템에서도 파일시스템을 사용할 수 있다. 이를 피코에서도 쓸 수 있도록 만든 no-OS-FatFS-SD-SPI-RPi-Pico를 사용했다.
위와 같은 방법으로 일정한 크기의 버퍼만큼 파일을 읽어올 수 있었다. 피코는 264KB의 램을 갖고 있기 때문에 파일 하나를 온전히 램에 올릴 수 없다. 더 작은 버퍼를 사용해 파일을 청크 단위로 읽고 썼다.
또한 라이브러리의 디렉토리 생성 함수가 재귀적으로 디렉토리를 생성하지 못했으므로, 경로명에서 슬래쉬를 딘위로 계속 디렉토리를 생성해야 했다. 뿐만아니라 아스키문자가 아닌 한글과 같은 유니코드 문자가 경로명에 포함되어 있다면 정상적으로 생성되지 않는 문제가 있었다.
이를 통해 LUSL로 생성한 무압축, 비암호화 파일을 정상적으로 역직렬화 할 수 있었다.
마치며
작지만 오랜만에 만지는 C 프로젝트라 좀 어색하고 불편한 구석이 많았다. 하지만 파이썬이나 자바 같은 고수준 언어만 쓰다가 메모리 할당까지 직접하는 손맛을 느끼는 건 좀 짜릿했다. C Programming FAQs: Frequently Asked Questions에서 읽었던 C언어 관련 지식과 테크닉들을 사용해볼 수 있는 점도 기분 좋았다. 다음엔 러스트로 라즈베리파이 피코에서 돌아가는 LUSL 프로젝트를 해볼 생각이다.
GitHub - altair823/pico_lusl
Contribute to altair823/pico_lusl development by creating an account on GitHub.
github.com
'IT > 임베디드' 카테고리의 다른 글
아두이노로 온습도계 만들기 (0) | 2023.07.07 |
---|---|
3x4 키패드 입력을 아날로그 핀 하나로 받기 (0) | 2022.08.08 |
라즈베리파이 피코에 128x64 Graphical LCD SPI로 연결하기 (0) | 2022.07.27 |
라즈베리파이 피코로 온습도계 만들기 (0) | 2022.06.27 |