일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
- USART
- raspberrypi
- vscode
- Arduino
- buildroot
- C++
- platformio
- QEMU
- BeagleBone
- Visual Studio
- Raspberry
- Debugging
- AVR
- Linux
- 라즈베리파이
- 리눅스
- bare metal
- yocto
- nucleo
- atmel
- Debug
- 아두이노
- 디버깅
- avr-gcc
- UART
- GPIO
- STM32
- esp32
- AArch64
- Visual Studio Code
- Today
- Total
임베디드를 좋아하는 조금 특이한 개발자?
[RTOS 개발] 새로운 개발보드(Realview-PB-A8) 추가 본문
- 프로젝트 Github
https://github.com/MainForm/BaremetalOS/tree/097317dfd24a2ad16db9dafcc02147118395bdf7
GitHub - MainForm/BaremetalOS
Contribute to MainForm/BaremetalOS development by creating an account on GitHub.
github.com
1. 지금까지 진행상황
이번 개발에서는 본격적인 OS 커널 개발을 시작하기 전에 기본적인 peripheral 및 새로운 개발보드(Realview-PB-A8)에 대한 지원을 추가하였습니다. 특히 저번 개발 과정에서 리펙토링을 완료하여서 인지 더욱 개발이 생각보다 편하였습니다. 그리고 가장 중요한 것이 굳이 하드웨어를 사용하지 않아도 개발한 OS를 QEMU 에뮬레이터에서 실행하여 개발시간을 단축하였습니다. 물론 에뮬레이터 환경과 실제 하드웨어와는 환경이 많이 다르지만 구현하려는 기능들을 테스트하는 데에는 문제는 없으며 기능 개발을 완료한 후 최종적으로 하드웨어에서 실행 할 수 있습니다. 그리고 Qemu 에뮬레이터를 사용함으로써 가능한 것이 GDB를 통한 디버깅이 가능하다는 것입니다. 이 뜻은 일반 어플리케이션을 개발하는 것처럼 특정 코드에 중단점을 추가하여 레지스터 및 변수의 변화를 실시간으로 확인 할 수 있다는 장점이 있습니다. 이제 각 개발 과정을 자세히 서술하도록 하겠습니다.
- 이번 개발에서 추가된 기능
- QEMU를 통해 개발보드 에뮬레이트하여 OS 실행
- QEMU를 통해 GDB으로 디버깅 가능
- General Purpose Timer를 통해 바쁜 대기를 하는 delay함수 대체
1.1. General Purpose Timer(SP804) 지원 추가
다행스럽게 라즈베리파이4 및 Realview-PB-A8가 같은 GPTimer를 지원하기에 개발하는데 수고를 덜었습니다. 하지만 라즈베리파이에서 사용하는 GP804은 라즈베리파이에 맞춰 커스텀되어 있어 약간 추가적인 작업이 필요하였습니다. GPTimer를 구현하는 것 까지는 어렵지는 않았지만 몇가지 문제점이 발생하였습니다.
- 개발하면서 발생한 난관
1.1.1. 목적에 부합하지 않은 General Purpose Timer
먼저 라즈베라피에서는 GPTimer가 OS 커널에서 Jiffes를 세는데 적합하지 않은 타이머라는 것을 확인하였습니다. 그 이유는 타이머 입력 주파수가 시스템 주파수이므로 저전력등 다양한 상황에서 타이머 입력 주파수가 변경될 수 있다는 것을 문서에서 확인했습니다. 그러므로 라즈베리파이는 별도로 System Timer을 사용해야 하므로 다른 타이머를 Peripheral에 추가하는 작업이 필요합니다.
1.1.2. IRQ 번호 착각으로 인한 spurious IRQ(ID 1023) 발생
라즈베라피이에서 System Timer와 General Purpose Timer 두개가 있어서 발생한 실수가 있었습니다. System Timer의 IRQ 번호를 General Purpose TImer의 IRQ 번호로 착각하여 잘못된 IRQ를 GIC에서 활성화하는 실수가 있었습니다. 특히, 해당 실수를 찾기 힘들었던 이유가 아예 IRQ가 발생하지 않으면 쉽게 찾았겠지만 spurious IRQ가 발생해 General Purpose Timer가 동작한다고 착각하였습니다. 그래도, Prescale를 변경하여도 인터럽트 발생주기가 변하지 않아 해당 실수를 찾을 수 있었습니다.
1.2. QEMU 에뮬레이터 지원 추가
QEMU 에뮬레이터는 ARM Cortex-A의 아키텍쳐의 MCU를 에뮬레이팅하는데 유명합니다. 특히 GDB를 연결하기 편해 디버깅하기 좋은 환경을 구성할 수 있습니다. 지원하는데 있어서 문제점이 몇가지가 있었습니다.
- 개발하면서 발생한 난관
1.2.1. 개발 보드에 따라 에뮬레이팅하는데 필요한 파일 확인
최신 QEMU 10버전에서는 라즈베리파이4를 지원하고 있습니다. Realview-PB-A8은 이전부터 계속 지원하고 있었습니다. 그런데 문제점이 각 보드마다 에뮬레이팅하는데 필요한 파일이 다르다는 것이었습니다. 라즈베리파이는 ELF파일로 부터 추출한 Binary파일이 필요한 반면 Realview-PB-A8는 오히려 Binary파일이 아닌 ELF파일이 필요합니다. 파일이 다르다고 따로 요류 메세지가 나오는 것이 아니므로 해당 문제를 확인하는데 까지 꽤 오랜시간이 필요했습니다.
1.2.2. QEMU에서 라즈베리파이4의 SP804 구현 안됨
라즈베리파이에서 잘만 작동하는 SP804 타이머가 QEMU에뮬레이터에서 동작하지 않은 문제가 발생하였습니다. 또한 따로 에러 메세지가 나오는 것이 아니므로 해결하는데 오랜 시간이 걸렸습니다. 특히 SP804는 오히려 Realview-PB-A8에는 문제없이 동작하기에 코드에 오류가 있다고 잘못생각하였습니다. SP804를 지원하지 않음을 확인한 방법은 하드웨어와 같은 레지스터를 에뮬레이터에서 확인하였더니 잘못된 값이 들어 있음을 확인하였습니다.
1.3. Realview-PB-A8 개발 보드 지원 추가
원래 새로운 개발보드를 추가할 예정은 없었습니다. 하더라도 지금이 아니라 나중에 추가할 이유가 생겼을 떄 추가할 예정이었습니다. 하지만 새로운 개발보드를 추가할 이유가 발생하고 말았습니다. QEMU로 에뮬레이팅한 라즈베리파이4가 SP804를 지원하지 않아 혹시 나중에 해당 타이머의 사용이 필요한 경우가 발생 할 수 있다고 생각되어 SP804가 동작하는 새로운 보드를 추가하기로 하였습니다.
- 개발하면서 발생한 난관
1.3.1. 라즈베리파이4 와는 다른 AArch32 아키텍쳐
라즈베리파이4와 realview-PB-A8의 출시일이 꽤나 차이가 나서 두 보드가 사용하는 아키텍쳐가 다릅니다. 아키텍쳐가 다른 만큼 라즈베리파이와 Toolchain이 다르고 특히 사용하는 어셈블리에서 많은 차이가 발생합니다. 그러므로 같은 기능(vector table base 주소 변경, 스택 메모리 설정, FPU 활성화)을 지원하기 위해 사용되는 레지스터가 별개이므로 따로 ARMv7문서를 확인해야 했었습니다. 또한, 아키텍쳐에 따른 다른 구현 방법으로 인해 몇몇 파일(링커 스크립트, 어셈블리 언어로 개발한 start.S 등등)을 구분할 필요가 있었습니다.
1.3.2. 살짝 커스텀되어 있는 GIC(General Interrupt Controller)
Realview-PB-A8에서 지원하는 GIC는 약간 커스텀되어 있습니다. GIC400과 대부분의 레지스터를 공유하지만 몇몇 레지스터의 비트가 달라 그대로 사용하기에는 무리가 있었습니다. 그렇다고 2,3의 레지스터가 다르다고 해당 GIC400의 모든 코드를 복사 하고 붙여넣기에는 중복되는 코드가 많았습니다. 그러므로 공통으로 사용되는 레지스터 코드를 재활용하기 위해 새로운 해더파일을 만들고 각 GIC에서 include하여 차이가 있는 부분에 대해서만 고쳐 사용하는 것으로 해결하였습니다.
2. 개발 진행 예정 내용
먼저 본격적으로 OS를 개발하기 전에 먼저 라즈베리파이4에 대해서 System Timer Peripheral를 추가할 예정입니다. 그리고 드디어 본격적으로 OS 개발을 시작할 예정입니다.
- 라즈베리파이에 System Timer Peripheral 추가
- 타이머를 통해 Jiffes 기능 추가
- 테스크 구현을 위해 TCP(Task Control Block) 구조 설정
- 테스크 스케쥴링(라운드 로빈) 구현
3. 후기
다양한 Peripheral를 추가하면서 느낀점은 AVR이나 STM32(Cortex-M) 처럼 전용 개발 환경을 회사에서 제공해주지 않기에 개발이 힘들 것이라고 착각하였습니다. 하지만, 실제 해본 느낌으로 오히려 AVR이나 STM32보다 쉽다고 생각이 들었습니다. 먼저 펨웨어를 업로드하기 위해 전용 다운로더(ISP, ST_Link)가 필요 없었으며 Peripheral 동작에 필요한 레지스터의 수가 생각보다 적었습니다.
지금까지는 본격적인 개발을 위한 환경 구축이라고 생각이라고합니다. 앞으로 OS개발을 하기 위해 본격적으로 테스크 및 스케쥴링 구현 방법을 확인하고 개발을 진행할 예정입니다.
'Project > RTOS 개발' 카테고리의 다른 글
[RTOS 개발] 리펙토링을 통해 프로젝트의 기본적이 구조 구성 완료 (4) | 2025.07.23 |
---|---|
[RTOS 개발] 개발 시작 후 지금 까지의 상황 (5) | 2025.07.21 |