>  기사  >  시스템 튜토리얼  >  Linux가 8비트 MCU에서 실행될 수 있습니까?

Linux가 8비트 MCU에서 실행될 수 있습니까?

WBOY
WBOY앞으로
2024-02-05 18:18:02738검색

초심자가 마이크로컨트롤러 포럼에서 자신의 보잘것없는 8비트 마이크로컨트롤러가 Linux를 실행할 수 있는지 묻는 경우가 종종 있습니다. 이러한 질문은 종종 폭소를 불러일으킵니다. 우리는 Linux 포럼에서 Linux를 실행하기 위한 최소 요구 사항이 무엇인지 묻는 사람들을 자주 봅니다. 일반적인 대답은 Linux가 커널을 충족하려면 32비트 아키텍처와 MMU(Memory Management Unit), 그리고 최소 1MB의 RAM이 필요하다는 것입니다.

그러나 이 프로젝트는 이러한 인식을 깨는 것을 목표로 하고 있으며 성공했습니다. 아래 그림에 표시된 개발 보드는 ATmega1284P를 기반으로 합니다. 나(외국인)도 ATmega644a를 기반으로 개발보드를 만들었는데 역시 성공했다. 이 개발 보드는 다른 프로세서를 사용하지 않으며 Linux 2.6.34 커널을 부팅할 수 있습니다. 실제로 X(부팅할 때까지 기다릴 의향이 있는 경우) 및 gnome 데스크탑 환경을 포함하여 전체 Ubuntu 스택을 실행할 수도 있습니다.

Linux是否能在 8 位 MCU 上运行?

▍RAM(랜덤 액세스 메모리)

예, 그렇습니다. 전체 Linux를 설치하려면 메가바이트 RAM과 MMU가 포함된 32비트 CPU가 필요합니다. 이 프로젝트에는 모든 것이 있습니다. 먼저 RAM에 액세스하겠습니다. 보시다시피 회로에는 골동품 30핀 SIMM 메모리 모듈이 있습니다. 80286 기반 PC가 한때 사용했던 것들이다. ATmega와 인터페이스하고 사양에 따라 액세스하고 새로 고치는 코드를 작성합니다(SDRAM은 데이터 손실을 방지하기 위해 일정한 속도의 새로 고침이 필요합니다).

얼마나 빠른가요? 새로 고침 인터럽트는 62ms마다 발생하며 1.5ms를 차지하므로 CPU의 3% 미만을 차지합니다. 프로그래밍의 용이성을 위해 한 번에 1바이트씩 RAM에 액세스합니다. 이것이 생성하는 최대 대역폭은 약 300KBps입니다.

Linux是否能在 8 位 MCU 上运行?

***▍*저장소

RAM이 절전 상태에서 작동하려면 두 가지 작업을 처리해야 합니다. 스토리지는 해결하기 너무 어려운 문제가 아닙니다. SPI를 사용하여 SD 카드와 상호 작용하는 것은 매우 쉽고 내 프로젝트에서 이 작업을 수행했습니다. 1GB SD 카드는 잘 작동하지만 이 특정 파일 시스템(Ubuntu Jaunty)에는 512MB면 충분합니다.

ATmega에는 하드웨어 SPI 모듈이 있지만 어떤 이유로든 원활하게 작동하지 않아서 인터페이스를 비트 스트립했습니다. 여전히 충분히 크며 약 200KBps입니다. 이는 또한 프로젝트에 완벽하게 적합합니다. 추가 하드웨어 모듈을 사용하지 않고도 충분한 핀이 있는 모든 마이크로컨트롤러에서 구현할 수 있습니다.

***▍*CPU(중앙 처리 장치)

남은 것은 32비트 CPU 및 MMU 요구 사항뿐입니다. 그러나 AVR에는 MMU가 없으며 8비트입니다. 이 어려움을 극복하기 위해 ARM 에뮬레이터를 작성했습니다. ARM은 나에게 가장 친숙한 아키텍처이며, ARM에 대한 에뮬레이터를 작성하는 것이 편안할 만큼 간단합니다. 포팅하는 대신 왜 작성합니까?

글쎄, 다른 사람의 코드를 포팅하는 것은 재미가 없으며 에뮬레이터를 8비트 장치로 쉽게 포팅하는 문서화된 문서도 없습니다. 한 가지 이유는 AVR 컴파일러가 정수 처리에 16비트를 고집하기 때문에 간단한 "(1 Linux是否能在 8 位 MCU 上运行?

***▍*기타 기능

보드는 직렬 포트를 통해 현실 세계와 통신합니다. 현재는 직렬 포트를 통해 내 PC에서 실행되는 미니콤에 연결되어 있지만 테스트할 수 있는 대체 연결은 완전히 독립형으로 만드는 회로에 연결된 키보드와 문자 LCD입니다. 보드에는 LED가 2개 더 있습니다. 이는 SD 카드에 대한 액세스를 나타냅니다. 하나는 읽기 작업을 나타내고 다른 하나는 쓰기 작업을 나타냅니다. 회로 기판에도 버튼이 있습니다. 1초 동안 길게 누르면 직렬 포트가 에뮬레이트된 CPU의 현재 유효 속도에서 벗어나게 됩니다. AVR의 기본 주파수는 24MHz입니다(원래 20MHz보다 약간 오버클럭됨).

