Arduinoスケッチでの非同期関数呼び出し


14

Arduinoスケッチで、ループ内で非同期関数呼び出しを行う方法はありますか?HTTPサーバーを介してリクエストをリッスンし、ブロックない方法でリクエストを処理するのが好きです。


1
C ++初心者でない場合は、Cosaライブラリ(github.com/mikaelpatel/Cosa)をご覧ください。これはArduinoライブラリを完全に書き直したもので、OOPおよび一般的に割り込み駆動型です。HTTPをサポートしていると思いますが、まだその部分をチェックしていません。
jfpoilpret 14年

回答:


11

はいといいえ。あなたは何をしたいのかちょっとあいまいです。これをいくつかの異なるセクションに分けました(主にセンサーデータの読み取りに焦点を当てています...それはすべてに適用されますが、それは私が使用しているコンテキストです)。

スレッド

私の知る限り、すべてのArduinosには1つのコアしかありません(一度に1つのことを実行できます)。ほとんどのArduinoボードでは、ハードウェアマルチスレッドはサポートされていません。ただし、ソフトウェアマルチスレッドを実装する方法があります。AsheeshRによるアプローチは、完了するまでに長い時間がかかる関数(つまり、ライブラリ内の何かに時間がかかる、または遅延)ではうまくいきません。なぜなら、それらの命令によって詰まってしまうからです。のような機能pinMode()。そこにリストされているProtothreadsライブラリはこれで良いかもしれませんが、私は本当に知りません。

特にこれを作成する必要があるため、HTTPでこれを調整するのは難しいでしょう。

遅延

スケッチがストールする一般的な方法は、遅延の使用です。これは、メインループでifステートメントとmillis()時刻(時刻ではなく、Arduinoが起動してからの時刻)を返す関数を使用することで解決できます。ループ内でループを実行して、センサーデータをポーリングすることもできます。

このmillis()アプローチは、プログラム全体が停止する原因になるもの(つまり、かなりの時間続くより多くの遅延またはループ)ではうまく機能しません。100msのIIRCは、UIが遅延していないように見える一般的な最大時間であることに注意してください。

割り込み

割り込みは、物事をほぼ非同期に保つ素晴らしい方法です。ピンの状態が変わるたびに、(指定した)短いコードを実行します。から中断し、loop()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.