Arduino 스케치에서 비동기 함수 호출


14

Arduino 스케치에서 루프 내에서 비동기 함수 호출을 수행하는 방법이 있습니까? http 서버를 통해 요청을 듣고 비 차단 방식으로 처리하는 것과 같습니다 .


1
C ++ 초보자가 아닌 경우 Cosa 라이브러리 ( github.com/mikaelpatel/Cosa )를 살펴볼 수 있습니다 . Arduino 라이브러리를 완전히 다시 작성하여 OOP 및 일반적으로 인터럽트 기반으로 개선했습니다. HTTP를 지원한다고 생각하지만 아직 그 부분을 확인하지 않았습니다.
jfpoilpret 5

답변:


11

예, 아니오 당신이하고 싶은 일에 대해 다소 모호합니다. 나는 이것을 몇 가지 다른 섹션으로 만들었습니다 (주로 센서 데이터 읽기에 중점을 둡니다 ... 모든 것에 적용되지만 내가 사용하는 컨텍스트입니다).

AFAIK 모든 Arduino는 하나의 코어 만 있습니다 (한 번에 하나의 작업 만 수행 할 수 있음). 대부분의 Arduino 보드의 경우 하드웨어 멀티 스레딩이 지원되지 않습니다. 그러나 소프트웨어 멀티 스레딩을 구현하는 방법이 있습니다 . AsheeshR의 접근 방식은 완료하는 데 오랜 시간이 걸리는 기능 (예 : 라이브러리에서 무언가가 지연되거나 지연되는 기능)에 대해서는 잘 작동하지 않지만 짧게 잘 작동합니다. 같은 기능 pinMode(). 거기에 나열된 Protothreads 라이브러리가 더 좋을지 모르지만 실제로는 모르겠습니다.

HTTP로 이것을 조정하기가 어렵습니다. 특히 만들어야하기 때문에

지연

스케치가 멈추는 일반적인 방법은 지연을 사용하는 것입니다. 메인 루프에서 if 문과 millis()시간 (시계 시간이 아니라 Arduino가 시작된 이후의 시간)을 반환하는 함수를 사용하여 해결할 수 있습니다 . 루프 내에서 루프를 수행하여 센서 데이터를 폴링 할 수도 있습니다.

millis()접근 방식은 전체 프로그램을 정지시키는 것 (즉 , 눈에 띄는 시간 동안 지속되는 더 많은 지연 또는 루프)에는 적합하지 않습니다. 100ms IIRC는 UI가 게으른 것처럼 보이지 않는 일반적인 최대 시간입니다.

인터럽트

인터럽트는 사물을 거의 비동기 적으로 유지할 수있는 좋은 방법입니다. 핀 상태가 변경 될 때마다 짧은 코드 (지정한)를 실행합니다. 그것은에서 중단 loop()하고 "일단이 off 상태로 돌아갑니다 ISR은 "으로 실행하고있다. 이 작업을 수행하는 방법을 설명 할 시간이 없지만 빠른 Google 검색으로 많은 결과를 얻을 수 있습니다.


예를 들어 스레딩 섹션이 가장 적합합니다. 이 주제는 매우 모호하므로 몇 가지 사항을 실험하고 작동하는 것을 찾아야합니다.


3

방금 전 놀이터에서 작업 스케줄러 에 대한 코드를 게시 했습니다. 조심히 살펴보고 싶을 수도 있습니다.

Arduino의 프로세서는 본질적으로 단일 스레드이며 멀티 태스킹 할 수 없습니다. 언급했듯이 멀티 태스킹의 환상을 만드는 방법이 있습니다. Annonomus Penguin은 꽤 잘 맞았습니다.

또한 TimerOne을 확인하십시오 (아마 더 낫습니다.)


TimerOne은 avr 기반 arduino에서만 작동하기 때문에 나쁜 생각입니다. 예를 들어 내 Wemos D1 R1이 작동하지 않습니다
Vyachaslav Gerchicov에게
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.