***▍*얼마나 빠른가요?

uARM에는 확실히 rate 데몬이 없습니다. BASH 프롬프트("init=/bin/bash" 커널 명령줄)로 부팅하는 데 약 2시간이 걸렸습니다. 그런 다음 전체 Ubuntu를 시작하는 데 4시간 이상이 걸렸습니다("exec init" 후 로그인). X를 시작하면 시간이 더 오래 걸립니다. 효과적인 에뮬레이트된 CPU 속도는 약 6.5KHz입니다. 이는 8비트 마이크로컨트롤러에서 32비트 CPU 및 MMU를 에뮬레이션할 것으로 예상되는 속도입니다. 이상하게도 일단 부팅되면 시스템을 어느 정도 사용할 수 있습니다. 명령어를 입력하면 1분 안에 응답을 받을 수 있습니다. 즉, 실제로 사용할 수 있다는 뜻입니다. 예를 들어 오늘 SD 카드를 포맷하는 데 사용했습니다. 확실히 가장 빠르지는 않지만 아마도 가장 저렴하고, 느리고, 손으로 조립하기 쉽고, 부품 수가 가장 적고, 최하급 Linux PC인 것 같습니다. 회로 기판은 인쇄 회로 기판(PCB)이 필요 없이 와이어를 사용하여 손으로 납땜됩니다.

***▍*에뮬레이터의 세부정보는 무엇인가요?

에뮬은 모듈식이므로 원하는 대로 다른 SoC(시스템 온 칩) 및 하드웨어 구성을 에뮬레이션하도록 확장할 수 있습니다. 시뮬레이션된 CPU는 ARMv5TE입니다. 얼마 전부터 ARMv6 지원 작업을 시작했는데 별로 필요하지 않아서 (코드에서 볼 수 있듯이) 완성되지 않았습니다. 시뮬레이션된 SoC는 PXA255입니다.

모듈식 설계로 인해 SoC.c 파일을 교체하고 동일한 ARMv5TE 코어를 사용하여 완전히 새로운 SoC를 컴파일하거나 코어를 교체하거나 원하는 대로 주변 장치를 교체할 수 있습니다. 이는 의도적인 것입니다. 이 코드는 ARM SoC의 작동 방식을 보여주는 매우 깔끔한 예이기도 합니다. CPU 에뮬레이터 자체의 코드는 그다지 깔끔하지 않아서 뭐, CPU 에뮬레이터입니다. 이 글은 몇 년 전 6개월이 넘는 자유 시간 동안 쓴 다음 따로 보관해 두었습니다. 최근 이 프로젝트를 위해 특별히 부활했습니다. 에뮬레이터는 속도를 향상시키기 위해 i-cache를 구현합니다. 이는 AVR에 많은 도움을 주며, 외부 RAM과 달리 내부 메모리에 초당 5MB 이상 액세스할 수 있게 해줍니다. 아직 d-cache(데이터 캐싱)를 구현하지는 않았지만 할 일 목록에 있습니다. 블록 장치에 액세스하는 것은 SD 장치로 에뮬레이션되지 않습니다. 이것은 너무 느린 것으로 밝혀졌습니다. 대신에 에뮬레이터를 로드하고 디스크에 액세스하기 위해 잘못된 opcode를 사용하여 작성한 반가상화된 디스크 장치(pvdisk, pvDisk.tar.bz2, GPL 라이센스 참조)가 있습니다. 내 이미지의 ramdisk(가상 디스크)는 이 pvdisk를 로드한 다음 루트 디렉터리를 /dev/pvd1로 변경합니다.

ramdisk는 "rd.img"에 포함되어 있습니다. 내가 사용하는 "머신 유형"은 PalmTE2입니다. 왜? 저는 이 하드웨어에 대해 매우 잘 알고 있기 때문에 제가 본 최초의 PXA255 머신 유형입니다.

***▍*하이퍼콜?

특별한 opcode를 사용하여 에뮬레이터에 요청할 수 있는 몇 가지 서비스가 있습니다. ARM에서는 0xF7BBBBBB이고 Thumb에서는 0xBBBB입니다. 이는 ARM 보장이 정의되지 않은 범위에 있기 때문에 선택되었습니다. 하이퍼콜 번호는 레지스터 R12에 전달되고 매개변수는 레지스터 R0-R3에 전달되며 반환 값은 R0에 배치됩니다.

전화:

· 0 = 시뮬레이션 중지

· 1 = 소수 인쇄

· 2 = 문자 인쇄

· 3 = RAM 크기 가져오기

