2011年5月アーカイブ

<volatileの必要性1>

| | コメント(2)

 皆様のおかげさまを持ちまして、今年もD-CLUE社員旅行に行くことができました。
 今年も恒例の沖縄です。

20110530_1_tobe.jpg

 

 沖縄にきてしばらくして感じたことは、なんとなく自分がのんびりしているなと感じたことです。それは海があるからなのでしょうか?自然があるからなのでしょうか?昔は全然考えなかったのですが、ふと今回そんなことを感じました。
 「海岸線を走っているとき」、「山の中を走っているとき」。それらの全てを含めてここでは時間がゆっくりと流れている感じがしています。もちろん仕事で来ているわけではありませんので、なにかに急かさせることもないのですが、この明るい日差しと波の音がゆっくりとした時間の流れを感じさせてくれるんだなと思い、自分の心をリフレッシュさせることができました。
 また、沖縄と言えば「沖縄そば」が有名ですね。私は「ソーキそば」よりもこのもやしがたっぷりと乗った「牛肉そば」が好きです。

20110530_2_tobe.jpg

 

 

 

 

 

 

 

 

 

 

 

 

 しばらく食べ続けないと、その下にある「そば」に出会えません。
 これを全て食べ尽くしたときに、なんとも言えぬ達成感があります。。。

 

<volatileの必要性って1>

 さて、沖縄の時間はゆっくりと流れていますが、プログラムのコードは出来るだけ早く動いてもらいたいものです。そこで、皆さんはコンパイルをするときに最適化のオプションを付けたりすると思います。

 たとえば、以下のような処理を作ったとします。

20110530_3_tobe.png

 testFunc()という関数を考えますと、変数[initialFlag]を"1"に初期化した後、[initialwait()]という関数を呼び出します。
 [initialWait()]では[initialFlag]が"0"にクリアされるのを待っていて、"0"になったらwhile文を抜けて[testFunc()]に戻ってきます。
 自分で変数を"1"に初期化したのに、"0"を待っているなんて、一見あり得ないようなプログラムですが、以下のような場合が考えられます。

 

20110530_4_tobe.png 事前にデバイスドライバー等を初期化しておいて、外部からのイベント(電源ボタンの押下等)をひたすら待っている場合等がその例だと思います。
 さて、今回これらのプログラムがどう動くかを見てみます。と言うわけで、恒例のアセンブラです。
 

20110530_5_tobe.png

 上記アセンブラコードは、コンパイラが出力したListファイルを貼り付けたものです。
 ここで重要なのは、whileのLoopがどのように変換されているかです。
 コードの一番左側に行ラベルがありますので、そちらを基準に説明しますと、
   65c-660 :r3レジスタにinitialFlagのアドレスをLoadしています。
   664     :r3レジスタにinitialFlagの中身をLoadします。(最初は"1")
   666     :r3レジスタの値を"0"と比較します。
   668     :違っていたら65c番地に移動します。

 

ここで見る限り、特に問題はありませんね。
さて、上記Listは最適化オプションを[-O0]を使ってコンパイルしたものです。
実際にデバッグが完了し、製品上で最終試験をする場合は[-O2]等のオプションを付けるか、Toolによっては[Release]側を選択して最終コンパイルをすると思われます。
そこで、[-O2]を付けてビルドしたコードを見てみることにします。
 

20110530_6_tobe.png    490-494 :r3レジスタにinitialFlagのアドレスをLoadしています。
   498     :r3レジスタにinitialFlagの中身をLoadします。(最初は"1")
   49a     :r3レジスタの値を"0"と比較します。
   49c     :違っていたら49c番地に移動します。

 

ここで、問題となるのは49c番地の動作です。
先ほどのソースと大きく違うのは、49c番地の動作では、再度[initialFlag]の中身をLoadせずに、CPU内部の演算結果だけをみていることです。
従って、この場合は、割り込みハンドラ側でイベントを受け付けたことにより"0"を設定しても、while()のLoopは抜けなくなってしまいます。
「デバッグしている時は、動いていたのに、最終試験をすると動かない。。」ということになります。

さて、どうするか。。。そこで[volatile]宣言の活躍です。
先ほどのプログラムから変数の宣言だけを変更します。

 20110530_7_tobe.png

そこで、再度アセンブラコードをみますと。

20110530_8_tobe.png

     490-494 :r2レジスタにinitialFlagのアドレスをLoadしています。
   498     :r3レジスタにinitialFlagの中身をLoadします。(最初は"1")
   49a     :r3レジスタの値を"0"と比較します。
   49c     :違っていたら498番地に移動します。

 

今度の場合は、[498番地]の比較結果がNGの場合は [498番地]に戻っています。
[498番地]では再度r2(initialFlag)の中身をLoadしますので、もしも誰かが変更している場合は、新しく"0"という値が取得出来ることになります。

