JavaScript、Pythonなどをはじめに少なくない言語で外部との通信処理などの非同期処理をPromise、callback、asyncといった処理結果を待った後に行う処理を定義する方法があります。この記事ではその実現方法あえてこれらを使わない利点について述べます。
実現方法はざっくばらんに言えば同期処理を回してる間に非同期処理を実行開始、実行結果が存在しているかを定期的にチェックしてその間に他の同期処理を実行し続けるといった具合です。このやり方を記述すると、例えば次の様なコードになります。
#define STATE_PRE_SEND 0 #define STATE_WAIT_RECV 1 static int state = STATE_PRE_SEND; /** * このloop関数が無限ループで実行される組み込みプログラミングを想定 */ void loop(){ // 毎ループ行う共通処理 getSensorsData(); // 非同期処理を単に通信口の状態だけで行う if(state == STATE_PRE_SEND) { // 送信処理を実行. 送信に成功したならば返信待ち状態に移行 if(dataSend()){ state = STATE_WAIT_RECV; } else { SerialUSB.println('SEND ERROR'); } } else if (state == STATE_WAIT_RECV) { // 返信が来ているか確認する // 来てなくても確認処理のまま待たずに次ループを実行 if(port->available()){ if(port->read() == 'OK') { SerialUSB.println('OK'); } else { SerialUSB.println('RECV ERROR'); } state = STATE_PRE_SEND; } } }
非同期処理で処理結果を待たずに次を実行するというのは速度のために行う方法です。ある処理を待たせたまま次々に処理をすることによってプログラムが今どの様な状態か把握するために必要な情報が増えてしまいます。その様なプログラムは同期処理のみで書かれたプログラムよりもバグを含みやすいです。
この似非あるいは原始的な非同期処理が活躍するタイミングは使用可能な言語があまり豪華でないでなく、処理の途切れや遅れを許容しがたいプログラムを作るタイミングです。あるマイコンであるセンサーの値を受け取って、処理して、送信して、というプログラムでこのやり方が必要になりました。