27-Sep-2013
[小ネタ二つ。]

07-Jun-2013に書いたAndroid用USB-LANアダプタ(JP1081とかRD9700とか言われる奴)、前の仕事場で使っていた時にFTPの転送速度がやたらと遅いのがムカついたのでUSBアナライザを使ってごにょごにょしてみたんですが…これはちょっと酷いですね。

128バイトのイーサネットフレームをこのLANアダプタに対して何度か投げつけてみたのですが、本来なら64byte×2+トランザクションの終了を示す0byteのパケットをUSB上で観測しなければならないところが、時々64byte×2のみとなる(0byteのパケットが欠落する)現象が起きています。これじゃあ速度が出る訳がない。

…流石に今後はこういう解析行為も気軽にはできないので、この手のアダプタいじりもお終いかな。

OpenBSD-5.3/amd64に入っているfirefox-18.0.2p0.tgzでAutoPagerizeを使おうとするとFireFoxのバージョンが適合しないのでインストールを拒否される問題に悩まされていたんですが、これはinstall.rdfのem:minVersionの指定に引っかかっているようです。


    <!-- Firefox -->
    <em:targetApplication>
      <Description>
        <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
        <em:minVersion>19.0</em:minVersion>
        <em:maxVersion>20.*</em:maxVersion>
      </Description>
    </em:targetApplication>

この部分を書き換えて.xpiを作り直せば一応動く感じ。60.15kg(05:10)

26-Sep-2013
[なにやら都留線255号周辺で動きがあるようです]

timgp3111.jpg timgp3112.jpg

ちょいと写真が残念画質なんですが、都留線255号の周りに中村送電と書かれた重機が入っていました。この辺りの送電鉄塔は大正14年製と古いものが多く、また開発の噂のある地域であるため、建て替えられる可能性がひょっとするとあるのかもしれません。

しばらくの間、ウォッチしてみようと思います。60.10kg(15:20)

23-Sep-2013
[おしまい。]

LPC1114でもそれなりにμT-Kernelっぽいものが動くことが分かったので(サブシステム周りは削っているので完全に互換とは言わない)、この実験は終了。証拠物件はここに。スクリーンショットはtwitpicに上げてますのでそちらを。

細かいことをいちいち書いている暇がないので詳細は差分と差分を当てた後のソースコードを参照。使用したボードはthe0.netZ111xP。eBayなんかで安く売っているし、日本なら日新テクニカから買える。58.90kg(07:00)

22-Sep-2013
[バグみっけ?]

UCT μT-Kernel DevKit tuned for FM3-GCC無償評価版、AIRCRのbit[10:8](PRIGROUP)をkernel/sysdepend/device/app_mb9af312k/icrt0.Sの以下のコードで設定しているんですが…


	/* Configure exception priorities */
	ldr	r5, =SCB_AIRCR		/* Application interrupt and reset control register */
	ldr	r6, [r5]
	ldr	r7, =0xFFFFF8FF
	ands	r6, r6, r7
	orrs	r6, r6, #0x0300		/* PRIGRP:SUBPRI = 4 : 4 */
	str	r6, [r5]

ARMv7-Mの仕様書をちゃんと読んでないんでしょうかね。AIRCRに対する書き込みは、bit[31:16]のVECTKEYを0x05FAに設定しないといけません。以前作ったモニタもどきをusermain.cに無理やり突っ込んでダンプすると、こんな感じ。AIRCRはアドレスE000ED0Cにあります。

t20130922.png

ね、正しく設定できていない。0x05FA0300を直接書き込んでも問題無いような気がしますが、read-modify-writeするのであれば(AIRCRの値 & 0x0000F8F8) | 0x05FA0300を書き込めば良いはず(1を書き込むことでリセット等が発生するbit[2:0]については、読み出した値が0であっても安全のためにクリアします)。

面倒なんだけど報告した方が良いのかなあ。kernel/sysdepend/cpu/mb9af312k/cpu_support.Sのknl_inthdr_startup()がAAPCSに違反している(スタックポインタが8-byte alignとなっていない)のも気になるし。

FM3 USBスティックボード(SK-FM3-48PMC-USBSTICK)向けの証拠物件は、ここに置いときます。59.15kg(13:40)

19-Sep-2013
[もいっちょ直してみました]

割り込みベクタ周りもいじったのを置いときます

割り込みベクタをどういじるかはちょっと悩んだんですが、FM3版の実装仕様書「7.3 未サポートの機能」にTA_ASM属性のサポートは無いという記述があったため、これに従うことにしました。問答無用で高級言語対応ルーチンへ飛ばす(TA_HLNG属性が指定されているものとして扱う)ことにします。

