2011年11月24日木曜日

恐るべき蚋

いま、両足首が非常に腫れて痛い。歩くのも億劫だ。
犯人は「蚋(ぶよ)」。昨日、かねてより気になっていた庭の芝刈りをしたのだけれど、もうこんなに寒いから蚋は出ないと思っていたが甘かった!
もちろん長袖・長ズボン(ジーンズ)で作業していたのだけれど、裾の隙間を狙って咬んでいたようだ。
蚋に特有の症状で、昨日はちょっと痒いな~、くらいだったのが、今は座っていても足首がズキズキ痛むし、目で見ても明らかに腫れている。
歩けないくらいになったら困るな~。寒くなっても侮る無かれ!「蚋」

2011年11月16日水曜日

GCCでCortex-M3開発

やっぱり学習能力がないなぁ>私、orz

この問題は1年半くらい前に引っかかったはずなのに、また今回ハマった!

「GCCでCortex-M3用のコードをはき出させるとHardHalutになる件」

結論から言うと、binutilsのリンカがthumb命令のBLインストラクションをBLXに変換してしまうのが原因。Cortex-M3はthumb2命令に対応してるとはいえ、オフセット値を引数に取るBLX命令はサポートしていないんだよなぁ。GCCやLDで-mcpu=cortex-m3 -mthumbを指定しているにもかかわらず、この変換をしてしまう場合がある。で、(再び)いろいろ調べてみた・・・

時間をかけて調べるといろいろと勉強になる。特に今回はリンカは結構いろんなことをやっていることを実感した。
関数呼び出しなど分岐が発生する部分でGCCがはき出すコードはBL (-1)という命令だけ。その-1のところはLDが各関数のロケーションが決定した段階で適宜埋める、という仕掛け。これは、普通に想像できる範囲でした。
ARMの場合ややこしいのは、ARMモードとTHUMBモードの切り替えが存在するということ。LDはそのモード切替が必要と判断したら、GCCがはき出したBL (-1)の部分をスタブへのブランチ命令に書き換えて、そのブランチ先のスタブでARM<-->THUMBモードの切り替えと、目的の関数へのブランチを行うようになっている。更にBL命令ではPC相対で前後2^24ビットまでの範囲でしかジャンプできないから、もしその範囲を超えるBL命令であった場合もいったんスタブへブランチさせて、その中でBL Rn命令を使って任意のアドレスにジャンプできるようなコードをLD自体が生成する。ELFファイルに含まれるアドレスのアトリビュートはもっとたくさん種類があるのだけれど、おおざっぱに言って、そういうことをやっているようだった。

さて、今回のポイントはCortex-M3でリンクするときにBL命令を勝手にBLX命令に変更させないようにすることだ。調べてみると、binutilsのbfd/elf32-arm.cにusing_thumb_only()という便利そうな関数が用意されている。この関数がTRUEを返すときはCortex-M3用だと(勝手に)思い込ませて、BL->BLX変換やTHUMB->ARMモードへの移行を起こさせないようにパッチを当てる。ついでに、THUMB<-->ARMへ移行するようなスタブの生成も抑制する。

という訳で作ったパッチがこれ。ちょっと強引かな~。Cortex-M3専用ということでご勘弁を。


