'Arduino Due'에 해당되는 글 2건

  1. 2018.01.12 Arduino vs. mbed 1
  2. 2017.05.08 인터럽트의 처리(2)


영국의 ARM사가 주도하는 mbed는 ARM-cortex기반의 MCU를 사용하여 IoT제품이나 여러 전자제품의 프로토타이핑(prototyping)을 쉽게 제작하고 Cloud 서비스 테스트까지 할수 있는 플랫폼으로, Arduino와 같은 해에 시작하고 2009년에 베타서비스를 시작했지만 2013년에야 mbed를 오픈하기로 결정하고 주변 디바이스, API, 기판 설계 데이터, 펌웨어 등을 공개하면서 주목받기 시작하였습니다.



사실 기존에는 Arduino라는 가볍고 쉬운 AVR이 존재했지만 ARM 계열에서는 Arduino Due 제외하고는 가볍고 쉬운 AVR은 없었고 대부분 전문 컴파일러를 사용하여 제작하였기 때문에 전문가가 아니면 사용하기가 어려웠었습니다. 그렇기 때문에 ARM에서도 Arduino와 같이 접근성이 좋고 빠르게 개발이 가능하도록 만든 소프트웨어가 바로 "mbed"라는 것입니다. 아직까지 국내에서는 Arduino보다 인지도가 적은 편이지만 Ardunio보다 더 좋은 성능으로 IoT개발 보드 시장 영역을 넓혀가고 있다는 것입니다.


참고로 ARM사의 cortex-M4를 MCU의 경우에는 IoT에서 가장 중요한 화두인 전력문제에 있어서 저전력기술을 활용함으로써, 100~180MHz로 동작하는 동안 매우 낮은 동적 전력 사용량을 제공하며, 경쟁사 유사제품에 비해 7배 낮은 정적 소비 전력을 보여줍니다. 


웹브라우저를 통한 온라인 컴파일 및 소스 버전 관리 기능(Web-IDE)을 제공하여 어떤 OS에서든 웹브라우저에서 온라인으로 컴파일이 가능하고, 프로그램 업로드는 별도 장비없이 USB에 연결만 하면 가능하도록 되어 있다는 것입니다. 게다가 커뮤니티를 통한 라이브러리 공개 및 방대한 개인 위키 페이지 제공으로 협업에 유익하고 무엇보다, 모든 사용자가 기본적으로 같은 하드웨어를 이용하고 있기에 확장 보드가 아닌 이상 바로 적용 가능하다는 것입니다.



mbed의 장점으로는 기본적으로 MCU의 성능이 Arduino보다 좋기 때문에 고성능으로 더 높은 사양대를 커버할 수 있지만, Ardunio에 비해 상대적으로 사용자가 적다는 단점이 있습니다. 온라인 컴파일러에서 브레이크 포인터를 사용하여 스텝별 실행 및 내부 레지스터, 변수 등의 디버깅은 불가능하고 프로그램 업로드 방식에 있어서도 파일을 추출하고 이 파일을 다시 보드에 업로드 시켜야하는 상대적으로 Arduino에 비해 귀찮은 과정도 단점으로 여겨질 수 있습니다.


Arduino와 mbed 차이점으로, 모든 Arduino는 Atmel MCU 사용하여 작은 메모리와 제한된 기능을 가지고 있으며 느리다는 것입니다. 대부분의 Arduino 보드들은 ATmega328이고, Mega보드는 ATmega2560이며, 새로운 Due보드는 ARM Cortex-M3를 사용한다. 반면에 mbed 플랫폼은 더 빠르고, 메모리도 크고, 더 많은 기능을 가진 ARM Cortex MCU를 사용합니다. 사실 공식적인 mbed 플랫폼들은 Cortex-M0, M3와 M4를 기반으로 만들어진다는 것입니다.


프로토타입을 만드는데는 둘 다 우수하지만 프로토타입을 만든 후에 생산을 하고자 할 때는 mbed가 더 scalable한 플랫폼이기 때문에 더 낮고, 아주 간단한 응용제품을 제외하고는 ARM MCU들이 같거나 더 싼 가격에 더 낮은 전력 소모를 하며, 더 많은 기능을 가지고 있기 때문에 그 입지가 점점 좁아지고 있다는 것입니다.



Posted by Nature & Life
Embedded Lecture/Arduino2017. 5. 8. 20:34


