質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

2回答

3504閲覧

組み込みプログラムによるデバイス制御(C言語による制御、ITRONなどは使わない)

edizal

総合スコア8

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2015/10/11 08:48

初めて質問します。

組み込みプログラムをしております。
マイコンを使ってC言語で、ゼロから書いています。
ITRONなどのタスキングシステムはありません。

質問としては、例えばあるシステムで
・1つしかないブザーをエラー警報として使う。
・ブザーによる警報は、いくつかのパターンがある。
という状況で、
鳴らさなければならないエラーが1つの場合は、
普通にブザーを鳴らす処理を行えば良いですが、
すでに、エラーが発生していてあるパターンでブザーが
鳴っている状況で、別のエラーが発生したのでブザーを
鳴らしたい。といった状況になった場合どの様な処理で
制御したら良いでしょうか?

仮に、優先度を決める。優先度の高い処理に切り替える。
と言った場合、タスクシステムの無い状況で if 文やSwitch 文に
頼らず、プログラムを書いているサンプルや書籍、参考URLなど
御座いましたら、ご教授の程 お願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

組み込み系の場合、既にご存知かもしれませんが、通常は「割り込み」によって制御します。(ご参考

また割り込みには、優先度があります。割り込み要求を直ちに行うか、後回しにするかは、割り込みの重要度に依存します。

と説明されているように、一般的には、各種の割り込み(イベント)に対して予め優先度を設定しておく事ができるので、プログラム側で制御するまでもなく、より優先度の高い処理へ自動的に切り替わります。

「マイコン 組み込み 割り込み」などのキーワードでググると、色々な情報が得られると思いますのでお試しください。(似たようなキーワードでも組み合わせや順序を変えると、有用な情報にたどり着きやすいです。)

投稿2015/10/11 12:02

pi-chan

総合スコア5936

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

edizal

2015/11/07 13:55

書き込みありがとうございました。 また、お返事が遅く申し訳ありませんでした。 割り込み優先度による処理は、より高い優先度の処理に切り替わる という事ではあるのですが、エラーに関しては、いかなるエラーも 見逃さない様にしたいので、優先度が高い処理に移ってしまって その処理が終わり切っていない状況で 優先度が低い割り込みが入って きて(これもエラー)優先度が高い処理を行なっているので他のエラーが 処理されない。 となっては困る状況です。
guest

0

要求が良く見えないのですが、単にブザーを鳴らすだけなら優先順位を考える必要は無いと思うので、

・エラーの要因が複数あって、その出力はブザーのみ。
・エラー要因別にブザーの鳴動パターンが異なる。
・複数のエラーが同時発生した場合は、より優先順位の高いエラーの鳴動パターンにしたい。

大体こんなところでしょうか?

以下、上記の仮定で話を進めますが、これだけではなかなか的確な解にはたどり着けないと思います。

・要求される応答速度は?
→鳴動中の低優先度の鳴動を途中でぶった切ってよい? 鳴動中の低優先度の鳴動パターンが終了してからでよい?
・エラーのパターンの最大数は?
→パターンの数によって優先度判定のアプローチが変わってくる。少なければ、bitビットフラグで判定も簡単だが、それを超える判定を行おうとするとそれなりの戦略が必要になりそう。
・エラー優先順位に同じものがあるか?
→同じ優先順位のものがあると、先優先か後優先か、判定方法などの話が少々面倒になります。
・マイコンのそれ以外の処理は?
→単純に上記の要求機能だけなら、単純ループで実現できるが、他の処理にメイン構造が制限される場合は、そう簡単にいかない。
・省電力に対する要求は?
→省電力に対する要求がある場合と、無い場合ではアプローチが変わる事があります。

私見ですが、、、

要求が上の仮定の範囲内で上電力に対する要求はそれほど無いのであれば、割り込みとかタスクを持ち出さずに、無限ループでポーリングしながら処理を進める方式のほうがベターと思います。

投稿2015/11/05 19:53

T.Kanno

総合スコア915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

edizal

2015/11/07 14:09

書き込みありがとうございました。 ブザーを鳴らす。という単純な処理ではあるのですが、 T.Kannoさんが書いて下さった様に 考えなければならない事が 沢山あってこの辺の仕様が 明確では無く、プログラムを書き起こすのに至極悩んでいた次第です。 鳴動処理は、0.5秒、1秒といった周期でブザーが鳴ります。 ゆったりとした鳴動です。 その為、T.Kannoさんの書き込みにもありますが、 「鳴動途中で、別のエラー発生の為に別の鳴動パターンに切り替えても良いのか?」 という疑問が湧いてきます。 書き込みをしておりませんでしたが、 ・エラーとしては、5つ ・その為 鳴動パターンも5つ です。 ・エラーの優先順位はあります。しかし、5つエラーがありますので  優先度最大のエラーが解決後、まだエラーがあれば次の優先度のエラーを  処理する必要があります。 ・同じ優先度エラーは無いです。 ・エラー処理以外で、通信処理(常に通信を行って、相手側と動作しているか?  お互いで監視しています。)  スイッチ入力処理、PWM出力処理  と処理があります。 ・省電力は考えないです。 T.Kannoさんの書き込みで、無限ループによるポーリング処理を私も 考えました。しかし、処理がゴチャゴチャしてしまい、すっきり感がありません。 関数オブジェクトの様な処理を構築し擬似タスクを自前で用意すべきか考えるのですが 関数オブジェクトを使っての擬似タスク処理の経験が無いので どうプログラムしていけば良いのか? 悩んでいる次第です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問