2011年6月アーカイブ

<volatileの必要性2>

| | コメント(0)

 先日娘の授業参観に行って参りました。
 公開授業の内容は「道徳」です。授業では一枚のプリントが配られました。タイトルは「くずれ落ちただんボール箱」です。

20110627_1_tobe.jpg

 

 この話では、主人公である「私が」、スーパーマーケットに行ったときに、小さな子供がふざけていて、つまれていた段ボール箱を崩してしまうところから始まります。
 小さな子供は崩した後に、さっさとどこかへ行ってしまい、子供をつれていたおばあちゃんが心配そうに子供の行く先を見つめながら、段ボールを片付けようとしています。

 主人公である「私」はおばあちゃんの「片付けを手伝ってあげます」と言い、おばあちゃんは「ありがとう」と言い、子供の行った先をゆっくりと追いかけていきます。
 何となく、どこにでもありそうな話ですね。

 実は、この後、この女の子は段ボールを崩した人と間違えられて、スーパーマーケットの店員にむしろしかられてしまいます。

 授業では、こういう状況に出会ったとき皆さんはどうしますか?という内容で、生徒と話を進めていきます。


 <先生>「みんなだったら、どうですか?」、
          「おばあさんに手伝ってあげたのに、むしろ店員にしかられてしまって」。


 <生徒>「なんか、損した感じ」、「やらなきゃよかった」。

 

 このような意見が出ました。
 でも、先生は「そうかなぁ、みんなは、ほめられるために手伝ってあげたのかな?」、「最初はおばあちゃんが心配だから手伝ってあげたんじゃないのかな?」と生徒に問いかけます。

 今被災地などで、日本人のマナーが世界で紹介されています。こういうことも親からあるいは学校から「道徳」というものを通じて小さい頃から教わっているからではないかと感じました。つねに相手のことを想い、自分がほめられるためでなく、人のために行動を起こすと言うことは日本人の大事な心ですね。
 また、その授業ではもう一つ重要なことを言っていました。それは、小さな子供が段ボールを崩した時に自分がどういう行動を取るか?です。

 半数の生徒は、「はずかしいから、遠くでみている」とか、「誰かがやるかもしれないから。。」という意見でした。そこで先生は質問します。

 

 <先生>「では、手伝ってあげるために必要なことはなんだろうね?」

 

  ある生徒が、「勇気をもって声をかけること」と答えました。

 

 今回の道徳の授業の結論でした。
 人生、いろいろな場面で「あのときああしておけばよかった」といったようなことがありますね。でも出来ないことが多い。そのときに必要なもの、それが「勇気」であると私も思います。

 あらためて、学校から私もいろいろと教わることがあった授業参観でした。

 

 

<volatileの必要性って2>

 さて、前回は一見あり得ないようなプログラムですが、現実によくありそうな、そんな例を用いたプログラムでしたが、今回はファームウェアでよくあります、ハードウェアへの制御を例にvolatile宣言の必要性を欠きたいと思います。

 今回は、あるハードウェア制御レジスタ(5555番地:2Byteサイズ)に対して以下の手順で初期化を行うプログラムを記述します。

  • 0x00FFを書くと初期化を行う。
  • 0x0011を書くと制御が開始される。
  • 0x0033と書くと制御が停止する。

 それぞれの処理結果については、デバッグ用にviewWork[3]という変数にしまっておきます。

 簡単にプログラムを書くと以下のようになります。

 

20110627_2_tobe.png 

 

 このプログラムを実行したところ、ハードウェアは期待する動作をしていませんでした。
 制御処理のロギング用としてviewWork[]をみますと、しっかりと0xFF, 0x11, 0x33というように期待する値が入っていました。
 どうしてなのでしょう。

 今回も、CPUの実際の処理を調べるべくアセンブラ表示を行います。
 マイコン(DSP)はTI社製である[TMS320F28027]を使っています。


 

20110627_3_tobe.png

 

 

 実際の処理をみますと、どうやらおかしいです。
 5555番地に対して値を書いているのは、[008]行目の処理だけのようです。
 しかし、viewWork[]という配列に対して値をしまっているのは[006], [007], [009]行目ですが*regWorkではなく0xFF等といった値を直接入れています。
 結果としては、viewWork[]には確かに0xFF, 0x11, 0x33は入っていますが実際に5555番地は0x33だけしか書いていません。今回の仕様ですと最終的な停止命令だけ発効されているという結果になりました。

 さて、この問題を解決するために、volatile宣言を行います。先ほどのプログラムから5555番地にアクセスを行う*regWorkをvolatile型に書き換えてみましょう。

 

20110627_4_tobe.png

 

 さて結果をアセンブラで見てみます。

 

20110627_5_tobe.png

 

 ポイントをみますと、本来書き込みを行いたい5555番地に対しては、[005], [009], [012]行目で書き込みを行っております。そしてさらにviewWork[]に対しては[008], [011], [013]行目で実施されているますが、先ほどと大きく違うのは、0xFFといったような値を直接書き込むのではなく、5555番地から読み出した値を使っていると言うことです。
 つまりは、0xFFといった書き込み(制御)に対する処理結果を返してくれていることになります。
 これで、うまくいきました。
 ポインタ等を利用して外部領域にアクセスする際は十分に気をつけてください。

 

 さて道徳といいますと、学校教育もそうですが普段の生活で身につけることも大事ですね。
 先日実家に戻って、お肉屋さんに買い物にいったところ、合計で1,512円(消費税込み)でした。小銭を持っていませんでしたので、2,000を払ったところ。
 「おまけだよ」といって500円のおつりをくれました。
 パソコンとかPOSレジを利用したシステムの中で計算が合わなくなることが「ダメ」と言われる世の中で、細かいお金をおまけとしてサービスできる心はまだ下町には残っていたようです。

20110627_6_tobe.jpg

 

 

 

 

 

 

 

 

 

 

 

 

 と、感動して帰ってきたのですが。
 よく考えると、私41歳なんですよね。地元ではまだまだ「子供」なのでしょうか?