인터럽트(interrupt)란 지정된 핀의 신호가 원하는 조건과 일치하면 미리 등록한 인터럽트 callback 함수(ISR; Interrupt Service Routines)를 자동으로 호출해주는 기능입니다. 이 ISR 함수는 사용자가 만든 함수이며, 이때 실행 중이던 loop() 함수 내부의 루틴은 인터럽트 callback 함수가 끝날 때까지 멈추게 됩니다.


즉, 특정 핀의 입력 상태가 바뀔 때 Arduino는 이를 자동으로 감지해서 모든 동작을 잠시 멈춘 다음, ISR(Interrupt Service Routines) 이라 불리는 미리 지정된 함수를 실행하고, 다시 원래 작업으로 복귀한다는 것입니다. 이를 '하드웨어 인터럽트'라 부릅니다. 이 외에도 비슷한 타이머(timer) 인터럽트가 있는데 이는 사용법이 전혀 다르므로 이 글에서 다루진 않습니다.

♧ 타이머 인터럽트 - AVR 칩을 비롯한 임베디드 시스템에서는 시간을 재기 위해서 타이머(Timer)/카운터(Counter)를 내장합니다. 만일 타이머/카운터가 없다면, 소프트웨어적으로 시간지연 함수를 사용해야 함으로써 MCU는 동작을 멈추게 되고, 이로 인해 MCU의 효율을 떨어뜨리게 된다는 것입니다.

뿐만 아니라 이와 같은 내장 타이머/카운터는 정확한 시간을 잴 수 있으며, MCU가 다른 작업과 병행할 수 있고, 미리 설정한 조건에서 타이머 인터럽트도 발생하게 할 수 있다는 것입니다. 이러한 각각 인터럽트들은 동시에 발생할 수도 있으므로 우선 순위를 갖습니다.


Arduino의 인터럽트 핀

Arduino Uno 기준으로 2개의 인터럽트 핀이 할당되어 있습니다. 즉, Number 0 (D2), Number 1 (D3). 몇개의 보드별 지원되는 인터럽트 핀은 다음과 같습니다. 인터럽트 callback(ISR)을 등록할 때 유의할 점은 핀 번호가 아니라 반드시 인터럽트 넘버를 사용한다는 것입니다. 예를 들어, 다음 표에서 Leonardo 보드는 Uno 보다 많은 5개의 인터럽트 핀을 제공합니다. 그리고 다섯번째 인터럽트 핀(int4)은 Number 7이라는 것입니다. 참고로 Arduino Due 보드는 모든 핀에 인터럽트가 지원됩니다.


 보드

 int0

 int1

 int2

 int3

 int4

 int5

 Uno/Ethernet

 2

 3

 x

 x

 x

 x

 Mega2560

 2

 3

 21

 20

 19

 18

 Leonardo

 3

 2

 0

 1

 7

 x


인터럽트 callback 함수(ISR)는 입력 인자가 없고 반환값이 없습니다. 즉 파라미터를 전달하거나 리턴할 수가 없다는 것입니다. 게다가 ISR 함수 내에서는 delay() 함수를 사용할 수 없습니다. 또한 milli second의 시각을 가져오는 함수인 millis()를 사용하더라도 값이 증가하지는 않습니다. delayMicroseconds()의 경우에는 인터럽트에 독립적이므로 정상 동작합니다.


뿐만 아니라 ISR 함수 내에서는 Serial data를 읽을 경우 값이 소실되며, 이전 글에서 언급했던 것처럼 ISR 함수 내에서 업데이트 되는 전역 변수는 volatile로 반드시 선언되어야 합니다. ISR 함수를 만드는 요령은 최대한 짧고 빠르게 수행되도록 간결하게 작성해야 합니다. 왜냐면 이 코드가 길어지는 만큼 CPU는 멈추어 메인 작업을 수행하지 않아 효율적이지 않다는 것입니다.


또한 여러 개의 ISR 함수가 등록되어 있더라도 동시에 수행되지는 않습니다. 블루투스 모듈과의 통신을 위해 주로 사용되는 Software Serial 라이브러리의 경우, 내부적으로 인터럽트를 사용하는 것으로 알려져 있습니다. 따라서 Uno 보드의 경우 D2, D3 에 연결해야만 정상 동작 가능합니다. 따라서 이를 회피하기 위해서 D0, D1 핀에 연결해서 Hardware Serial로 동작시킬 수 있습니다.



Posted by Nature & Life