Cortex-M0でアセンブラ使った割り込みハンドラを書きたいというケースが無いとは思いませんが、多分少数派だと思いますので、必要に応じてvector.Sの修正をお願いします。

これでベースとなる部分は整ったはず。根幹となる部分の動作は確認済みとして扱えるので、残るはスタートアップと、T-MonitorのフリをしてUARTに対して入出力を行う部分を書けば…あとメモリアドレスの調整か。59.85kg(17:35)

19-Sep-2013補足:LPC1114の場合、SYSMEMREMAPレジスタを操作することで0x10000000〜0x100001ffのRAMを0x00000000〜0x000001ffのアドレスにマップすることができます。これを、Cortex-M3のVTORレジスタによるベクタ領域のROM→RAM切り替えの代用として使うことはできそうですが…この機能は敢えて使わないことにします。

18-Sep-2013
[直してみました]

結局cpu_support.SのCsym(knl_inthdr_startup)の終わりの方にある、subs r2, r2, r1とすべき箇所がsubs r2, r1, #1となっていたために、Csym(knl_taskindp)の内容がおかしくなっていたというバグでした。修正版を置いときます

改変元のCsym(knl_inthdr_startup)は不思議な作りになっていて、Csym(knl_taskindp)の内容を増やす場合はレジスタr1にロードしてaddしてストア、減らす場合はレジスタr2にロードしてsubしてストアしています。また、このコードの出入り口はpush {lr}/pop {lr}になっているんですよね。

前者はr1/r2のどちらかに統一するか、あるいはr0を使ってもこの文脈では問題は無いはずなのですが、とりあえずいじる必要の無い箇所はいじらないという方針でそのままにしています(で、何故かバグを招いた訳だが…)。push {lr}/pop {lr}については、AAPCSの「スタックは8byte単位でアライメントすること」に違反しているため、改変版ではpush {r2, lr}/pop {r2, lr}に直しています(r2は数合わせのために入れているだけなので、r0〜r7のどれかであれば良い)。

改変元のCsym(knl_timer_handler_setup)については、stmfd sp!, {r4-r5, ip, lr}/ldmfd sp!, {r4-r5, ip, lr}とAAPCSを意識していると思われる(ここではipを保存する必要は無いが数合わせのために含めている)作りになっている点と、Csym(knl_inthdr_startup)だけpush/pop、他はstmfd/ldmfdと命令が統一されていない点について、理由を聞きたいところです。

ここまでできれば、あとは割り込みベクタ周りと機種依存部分(SoCの初期化とかUART周りとか)を片付けるだけですかねえ。58.50kg(05:35)

17-Sep-2013
[やっぱ問題あったか]

UCT μT-Kernel DevKit tuned for FM3-GCC無償評価版のARMv6-M対応化改造、割り込みハンドラの動作を確かめるためにベースタイマ割り込みを使ってLEDの点滅を行わせてみたんですが…案の定クラッシュしますね。

テスト用に作ったusermain.cとこれを組み込んだCortex-M3用の(改造前の)μT-Kernelを晒しておきます。改造前はちゃんと動くので、改造によるエンバグは明らかなんですが、正直ヘコみますねこういうのは。58.75kg(17:30)

16-Sep-2013
[八ツ沢線96号のその後]

07-Apr-2013で腕金をいじっていた八ツ沢線96号、やっとこさその後を撮りに行くことができました。

まずは老番側から。ちょっとこれだけではよく分かりません。

tp9070921.jpg tp9070923.jpg tp9070922.jpg

鉄塔の北側から。

tp9140929.jpg tp9140930.jpg tp9140931.jpg

お次は鉄塔の南西側から。

tp9140932.jpg tp9140933.jpg tp9140934.jpg

今までは川尻線の1番/2番をそのまま川尻変電所につないでいたのを、川尻線/八ツ沢線の両方を半分ずつつないでいるように見えるのですが…拡大したのを見てみても、ちょっと何が何やらというのが正直な感想です。

撮影からの帰り道、県営大島団地で見かけた駄菓子屋さん。

tp9140935.jpg

いまどきこういう筐体のゲーム機を置いているのは結構珍しいかも。

tp9140936.jpg tp9140937.jpg tp9140938.jpg tp9140940.jpg

電源の入っている方はメタルスラッグ3、入っていない方はメタルスラッグ2が動くようです。ジャンケンマン、今度来たときは遊んでみましょうかね。60.00kg(08:10)

15-Sep-2013
[一旦ここで〆ていたはずなんですが]

