開発ノート (91)

川内 康雄

ハイブリッドアプリでシステム開発:JSでボタンへのイベント登録はloadの後じゃ無いとだめ

最近流行のハイブリッドアプリの開発に挑戦してみようと思い、実質二択であるmonacaとionicを試してみることに強いました。まずはmonacaから。HTML5+JavaScriptを標榜するだけあって、開発自体はHTML5+JavaScriptそのまんまな感じですね。HTMLで書いてJSのイベントドリブンで記述していきます。ここでハマったのが、HTML要素にイベントを登録するには、ページの読み込み、または少なくともDOMツリーの構築が完了してからで無いといけないということ。以前にNodeでシステムを作っていたときには意識していたはずなんですが、すっかり忘れていました。というかこのあたりは公式チュートリアルとか公式本で言及しておいて欲しいところです。甘い? ons.bootstrap(); var datenow = new Date(); console.log(datenow.toString()); 内容は公式のサンプルのOnsen UIの最小限のテンプレに記述を加えたものです。 $(""ons-button#page1button""),on(""click"",function(e){ console.log(""test script on page1.html ""); }) Navigator test button 1 test button 2 windowのloadイベントが発火した後に実行したaddEventListenerとかJQueryのonは有効なようで、関数が登録されちゃんと実行されます。一方スクリプト読み込み時に実行されるものは登録されませんでした。 /*//これは動作しないdocument.getElementById(""page1button"").addEventListener(""click"", function(e){ console.log(""test log addeventlister non jquery 1"");});//これも動作しないdocument.addEventListener(""click"", function(e){ if(e.target.id ===""page1button""){ console.log(""test log addeventlister non jquery 2""); }});//これも動作しない$(""ons-button#page1button""),on(""click"",function(e){ console.log(""test log…

Continue reading...
川内 康雄

Raspberry PiでIoTなシステム開発:リアルタイム性能測定用の波形をmbedで作る

preempt_rtパッチが当たったlinuxカーネルの性能をGPIO割り込みで確かめるべく、入力させる用の波形を作ります。ファンクションジェネレータを使おうかと思いましたが、マイコンで書く方が融通が利きそうなので、mbedでささっと書くことにします。 #include ""mbed.h""PwmOut mypwm(PA_5);int main() { mypwm.period_us(600); mypwm.pulsewidth_us(200); while(1) { }} 今回波形の計測に使用したのはBitScopeです。PCオシロはWindows用ばかりなのですが、これはMacでも使用できるクライアントソフトが配布されいます。さすがはマイコン。200usオン、400usオフの結構周波数の高い波形ですが、キレイに出ています。さてLinuxでどこまでこれに追随できるでしょうか? “”” 設定は周期600μs、オン200μs、オフ400μsなので、周波数は約1.67kHz、デューティ比は約33.3%です。GPIO応答を比較する際は、この入力周期とパルス幅を区別して記録します。

Continue reading...
川内 康雄

Raspberry PiでIoTなシステム開発:リアルタイムタスクと非リアルタイムタスクとの違い:波形生成

リアルタイムタスクと非リアルタイムタスクの性能差を確認すべく、Raspbbery Piに矩形波を生成させ、ストレスをかけてみました。使用したコードは以下の通り。 #include #include #include #include #include #include #include #define MY_PRIORITY (49) /* we use 49 as the PRREMPT_RT use 50 as the priority of kernel tasklets and interrupt handler by default */#define MAX_SAFE_STACK (8*1024) /* The maximum stack size which is guaranteed safe to…

Continue reading...
川内 康雄

Raspberry PiでIoTなシステム開発:RASPBIAN JESSIEでのネットワーク設定

リアルタイムパッチが当たっていないRaspbianを用意しようと公式を見たところ、JESSIEというリリースが追加されていました。LITE版だとデスクトップ環境が省かれていてダウンロードが早く済みそうです。そこでこれを利用してセットアップしてみたのですが、早速ハマりました。今までとはネットワークのコンフィギュレーション方法が変わっています。 sudo nano /etc/network/interfacesでの内容は以下の通りとしました。 http://raspberrypi.stackexchange.com/questions/37920/how-do-i-set-up-networking-wifi-static-iphttps://www.raspberrypi.org/documentation/configuration/wireless/wireless-cli.md # interfaces(5) file used by ifup(8) and ifdown(8)# Please note that this file is written to be used with dhcpcd# For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf'# Include files from /etc/network/interfaces.d:source-directory /etc/network/interfaces.dauto loiface lo inet loopbackauto eth0allow-hotplug eth0iface eth0…

Continue reading...
川内 康雄

Raspberry PiでIoTなシステム開発:リアルタイムパッチは割り込みでも効果を発揮するのか

ジムカーナ用タイマーを作成する為にリアルタイムパッチが当たったカーネルを導入してみました。各種ドキュメントによるとpreempt_rtパッチが当たった場合、config_preemptよりもタイムスライスが短くなり、応答する割り込みが増えるようです。通常のリナックスで10ms、config_preemptで100us、preempt_rtで30usぐらいだそう。ただ公式のサンプルは周期実行のみで、割り込みではどういった挙動を示すのかについては触れられていません。割り込みについては、preempt_rtパッチが性能を向上させるのか、させないのか、ここは自分の目で確認してみようと思いました。その前に公式のサンプルの読解です。そうしないとリアルタイムタスクの作り方が分かりません。https://rt.wiki.kernel.org/index.php/RT_PREEMPT_HOWTO何もしないプログラムの割には結構長いんです。 長くなっている理由は2つで、メモリフォルトの防止と高精度なnanosleepの準備でした。mlockallはページがスワップエリアにスワップされるのを防止して、ramに残ることが保証します。stack_prefault はmemsetをダミーで呼び出して、予めスタックフォールトを発生させておくようです。いずれもリアルタイムタスクにコンテクストスイッチが発生する際にページフォルトが起こるのを防止して、応答性を上げるための配慮ですね以下のコードclock_nanosleepとこれを使うための準備です。 clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &t, NULL); 絶対値としての時間が経過するまでスレッドを停止 clock_gettime(CLOCK_MONOTONIC ,&t);ある単調時間の増加により表現されるクロックの取得 while (t.tv_nsec >= NSEC_PER_SEC) { t.tv_nsec -= NSEC_PER_SEC; t.tv_sec++;}t.tv_nsecが1000000を超えている場合にtv_secを増やしてt.tv_nsecを1000000以下にする 実装してみたコードがこちら。 #include #include #include #include #include #include #include #define MY_PRIORITY (49) /* we use 49 as the PRREMPT_RT use 50 as the priority of kernel tasklets and interrupt handler by default */#define MAX_SAFE_STACK (8*1024) /* The…

Continue reading...