割り込み処理等が無くシングルタスクの場合、あるいは最適化オプションが無い場合は問題ないかもしれませんが、そのようなプログラムはあまり一般的ではないと思いますので、改めてきちんと付けることにしましょう。

 

 さて、心がリフレッシュできたところで、体はと言いますと。
 今年もD-CLUE社員旅行恒例の、「大イベント大会」を行いました。
 海岸で体をつかったイベントや、ゲームをやって盛り上がるのですが、今年は急遽「大水泳大会」も追加されました。
 急遽はじまった水泳大会ですが、たまにプールに行っていることもあり若干余裕かと思ったのですが、急に泳いだら足がつってしまい。。σ(^◇^;)
 ちょっと40歳を超えてなにか、今までのように行かない自分に。。。そんなことも気がつかせてくれるすてきな沖縄でした。(~ヘ~)ウーン。。改めて準備(運動)が必要です。
 最後に、沖縄の注意点ですが。。
 遊びすぎに注意しましょう。。
 あまり遅くに空港に行きますと。

20110530_9_tobe.jpg

 

 

 

 

 

 

 

 

 

 

 

 

 「ぐぶり~さび~しが・・・・、ちゅうやうわいやいび~ん」と。。
 お腹が空いても、何も食べれません(笑)

<WindowsMobile2>

| | コメント(0)

 少し情報としては、古くなりますが。近所の桜が満開でしたので、是非この桜を皆さんにお伝えしたいと思い、写真を撮っておきました。

20110502_1_tobe.jpg

 

 例年、桜祭りが行われるのですが、電力供給の不安定さ、および自粛ムードに伴い、今年は中止になりました。子供たちは、毎年ここで販売される、「桜ソフトクリーム」を楽しみにしているので非常に残念がっていました。
 おっと、「花より団子」ということでしょうか?( ̄― ̄)
 春と言えば、別れと出会いの季節ですね。
 ちょうど娘が卒業を迎えたこともあり、卒業式そして入学式と参加してきましたが、やはり卒業式の方が泣けますね。
 私たちの学校では、歌で作る卒業式という感じがあります。卒業式を迎えるにあたり、一生懸命歌の練習をしていたことも、自宅の様子からわかります(鼻歌がよく聞こえます)し、送り出す側も一生懸命に歌の練習をしていたことが予想されます。
 送り出される側、送り出す側、一つの大イベントを盛り上げようという雰囲気を感じます。
 また、卒業式が終了し体育館から退場した後、在校生が校庭に移動して、花のアーチを作って校門まで送り出していました。
 やっぱり「これでもか!!」と言うくらい、送り出される主役たちを盛り上げることが大事だなぁ?と感じました。
 そして送り出される側が出した最後の一枚がこれです。

20110502_2_tobe.jpg

 

 

 

 

 

 

 

 

 

 

 

 そうです、卒業式には「感謝」というものがあふれているからなのではと感じました。

 

 

<GPS情報の取得>
 前回から、スマートフォンをいじっています。
 前回はプロジェクトの作り方を説明しましたので、今回はスマートフォンを使ってGPSの情報を取得したいと思います。

 スマートフォンでGPSを取得使用とした場合、Windowsが提供する以下の「GPS Intermediate Driver」を利用することで簡単に取得ができます。
 http://msdn.microsoft.com/en-us/library/bb202086.aspx

 上記Driverについては、前回のBlogでお伝えした開発キットをインストールすることでサンプルアプリとともに提供されます。
 それでは、以下の手順でGPS情報の取得と行きます。


<STEP1:ドライバーの複写>
 「GPS Intermediate Driver」を使ったサンプルアプリはインストール時に特に変更をしていなければ、以下のフォルダーに入っています。
 C:\Program Files\Windows Mobile 6 SDK\Samples\PocketPC\CS\GPS

 上記フォルダから以下の7つのファイルを自分のプロジェクトにコピーしてきました。

20110502_3_tobe.jpg

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

<Step2:フォームの作成>
 GPS情報を取得するためのフォームを作成します。

 今回用意した画面は、以下の通りです。

20110502_4_tobe.PNG

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 GPS情報を表示するために、2つのテキストボックスと情報を取得するトリガーとなるボタンを一つ実装しました

 

<Step3:変数の定義>
 GPS情報を取得するために以下の3つの変数を定義しました。

20110502_5_tobe.PNG

<Step4:初期化処理>
 Step3で定義した変数の初期化、およびクラスの生成を行います。

20110502_6_tobe.PNG

 [GPS Intermediate Driver]については、newおよび[Open()]の2手順で利用が可能です。

 

<Step5:位置情報の取得>
 [Btn_GetPosition]が押下された時に最新の情報を取得するようにします。そこで、[Btn_GetPosition]のイベント時に以下のコードを記載します。

20110502_7_tobe.PNG

 

 さて、簡単ではありますが、これで終了です、実行結果については、以下の通りです。 

20110502_8_tobe.jpg

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 ん??、なにか微妙にずれている気がするが。。

 

 さて、震災にともないいろいろなイベントが中止になりました。
 我が家の娘たちは、朝ジョギングもしていることもあり、マラソン大会を楽しみにしています。
 しかし、残念ながら今年は中止が多かったです。
 そこで、代わりにバドミントンをやることに。。

20110502_9_tobe.jpg

 

 

 

 

 

 

 

 

 

 

 

 

 体育館を利用して、安く親子で楽しんでいます♪
 ようやく、前回購入したラケットが活躍しています(笑)