UCT μT-Kernel DevKit tuned for FM3-GCC無償評価版のARMv6-M対応化改造、まだ直す箇所があったので直してみました。BASEPRIレジスタの操作による割り込みの禁止とNVICのSTIRレジスタによる割り込みの発生は、それぞれPRIMASKレジスタとISPRレジスタを使用したものに書き直しました。

あんまりやりたくはなかったのですが、今回は細かい部分も手を入れています。ldr命令による値のロードをmovs命令に置き換えたのと、xPSR, PRIMASKレジスタの参照のインライン化です。ldr→movの最適化はgas側で行ってくれるはずなのですが、ARMv6-Mはmovが使えないためかldrのままになっているようです。後者については、最初からやっとけって感じですね。

ここまでいじってしまうと、きちんとしたテストをしない限りもう動作は保証できません。特に割り込み周りはかなり怪しいです。BASEPRIではなくPRIMASKを使用する場合、PRIMASKがどこまで割り込みを禁止してくれるかは明確ではありませんし、(これはオリジナルのコードでも同様ですが)少なくともNMIはOSの管理外として扱わないといけないはずです。

あとは割り込みベクタ周りのコードを大きく直さないと多分駄目なはずなんですが、正直言ってそろそろ止めたいです。59.45kg(05:30)

25-Sep-2013補足:10-Sep-2013の補足を参照してください。

14-Sep-2013
[今更ではあるんですが]

工人舎のML6RL16Aなる、ネットブックを買ってみました。下手なAndroid端末より安かったのと(あの値段だったら実験用にもう一台欲しいくらいだ)、仕事場に持ち込んでいたジャンクのノートPCがでかくて邪魔になってきたので。

OpenBSD-5.3/i386を入れてLibreOfficeを動かす程度の目的なので、これで十分な感じです。ジャンクのノートPCよりも画面が狭くてちょっと細かいのと、キーボードの小ささが辛いところではありますが、ちょっとした調べ物や表の作成には十分役立ちそうです。

lspci, lsusb, dmesgの表示内容を晒しておきますかね。有線LANはRealtekなのでともかくとして、無線LANはVIA VNT6656が載っています。今のところ、これはOpenBSDから使うことはできませんので無線LANを使いたい人は別途使えそうな何かを用意する必要があります。

新しいお仕事は二週間続きました。一ヶ月続くかどうかはちと不安ですが、まあ頑張りましょうかね。

土曜日もお仕事なので、三連休とかラジオで言っているのを聞くと拳がぷるぷるしてくるのは気のせいじゃないです。59.35kg(16:20)

10-Sep-2013
[一旦ここで〆とくか]

UCT μT-Kernel DevKit tuned for FM3-GCC無償評価版のARMv6-M対応化改造、とりあえず一旦ここで一区切りしておきますか。前回(29-Aug-2013)との違いは、WFI対応と一部のコメントの修正くらい。ディレクトリ内にあるkernel-rom.mot(他一式)は、08-Sep-2013のusermain.cを組み込んでいます。

あとはLPC1114向けに色々直してけばいいのかなーと思うのですが、ちょっと気になったのがlib/libtk/src/sysdepend/app_mb9af312k/disint.Sにあるこの記述。ソースをまるっと引用しますよ。


	.code 16
	.syntax unified
	.thumb
/*
 * Disable external interrupt
 * UINT disint( void )
 *	Disable interrupt by Rise prioperty to 0.
 */
	.text
	.align	2
	.thumb_func
	.globl	Csym(disint)
	.type	Csym(disint), %function
Csym(disint):
	mrs	r0, basepri
	ldr	r1, =MAX_EXTINT_PRI
	msr	basepri, r1
	bx	lr


/*
 * Enable external interrupt (restore to original state)
 * UINT enaint( UINT intsts )
 *	Enable interrupt.
 */
	.text
	.align	2
	.thumb_func
	.globl	Csym(enaint)
	.type	Csym(enaint), %function
Csym(enaint):
	msr	basepri, r0
	bx	lr

PSR側の割り込み禁止フラグではなくNVIC側の割り込み優先度をいじって割り込みを完全に禁止する意図って、なんなんですかね。割り込みが発生した際にスタック上にxPSRが積まれるので、これを触りたくない(ARM7TDMI版のcpu_support.Sではスタック上に保存されたPSRの割り込み禁止フラグを消す処理が行われているが、これを嫌った?)という理由くらいしか思いつかないのですが…

とりあえず下手に改変して怪我するのも嫌なのでこれは放置しておきますが、なんなんだろうと疑問に思っていることは確かです。59.05kg(18:05)

