3.1. 마이크로컨트롤러¶
OpenMV Cam은 마이크로컨트롤러(MCU) 위에서 동작합니다. MCU는 CPU, 작업 메모리(RAM), 프로그램 저장소(플래시), 그리고 일련의 주변장치 – 바깥 세계와 상호작용하는 하드웨어 블록 – 를 하나의 칩에 결합한 단일 칩입니다.
주변장치가 바로 흥미로운 부분입니다. 각 주변장치는 한 가지 일에 전용으로 쓰이는 실리콘 조각으로, 핀을 하이 또는 로우로 구동하거나, 아날로그 전압을 측정하거나, 시리얼 버스로 바이트를 클럭에 맞춰 내보내는 일을 합니다. CPU는 각 주변장치를 레지스터 – 하드웨어가 감시하고 갱신하는 고정된 메모리 주소 – 를 통해 설정하고 읽습니다.
MicroPython은 이러한 레지스터를 machine 모듈 내부의 클래스로 감쌉니다. machine.Pin(...)은 범용 입출력(GPIO) 핀을 제어하는 객체를 반환합니다 – 이 핀은 칩이 high(약 3.3 V) 또는 low(약 0 V)로 유지할 수 있는 전선이며, 외부에서 무언가가 구동할 때 이 두 상태 중 하나로 읽을 수도 있습니다. machine.ADC(...)는 핀의 전압을 측정하여 숫자로 보고하는 아날로그-디지털 변환기를 노출합니다. machine.UART(...)는 범용 비동기 송수신기(UART)를 실행합니다 – 이는 TX(송신)와 RX(수신)라는 한 쌍의 전선을 통해 한 번에 한 비트씩 바이트를 보내고 받는 주변장치입니다. 다른 클래스들은 나머지 주변장치를 다룹니다. 스크립트는 Python 객체를 읽고 쓰며, MicroPython은 각 접근을 해당하는 레지스터 읽기 및 쓰기로 변환하고, 이것이 물리적 전선에서 비트를 이동시킵니다.
MCU는 CPU, 메모리, 주변장치를 단일 칩에 담습니다. 각 주변장치는 machine 모듈의 클래스를 통해 Python에 노출됩니다.¶
3.1.1. 메인 루프¶
거의 모든 마이크로컨트롤러 프로그램은 같은 형태를 공유합니다. 스크립트 맨 위에서 한 번만 수행하는 설정(모듈 임포트, 핀 설정, 버스 열기)을 한 다음, 맨 아래에 무한 while True: 루프를 둡니다. 루프 안에서 프로그램은 입력을 읽고, 결정을 내리고, 출력을 갱신하기를 반복합니다. 그 루프가 곧 프로그램입니다. 스크립트가 종료되면 장치는 아무 일도 하지 않게 됩니다.
# setup, runs once
from machine import Pin
led = Pin("P0", Pin.OUT)
# main loop, runs forever
while True:
led.value(1)
# ... do work ...
led.value(0)
# ... do other work ...
이 형태 – 한 번 설정한 뒤 영원히 반복 – 가 메인 루프 패턴입니다. 이후의 모든 내용은 그 안에 무엇이 들어가는지에 관한 것입니다.
3.1.2. 실시간 제어¶
데스크톱 프로그램은 다른 많은 프로그램과 나란히 실행됩니다. 운영체제는 그 작업을 하나 이상의 스레드 – 운영체제가 밀리초 단위로 전환하는 독립적인 실행 흐름 – 에 걸쳐 스케줄링합니다. 한 스레드가 I/O(디스크, 네트워크, 사용자가 마우스를 움직이는 것)를 기다리면, 운영체제는 CPU를 다른 스레드에 넘깁니다. 프로그램은 대부분 이벤트 기반입니다. 입력이 들어오면 윈도우 매니저가 여러분의 코드를 호출하고, 소켓에 바이트가 도착하면 HTTP 라이브러리가 여러분의 코드를 재개합니다. 더 큰 무언가가 여러분을 호출하는 것입니다.
마이크로컨트롤러 프로그램은 그 반대입니다. 기본적으로 운영체제도, 스케줄러도, 다른 스레드도 없습니다. 방금 보여준 메인 루프가 유일한 루프입니다. 주변장치는 인터럽트를 발생시키거나 상태 플래그를 노출하며, 루프는 그것을 폴링하거나 인터럽트를 직접 처리합니다. 루프가 time.sleep_ms(1000) 에서 멈춰 있으면 그 1초 동안 장치는 아무 일도 하지 않습니다. 그 빈틈을 메울 다른 스레드가 없기 때문입니다.
두 가지 결과가 도출되며 어디에나 적용됩니다:
시간은 실재합니다. 빡빡한 루프에서 핀을 두 번 읽는 데는 마이크로초가 걸리고, 10밀리초 동안 잠자는 것은 그 10밀리초 동안 아무 일도 일어나지 않음을 뜻합니다. 그에 대한 대응이 논블로킹 타이밍 패턴입니다.
하드웨어는 실재합니다.
machine.Pin.value를1로 설정하면 물리적 전선에 대략 3.3 V를 걸고,0으로 설정하면 거기에 대략 0 V를 겁니다. 회로의 다른 부분은 그 전압을 즉시 감지합니다. 여기에는 핀이 잘못 구동될 경우 손상될 수 있는 모든 구성 요소가 포함됩니다.