a MIRS0904-SOFT-0004
MIRS0904 プログラムで発生した問題
MIRS0904-SOFT-0004
改訂記録
版数 作成日 作成者 承認 改訂内容
A01 2010.03.01 金子 杉崎 初版

目次

1. 本ドキュメントについて
2. 発生した問題について
3. 対策と結果

1. 本ドキュメントについて

  プログラムを作成、実行したときに発生した問題と、解決策についてまとめる。
 発生した問題は、基本的に4班の統合プログラム中で発生したものだが、今後のMIRSにおいても発生するかもしれないものであると思われる。また、解決策が一筋縄でないと感じたため、ひとつのドキュメントとしてまとめることにした。
 


2. 発生した問題について



    発生した問題を並べると、
    • 超音波センサの返り値が20になってしまう
    • スレッド内の変数の値が保持されない
    • モーターに関するエラー

    などがあった。 超音波センサの返り値が20になる  4班の統合プログラム内では、モーターと超音波センサをどちらもマルチスレッドによって操作した。このとき実際は20cm以上距離があるにも関らず、超音波センサの値を取得する関数(いわゆるuss_get())の返り値を代入した変数の値が20になるときがあった。もちろん可変抵抗、基板などといったハード面の問題ではなく、ソフト的に発生した問題である。単純にuss_testを行ったときは正常な値を返してくる。  →対策

    スレッド内の変数の値が保持されない
     スレッド内でループをカウントする箇所がいくつもあった。そのようなときに、ループのカウント用に宣言した変数の値が正常に更新されないときがあった。プログラムのミスではなく、コンパイルの仕方による問題だったようだ。  →対策

    モーターに関するエラー
     4班では、用意されているプログラムmotor.c に近いプログラムでモーターを動かしている。モーターの片方だけが突然負荷がかかって回転しなくなったりすると、まれにエラーがでてモーターが回らなくなるときがある。このときは完全にプログラムをキャンセルし、motor_restart.sh 等を実行しなければ正常な状態にもどらない。このようなエラーが競技中に発生してしまった場合は、どうすることもできなくなってしまうため、対策を考えようとした。  →対策


    対策と結果




    超音波センサの返り値が20になる
     原因は解明できなかったが、スレッドを多用すると発生するようである。特にモーターのスレッドと同時に超音波センサのスレッドを動かしていると発生しやすいようだった。このため、超音波センサの値を取得するような部分に、モーター用のmutexを入れてしまうことで、解決することができた。mutexで囲むのは超音波センサの値を取得し、変数に代入する部分だけであり、時間としては非常に短いためモーターの動作に影響は与えなかった。

    スレッド内の変数の値が保持されない
     最終的には、コンパイルの最適化レベルを下げることで解決した。どうやらこの問題は、コンパイラがプログラムを最適化する際に、プログラマの意図していない動作に書き換えてしまったために発生していたらしい。はじめは、解決するために、変数を宣言する際に修飾子volatile や static をつけてみた。しかし、思うようにはいかなかった。そこで、今までコンパイルの最適化レベルがMakefile内でCFLAGS = -O2 -Wall ・・・ というように 2 であったのを 1 にしてみたところ、ほとんどこの問題は解決した。マルチスレッドを使う際には、コンパイラがプログラムを、プログラマの意図しないようなコードに変えてしまうことはよくあることのようで、注意が必要らしい。

    モーターに関するエラー
     この問題は良い解決策が見つからなかった。単純にsystemなどの関数を使ってmotor_restart.shをかけても上手くはいかなかった。また、プログラムを強制終了させると、たとえモーターの状態を正常にしてプログラムを再度実行させてもどのような状況におかれているのかを判断させるのが難しいと思われる。しかしC 言語ではプログラムを強制終了させたり、強制終了させる際に実行するプログラムが書けたり、関数を終了させて指定されていた位置に戻し違った処理をさせる方法などは色々用意されており、解決の鍵になりそうなものはいくつかあった。競技中どのような状況におかれているのかは、別にファイルをつくりそこに状況を保存しておいて、再実行されたときに読み出すような工夫が必要かと思われる。
     

    関連文書
    統合プログラム説明書