--- binutils-2.21.1/bfd/elf32-arm.c 2011-05-11 16:29:12.000000000 +0900
+++ binutils-2.21.1patch/bfd/elf32-arm.c 2011-11-16 17:58:46.718879900 +0900
@@ -3138,7 +3138,12 @@
   || (r_type == R_ARM_THM_JUMP24))
       && !use_plt))
  {
-  if (st_type == STT_ARM_TFUNC)
+ if (thumb_only) {
+ stub_type = 
+ (THM_MAX_BWD_BRANCH_OFFSET <= branch_offset && branch_offset <= THM_MAX_FWD_BRANCH_OFFSET) ? 
+ arm_stub_none : arm_stub_long_branch_thumb_only;
+ }
+ else if (st_type == STT_ARM_TFUNC)
     {
       /* Thumb to thumb.  */
       if (!thumb_only)
@@ -7556,7 +7561,8 @@
        the PLT do not require stubs.  */
     if (sym_flags != STT_ARM_TFUNC && sym_flags != STT_SECTION
  && (h == NULL || splt == NULL
-    || h->plt.offset == (bfd_vma) -1))
+    || h->plt.offset == (bfd_vma) -1)
+ && !using_thumb_only(globals))
       {
  if (globals->use_blx && r_type == R_ARM_THM_CALL)
   {

日本の好きなところ

先日コンビニで買い物をしたとき、うっかり飲み物を持って帰るのを忘れてしまったことがある。レジでお金を払った後、何も考えずにそこにある商品の入った袋を持って出る、というルーチンワークになっている人が多いと思うけど、そのとき店員がお茶を袋に入れてくれていなかったようだ。
これに気がついたものの後の祭り。高速道路上のコンビニだったので、気づいたときはもうSAから出ていたし、それに高速も出ていたのもう戻れない。損した!

数日後、同じコンビニに行ったとき、ダメもとで「先週買い物したときお茶を忘れたんですが・・・」と言ってみた。すると、お茶の商品名をきいた店員はそそくさとその商品を取りに行って、それを袋に入れてくれた。よかった、損をせずに済んだ。
でも一瞬思った。確かに持って帰るのを忘れた私が悪いんだけども、こういうときは「申し訳ありません。直ぐに代わりの商品を用意します」というお詫びがあるのが普通だと一瞬は思ったけど、ちょっと待てよ、中国はもちろん、アメリカやヨーロッパなんかでも「そんなの忘れる方が悪いんだ!知るかっ!」と突っぱねられて当然だよな。それを何も言わずに代わりの商品を用意してくれただけで、それはグローバルな目線で見たら非常にありがたいことなんじゃないか、と思った。
日本という国のそういうところが、好きだな~。

閑話休題。

週末に家族で温泉旅行に行こうと計画し、旅館も予約していた。しかし、子供が急に病気になって週末までに直りそうもないので、泣く泣くキャンセルすることに。旅館に電話すると、非常に事務的な感じで「3日前ですからキャンセル料が20%かかります」と言われてしまった。何もサービスを受けていないのにお金を取られるなんてクヤシーッ!!
確かに予約するときにはキャンセル料がかかることは承知している。それがルールだ。でもだからと言って、「キャンセルしたらキャンセル料がかかることはメールに書いてましたよね?」と後ろ盾を持って事務的な言われ方をされたら、やっぱり気分は良くない。当日や前日夜にキャンセルしたのなら料理の仕入れや空いた部屋の損失のことを考えるとキャンセル料も致し方ないと思いますが、まだ3日ある。他のお客さんが入る可能性も高いと思うんだけどな。
プランがなかなか良さそうだったので子供の体調が戻ったら今度こそ同じ旅館で・・・と思っていたけど、いくらこちらがキャンセル料が発生することを承知していたとはいえ、こういう対応ではどうも後味が悪くて、もうその旅館を使うことはないだろう。そういう意味ではこの対応は旅館としては良かったのかどうかと思うところ。
こういうところでちょっとした気遣いができるのが「旅館」というカテゴリに属する施設の暖かいところ
であり、そして日本的で好きなところだったのに、ちょっと残念だな~。

(それにしても、約10000円をただドブに捨てるのはイタイ・・・)

2011年11月4日金曜日

オイル交換で・・・

私は日産のクルマに乗っているんですが、引っ越し先のディーラーとも接点を持っておきたいと思って、半年くらい前にオイル交換を目的に初めてディーラーを訪れたときのこと。

その店は、「○○日産自動車販売」という販社で各都道府県毎にあるような大手のディーラーだった。オイル交換の金額を尋ねると、正確な価格はうろ覚えだけれど8000円いくらかと言われたので高いなーと思った記憶がある。そして矢継ぎ早に、「メンテナンスパックプロに入ってはどうですか?」と訊かれた。メンテナンスパックプロ12だと、2回のオイル交換と半年+6ヶ月点検がついて18900円だから、オイル交換2回分+チョイ足しで2回の点検がついてくる、と聞いて、なるほどお得だなとそのときは思ったので、つい加入してしまった。というか、引越後は通勤で毎日乗るし、走行距離も半端じゃないのでディーラーで診てもらえば安心だな、とも考えていたので、メンテパックプロに加入したこと自体はそれなりに納得している。

そして12ヶ月点検をしてもらうと、ブレーキパッドが残り3mmくらいになっている、と言われた。確かにこのクルマに乗り出してから一度も替えてないので少なくなっていること自体は予想通りなんだけど、ディーラーのセールスもメカニックも「ブレーキパッド替えた方がいいよ~。あといくらもつか分かんないよ~」という間接的なプレッシャーをかけてくる。パッド交換となると更に4万円くらいかかるみたいだし、まあもともと10mmくらいのものが残り3mmもあるならまだまだ乗れると思うので、そのときは丁重にお断りした。

さて、それから半年くらい経ったとき、もうメンテナンスパックのオイル交換チケットは無くなったので、次のオイル交換はどうしようかと。何せ、うろ覚えながらそのディーラーでは8000円いくらだと言われたので、いくら何でもそれは高いんじゃないかと。実際、引越前にいった「日産プリンス○○販売」という別系統のディーラーでは3400円でオイル交換してくれた。この金額差は何なんだ!?
幸い、引っ越し先にも日産プリンス系のディーラーがあるので、電話して確認してみるとオイル交換は3400円だか4900円だかでやってくれるとか。う~ん、前のディーラーではうまく口車に乗せられたのかな~、という疑念がフツフツと沸いてくる。というわけで、今回はちょっとディーラーを代えてオイル交換してみようかと。
確かにこちらのディーラーでは3400円でオイル交換してくれた。カー用品店なんかではもっと安くやってくれるのは知っているけれど、安心感が欲しいので3400円なら納得の範囲だ。ついでに6ヶ月点検もやってもらった。すると、ブレーキパッドの残りは3~4mmくらいだと言われた。んっ?半年前よりもブレーキパッドが増えている!そんなバカな。
ここでもやはり、以前のディーラーには担がれたかな~、という不信感が。しかも、今度のディーラーはこれくらいならあと半年はもつんじゃないかな?的な感じで、「パッドを替えろ~、替えろよ~」というオーラがまるで無い。単に無責任なのか、それとも良心的なのかは分かりませんが、私的にはこの新しいディーラの方がやりやすいかなぁ。パッドの交換時期はある程度は異音で判断できるし、やはり高いものなのでできれば危険が及ばない範囲でできるだけ長く使いたいし。

というわけで、○○日産自動車販売さんとはバイバイして、これからは日産プリンスさんのお世話になろうかな~。

2011年11月1日火曜日

REX-USB60用ドライバ

これを書いているノートPC(Let's note S9)にはシリアルポートがついていません。というか、いまどきシリアルポートがついているPCの方が少なくなってしまったのではないか?と思えるくらいです。特にノートPCでは。人によっては“シリアルポートってなぁに?”という声すら聞こえてきそうですが、やはり組み込みをやってる人種としてはいくら通信速度が遅いといえども捨てがたいインターフェースなのです。

で、USB-シリアル変換器の出番。

今ではあまり気にする必要はないのかもしれませんが、その昔(と言っても数年前ですが)はとりあえず動くもののちょっと動作がおかしかったり、シリアル接続モデム以外の用途で使うと動かないUSB-シリアル変換器がありましたので、そのメーカと品番選定には注意していたものです。そのなかでも、なかなかマジメな作りと安定した品質で好きだったメーカはRATOCシステムさんで、USB-シリアル変換器もREX-USB60というモデルを愛用していました。
しかし、ノートPCをLet's note W2からS9に新調したときにOSがXPからWin7 x64に変えてしまったので、このREX-USB60が使えないという事態が発生していました。どうもRATOCさんは後継モデルのREX-USB60F(おそらくFTDIの石を使っていると思われる)に移行してしまったようで、旧版のF無しREX-USB60用のx64対応ドライバは用意してくれそうになく、この変換器はほとんど死蔵状態でした。

しかし、ひょんなことからblogとかの情報で「REX-USB60はPL2303というチップを使っているらしいので、そのPL2303用のドライバを使い回せる」ということを聞き、さっそくProlificのHPからダウンロードしてinfファイルを書き換えて試してみるも撃沈!infとドライバは読み込んでくれるものの、「ドライバを開始できません(エラー10)」というエラーでドライバが開始されないということになってしまった。HPの情報から総合して考えると、おそらくProlificとは異なるVID/PIDに書き換えられたサードパーティのUSB-シリアル変換器では同じPL2303チップを使っていてもドライバが撥ねてしまうように作っているのだろう。なんて意地悪な・・・。

更に調べてみると、ATENというメーカのUSB-シリアル変換器UC-232AもこのPL2303を使っているらしく、更にすばらしいことに自社で専用ドライバを用意していて、infを書き換えればこれが利用できるというのだ。で、やってみると・・・

なるほど、Win7 x64でもちゃんとドライバが読み込まれた。ありがたいですね~。

ちなみにinfファイル変更のポイントは・・・

[PRO.NT]セクションに“%DeviceDesc% = ComPort, USB\VID_0584&PID_B000”を、

[PRO.NTAMD64]セクションに“%DeviceDesc% = ComPort, USB\VID_0584&PID_B000”を付け加えるだけ。
本当にありがたい。