· 4 = 블록 장치 작동(R0 = 작동, R1 = 섹터 번호). 이들은 에뮬레이트된 RAM에 쓰지 않고 다른 하이퍼콜을 사용하여 에뮬레이트된 사용자가 액세스하는 에뮬레이터의 내부 버퍼를 한 번에 한 단어씩 채웁니다. DMA를 구현하려고 했는데 아직 구현하지 못했습니다.

작업:

· 0 = 정보 가져오기(섹터 번호가 0이면 섹터 수를 반환하고, 섹터 번호가 1이면 섹터 크기를 바이트 단위로 반환)
· 1 = 섹터 읽기
· 2 = 섹터 쓰기

· 5 = 블록 장치 버퍼 액세스(R0 = 값 입력/값 출력, R1 = 단어 수, R2 = 쓰여지면 1, 그렇지 않으면 0)

***▍*엄지 지원?

Thumb을 완벽하게 지원합니다. ARM 에뮬레이터 기능을 사용하는 대신 약간의 속임수를 써서 각 Thumb 명령어 문자열(instr)을 해당 ARM 명령어 문자열로 디코딩하고 실행했습니다. 원본만큼 빠르지는 않지만 간단하고 코드도 작습니다. 256KB 조회 테이블을 사용하는 것은 가능하지만 256KB는 마이크로 컨트롤러의 플래시 메모리에 비해 너무 크다고 생각됩니다. 일부 Thumb 명령어는 ARM 명령어로 변환될 수 없으며 대신 올바르게 처리됩니다.

저도 하나 만들어보고 싶어요!

비영리적인 목적으로는 분명히 할 수 있습니다. 배선 방법은 다음과 같습니다.

· RAM의 DQ0-DQ7은 AVR의 C0-C7에 연결됩니다.

· RAM의 A0-A7을 AVR의 A0-A7에 연결합니다.

· RAM의 A8-A11을 AVR의 B0-B3에 연결합니다.

· RAM nRAM nRAS nCAS nWE 연결 AVR D7 B4 B5;

· SD의 DI SCK DO는 AVR의 B6 B7 D6을 연결합니다.

· LED의 읽기 쓰기는 AVR의 D2 D3에 연결됩니다(LED의 다른 핀은 접지에 연결됨).

· 버튼은 AVR의 D4에 연결됩니다(다른 핀은 접지에 연결됩니다).

RAM은 64밀리초마다 4000사이클의 CAS-before-RAS 새로 고침 빈도로 실행될 수 있는 모든 30핀 16MB SIMM이 될 수 있습니다. 내가 사용하는 것(OWC)은 온라인에서 몇 달러에 구입할 수 있습니다. 회로도는 여기에 표시됩니다. 확대하려면 클릭하세요.

**

*▍*

소스 코드? Linux是否能在 8 位 MCU 上运行?

이 코드는 조금 지저분하지만 작동합니다(중국에서는 코드를 다운로드할 수 없습니다). PC에 에뮬레이터를 설정하고 사용해 보려면 "make"를 입력하세요. 실행하려면 "./uARM DISK_IMAGE"를 사용하세요. 최적화된 PC 버전을 빌드하려면 "make BUILD=opt"를 사용하세요. 실행 중인 AVR 버전을 빌드하려면 "make BUILD=avr"을 사용하세요. 이제 ATmega1284P를 대상으로 컴파일되었습니다. ATmega644를 대상으로 컴파일하려면 makefile을 수정하는 것 외에도 i-cache가 644 내부의 RAM과 일치할 만큼 작도록 icache.h의 수를 줄이세요. 또한 아카이브에는 1284p용 최종 16진수 파일도 포함되어 있습니다. ▍시작 프로세스

AVR의 코드 공간을 보존하기 위해 에뮬레이터에는 시작 코드가 거의 존재하지 않습니다. 실제로 "ROM"은 총 50바이트입니다. 8바이트는 Thumb 모드를 선택하는 데 사용되며 일부 Thumb 코드는 SD 카드의 첫 번째 섹터를 읽고 Thumb 모드로 점프합니다(embeddedBoot.c 참조). SD 카드의 MBR에는 또 다른 부트로더(Thumb 모드로 작성됨)가 있습니다. 이 부트로더는 MBR을 살펴보고 활성 파티션을 찾아 해당 내용을 RAM 끝에 로드합니다. 그런 다음 대상 RAM 주소 +512로 점프합니다(mbrBoot.c 참조). 세 번째이자 가장 큰 부트로더인 ELLE(ELLE.c 참조)가 여기에서 실행됩니다. 이 부트로더는 램디스크를 재배치하고, ATAGS를 설정하고, 커널을 호출합니다. 원하는 경우 자신만의 이미지를 만들 수 있도록 모든 바이너리와 소스 코드를 제공합니다. 부팅 프로세스는 PC 부팅을 연상시킵니다. :) 포함된 mkbooting.sh 도구를 사용하여 부팅 파티션에 대한 작업 이미지를 생성할 수 있습니다.

위 내용은 Linux가 8비트 MCU에서 실행될 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 lxlinux.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제