13-Sep-2013補足:Cortex-MのxPSRにはARM7TDMIのようなIRQ/FIQ禁止フラグはありません。cpsid i/cpsie iに連動してMSRのPRIMASK.PMの内容が変化するようです。

Cortex-M3とは異なり、Cortex-M0ではBASEPRIレジスタが無いので、PRIMASKレジスタの操作に置き換える必要があります。NVIC周りも多少手を入れる必要がまだ残っています…

25-Sep-2013補足:cpsid命令の説明に書かれていますが、cpsid iを実行するなどしてPRIMASK.PM=1とした場合、優先順位は0に引き上げられます。この状態で発生可能な例外は、優先順位-1, -2を持つNMIや各種のFault等に限られます。

ARMv6-M/ARMv7-MではSVC命令による例外の発生にも優先順位が設定されており、SVC例外を発生できない状態ではHardFault例外として扱われます(ARMv6-M Architecture Reference ManualにはSVC命令の項目にこのことがちゃんと書かれているのですが、ARMv7-M Architecture Reference manualではB1.5.4 Exception priorities and pre-emptionのPriority escalationの項を見ないと分からないのですごく分かりにくいです)。

この、「SVC命令の実行は禁止されることがある」という問題を避けるのがbasepriの操作を行う意図のようです。icrt0.Sでは以下のように、SVC例外の優先順位を(Faultを除いて)一番高く設定しています。


	ldr	r5, =SCB_SHPR2
	movs	r6, #0			/* SVC pri = 0 */
	str	r6, [r5]

	ldr	r5, =SCB_SHPR3
	ldr	r6, =0x10F00000		/* Pendsv pri = 0xF, sistick pri = 0x1 */
	str	r6, [r5]

	ldr	r5, =NVIC_IPR_FORCE_DISPATCH
	ldr	r6, [r5]
	movt	r6, #0xc030		/* force dispatch pri = 0xC, IRQ #94 pri = 0x3 */
	str	r6, [r5]

とはいえ、これでもSVC例外のコンテキスト中ではSVC命令を発行できない点に注意が必要です。また、NVICのIPRレジスタの設定はμT-Kernel自体が使用する例外のみ優先順位を下げており、他はデフォルトの優先順位0のままだったりしますので、きちんと優先順位を下げておかないと困った問題を招きそうに見えます。

ARMv6-MではARMv7-Mのようにbasepriレジスタを操作して「どうにかしてSVCを使う」という手段が使えない以上、μT-KernelではSVCの使用を諦めた方が良さそうです。正直なところ、Wikipediaのプロテクトモードの歴史にある「石頭」を真っ先に思い出しました。

09-Sep-2013
[どうなんだろう…]

UCT μT-Kernel DevKit tuned for FM3-GCC無償評価版、よくよく見るとWFI命令を使用した省電力処理に全然対応していませんね。おそらくkernel/sysdepend/device/app_mb9af312k/power.cを各自で修正して対応したまえということなのでしょうが、その程度は最初から入れとけよ…Cortex-Mコアなら標準的に持っている機能なんだし。

基本的に割り込みを許可してからWFI命令を呼び出せば良いだけなので、割と簡単に直せるものだと思います。とはいえその程度であればkernel/sysdepend/cpu/mb9af312k/cpu_support.Sに突っ込んでしまう方が無駄が少ないのかなと。

ARMv6-M改変版だと、修正前のこれを


	/* Because there is no task that should be executed, move to the power-saving mode */
	ldr	r3, [r6]			/* Is 'low_pow' disabled? */
	cmp	r3, #0
	bne	1f
	bl	Csym(knl_low_pow)		/* call low_pow() */
1:
  	ldr	r0, =0
	msr	basepri, r0

	b	l_dispatch1

l_dispatch2:					/* Switch to 'schedtsk' */

こんな感じにすれば良さそう。Thumbのmov命令はmovsということで、フラグの変化を伴う点に注意。


	/* Because there is no task that should be executed, move to the power-saving mode */
	ldr	r3, [r6]			/* Is 'low_pow' disabled? */
	movs	r0, #0
	cmp	r3, #0
	msr	basepri, r0
	bne	1f
	wfi					/* do low_pow() */
1:
	b	l_dispatch1

l_dispatch2:					/* Switch to 'schedtsk' */

これで問題がなければ、今後は後者のコードにする予定。たぶん。

OS終了後もbusy loopで回ってしまうので、本当は割り込みを禁止してWFI命令を呼んで止めておくのが良いのだけど…これは各自のシステムに応じて直してくださいと丸投げしてしまいます。59.05kg(04:45)

08-Sep-2013
[まさかとは思うんだけどさあ…]

FM3 USBスティックボード(SK-FM3-48PMC-USBSTICK)、Lチカ(LEDチカチカの略)のサンプルって存在してるんですかね。ちょっと探してみても見つからなかったんですが…

「その程度なら簡単に作れるでしょ」という理由で省略しているとしたら、評価ボードとして失格だと思います。ユーザはボードの評価をするんじゃなく、ボードの上でソフトウェアの動作を評価するんですから。いちいち回路図読んでGPIO叩くためのレジスタ調べるほどヒマじゃないんです。

という訳で、UCT μT-Kernel DevKit tuned for FM3-GCC無償評価版をARMv6-Mアセンブラで書き直した奴でLチカさせるコードとかバイナリを作ってみましたusermain.cを見ればどういう操作が必要か多分分かると思います。

500ms周期で赤いLEDが点滅し、ユーザスイッチの状態に応じて青いLEDが点灯/消灯します。ユーザスイッチの状態取得は割り込みを使用したかったのですが、面倒だったので10ms周期でポーリングしています。コンテキストスイッチとSysTick割り込みに絡む処理は大丈夫そうですかねえ。60.55kg(15:05)

07-Sep-2013
[色々]

通勤時間が短くなったのでやれることは増えたようでいて、実質的に週6日勤務(週3日は〜12:30となっているものの、実際は14時過ぎても上がれない)なので自由に使える時間はあんまり変わらないかむしろ減ってる感じ。

もっとも自由に使える時間とはいえ、コードいじる暇があるならむしろ添付文書読むのに時間を使わないと全く仕事にならねえというのが現状。正直そうしたいところなのだけど、片付けるべき問題を残したままというのも気分が悪いのでまずはこれをちゃっちゃと片付けます。

とりあえず、USB TEMPer goldのOpenBSD向けドライバをcommitしてみたりとか。この程度の規模のもので半年くらいうだうだやってるのは時間掛かりすぎと言われそうですが(自分もそう思う)、慣れない環境だし転職活動とかやってたし子育ても忙しいしとか言い訳しておきます。いや能力あればそんなことしている裏でもコード書けると思うんですけど。作業の途中にで他のドライバにちょっとしたバグを見つけているので(dmesgの表示が狂うくらいで実害は無いというレベル)そこもパッチ投げないといけないんですがちょっと後回しにしちゃってます。

PHSは結局LIBERIOを発注しました。ENERUSが安いし電池として使えそうだしなにしろエメラルド初音ミク色は結構惹かれたのですが、感度と端末単体でtwitterに投稿できる点でLIBERIOを選びました。多分今夜辺りに届くんじゃないでしょうか。電話帳の移行を考えると頭が痛いです。

UCT μT-Kernel DevKit tuned for FM3-GCC無償評価版をARMv6-Mアセンブラで書き直した奴、なんかFM3 USBスティックボードにバイナリ食わせたらそれなりに動いてます。ARMv6-M/ARMv7-Mってバイナリに互換性あったのか…

t20130907.png

Serial port viewer突っ込んでしまいましたが、インストールするアプリケーションをいちいち増やすのも馬鹿馬鹿しいのでさっくりアンインストールしてTeraTermでスクリーンショット撮ってます。これだけじゃ他のボードでの動作画面を撮ったのとなーんにも変わりませんけど。

LED点滅とかタイマ/割り込みの使用とかその辺の動作確認は時間が取れ次第というかもう放り投げても良いですかね。59.30kg(05:40)

02-Sep-2013
[PHSの買い替えを検討中]

X PLATE×DELL Streakのセットに乗り換えたのが二年前。スマートホンはともかくX PLATEの電波の掴みが最悪で、なにしろ自宅の隣にPHSのアンテナがあるにも関わらず、アンテナが一本しか立たない時があったりする。という訳で、縛りも解けたことだしさっさと買い換えたいと思っているところ。

折りたたみは嫌いなのと、X PLATEは結構電池が持って小さいということから、WX330J E, HONEY BEE 4, LIBERIO, Sweetia辺りが候補になるか。W-ZERO3[es]を使う前はJRC使いだったのでここはWX330J Eを選ぼうかと思いつつ、京セラのも気になるところ。

どこかで実機に触れれば良いのだけど、触りにいく暇があるかどうか。前の仕事場だったら昼休みに近くのショップへ行けば良かったんだけど、今後はノジマに頼るしかなさそうだし。58.70kg(04:50)