パスワードを忘れた? アカウント作成
13004663 journal
日記

ttの日記: オレオレビットフィールドを作る 4

日記 by tt

人生初のAdvent Calendarをしてみんとしてなんとなく久々に日記など。
C言語 Advent Calendar 2016 の6日目、らしい。

Cの世界にはビットフィールドというのがある。もともとハードウェアレジスタを操作するために作られたと思われるが、今やメモリ削減のために使われている感がある(ex. webkit)。
どうしてこうなったか…というとまあ規格上いろいろと自由度と不自由度がありすぎて、エンディアンとかintの大きさとかによって「実際の」ビットの位置がずれてしまい、移植性のあるコードを書くのがめんどくさいからである。
ハードウェアを触るなんてマシン固有だからどーでもいいじゃん、というのはあるんだが、x86でもx86-64でも動いてほしいとか、ARM BEとARM LEで~とか、いろいろあるのである。

前振りが長くなった。さて本題。

ビットフィールド使えないとなるとレジスタ操作系のコードはこういうのになる
  int reg = MMIO_REG_READ(COMMON_REG_ADDR);
  int busy = (((reg >> STATUS_BIT_POS) & STATUS_BIT_LEN) == STATUS_BUSY);
わかりやすい。というか超べたべただ。

マクロなりなんなりで
  int busy = (extract(reg, STATUS_BIT_POS, STATUS_BIT_LEN) == STATUS_BUSY);
なんて書くのも可能だし、マクロの定義を適度にいじってintのサイズ違いに対処とかもできそうだ。

と、ここまではよく見るんだけど、最近
  extract(reg, STATUS_BIT_POS : STATUS_BIT_LEN)
みたいな書き方があるのを知った。

どーやってるんだろうとおもったら、こういう感じらしい
  # define GETPOS(field) (0 ? field)
  # define GETLEN(field) (1 ? field)
  # extract(reg, field) (((reg)>>GETPOS(field))&((1uGETLEN(field)-1))
そう、三項演算子を使うらしい。

で、これの利点だけど…ハードウェアの仕様書とかではビットフィールドの記述に「:」を使うのは多いため、見た目がわかりやすい、ということ以外にあんまり思い浮かばなかった(笑)。C++はともかく、Cでは三項演算子やラベル名以外で:を使うというのはあんまりないので、他より目立たせることができる、というのもあるだろうか。

あんまり意味がないけど、まあ、面白いのでご紹介、ということで。

6930933 journal
日記

ttの日記: アレもう2012年が終わる… 1

日記 by tt

見事に今年はオンライン上の活動が止まってしまった…隙間時間にtwitterかfacebookするぐらいだけになってしまった。

今年買ったものを思い出す。Eマウント(NEX)のレンズ二本、パナの電子レンジ、スマフォ(XperiaSX)、タブレット(MediasN06D)、…ぐらい?余りモノは買わなかったなあ。

おっとWLAN APも更新してた。あと自分用ではなく母へのプレゼントとしてVAIOとCybershotを購入した。まあ自分が使うものじゃなくても、ちょっとさわってるとやっぱり最新機種はどんどん良くなってるのがわかって新しいのが欲しくなるねえ。

サービスだとCATVのコースを変更してチャネルが増えたのと、VPSを契約したことか。が、VPS全然使えてない・・・

身につけた技術としては近年の最適化技術だったりgccの構造をより深く理解したとかARMプロセッサに詳しくなったとかインターコネクトやマルチプロセッサ環境を学んだとかか。llvmとかwebkitとかjavascriptの知識は進まなかった。ダメダメ…。勉強会で発表するとかいった活動ももう少しやったほうがよさそうである。

失ったのは明らかに体力だな。特に年末の肩こりのひどさは絶望的だった。肩こりで医者に行くのはかなり久々である。

思い切った行動にも出られず、かといってこのままではジリ貧、的な状態で縮小均衡というどうにも手詰まり感が増えた一年であった。来年はこの辺りを改善したいものだけれども、さてどうなるか。

1116209 journal
日記

ttの日記: フライング2011まとめ

日記 by tt

今年のまとめ。まだ今年は数日残ってますが…残りの分で何かあれば追記する方向で。

1月:
記憶が無い。たしか新しいお仕事PC購入手続きをしたような。
伏見稲荷に初詣して鳥居を見つつfirefox充となる。

2月:
虫垂炎で入院。物心ついてはじめての入院。
同室のおじーちゃんの愚痴を聞かされたりして死生観が少し変わる。
妹と嫁に感謝する。

3月:
じしん。科学と技術の限界に絶望する。
ペジテのアスベルが破壊された故郷を見て感じた気分か。
チケットが奇跡的に取れたけどフィギュアスケートの世界選手権は延期に。

4月:
記憶が無い…電気は無いけど仕事は容赦ないので猛烈に働く。
戦闘モード突入的な。相当働いたのは確実

5月:
GWはアイスショーに行ったり数日帰省した位でほぼ全部働く感じ。
quad二種類を飛ぶ羽生君に感動する。
合間を縫って日比谷のオクトーバーフェストに参加する。高いけどうまいね。

6月:
親知らずを抜いたような気がする。
祖母がなくなる。数えで99歳。祖母・祖父の代は全員亡くなってしまった。
実家のリフォーム結果が大胆すぎてびびる。

7月:
相方誕生日を祝って今年は銀座マキシムに行って見る。
仕事では色々と殺意を覚えた様な気がするが忘れた事にする。

8月:
夏本番。全社休業日なんて無視して普通に働く。でも暑い…
新しいエアコンのパワーに感動する。

9月:
お仕事のめどがやっと立った気がする。というか色々延期する事になる。
センリャクテキテッタイ

10月:
祖父の25回忌で25年ぶりに博多のお墓参りに。博多駅がかっこよくなりすぎててびびる。
あわせて家族旅行にいく。温泉ええですなあ。高千穂かっこよす。

11月:
中学・高校の同窓会に参加。あと妹の結婚式でハワイへ。
予想通りのところが予想通りの流れになっているが今更どうしようもなく、
逆にもう少し先を見込んでの作業を優先する事にする。

12月:
月蝕見た。
一つ目のゴール到達。早めに仕事納めして全日本フィギュア見てまったりすごす。
37歳になった。

*買ったもの
(住んでる物件の付属品だけど)エアコンが新しくなった
ASUS E35Pro(AMD E350搭載マザーボード)ほか自作PC一式
三菱の空気乾燥機
USBビデオキャプチャ(イマイチ使えてない)
Panasonicのマッサージソファ
NEX-5Nボディとレンズ3本(標準セットの2本とマクロレンズを1本)
フィリップスの電気剃刀
PSVitaと付属品いくつか

*入ったサービス
facebook:仮登録したアカウントがあったような気がしたが行方不明なんで登録しなおし
atnd.org:x86opti参加のため
ANAカード:なんか飛行機に何度も乗る事になったので

*雑感
忙しすぎた。無力感を感じること多数。
数年に一度のイベントなので仕方ないが、よく働いたせいで環境に飽きてきた。
まあスポーツ選手におけるオリンピックイヤーのような感じか。
gccとかをいじる環境に戻ったのは良かったのかな。
メインがMIPSからARMに移ったけどMIPSも大量なまま。x86も増殖中。
PPCは相変わらず少ない。マルチコア度が急激にアップ。
一度もLAMEのコードを見なかった…。
ラジオ・テレビを視聴する時間が本気でなくなりつつある。
rubyは結局今年も余り使わず。

*反省点
仕事しすぎて体がぼろぼろ。人間ドックで「要検査」がたくさんありすぎる。
サーバを放置しすぎ。そろそろVPSとかに移動すべき。
細切れの時間でtwitterしすぎ。明示的に休憩するべき。
英会話学校に行く予定が地震と仕事の忙しさで潰れたというのは言い訳だ。
せっかく買ったペーパーバックをまた読まなかった。
仕様書とMLの英語しか読まないのはまずいと思う。

*来年の予定
各種医療控除と寄付と雑収入の対応のための生まれて初の確定申告
精密検査のために病院に行く。たぶん検査入院が必要と思われ…
母のPCを買い換える。
妹にプレゼントを買う。

*来年の目標
英語を何とかする
基本に立ち返ってちゃんと仕様書を理解する
環境の変化を自分から起こす
もう少し運動する。とりあえずスキーとスケートとサイクリング、かなあ。
増えすぎたクレジットカードを整理する
電池の持ちがだいぶ悪化した携帯電話をどうにかする

890275 journal
日記

ttの日記: Thumb2パズル 15

日記 by tt

新UIになって今まで以上におっくうになってたんだけど、余りにも日記を書かないとなんなので…
今苦しんでるパズルのヒントを/.Jの皆様に求めてみたりします。

今をときめくARMアーキテクチャのThumb2モードでは、即値アドレッシングの演算系命令で使える値がかなり限られます(ちなみにARMモードだともっと制限が厳しい)。具体的には以下のどれか。

  1. 8bit値をnビット左シフトしたもの(nは0以上24以下の整数)
  2. 8bit値を0x00010001倍したもの
  3. 8bit値を0x01000100倍したもの
  4. 8bit値を0x01010101倍したもの

加減算に限っては任意の12bit値を使う専用命令があったり、同じ値を加算と減算とか、ビット反転した命令でも使えるので、実質もう少し他の値も使えるのだけれど、まあ基本はこれ。

一方、定数代入はレジスタの上位・下位16bitを設定する命令があるので、2命令の組み合わせで任意の32bit値を設定できます。

ということで、例えば x+0x12345678 みたいな事をしたい場合、

  1. 2命令かけてワーク用のスクラッチレジスタyに0x12345678を代入し、xに足す(3命令)
  2. 何とかして0x12345678を上の定数パターンに分割してがんばる

のどちらかになります。

で、後者の「何とかして」が問題になる。

答えを先に書くと
    0x12345678 = 0x12001200(0x12*0x01000100) + 0x00344000(0xD1*0x4000) + 0x00000478(0x8F*8)
というふうに分割できるので、加算命令3つでx+0x12345678を実現できます。
前者に比べると命令数(=サイクル数)は同じだけど、こちらの方がスクラッチレジスタなしで済む分有利になります。

問題はこういう分割を求めるのが泣きそうに難しいところ。
8ビットずつ4つに分割すれば、つまり0x12345678=0x12000000+0x00340000+0x00005600+0x00000078とすれば確実に再現できるので、4分割すれば絶対に実現できるのは明確。2分割で作れるかどうか、も割と容易に分かる。なのだけど、3分割で作る方法があるかどうかを調べるのが非常に難しい。
現時点で私はブルートフォースで計算する以外の方法が思いつかないでいます。前述の例である0x12345678も総当りで出しました。

ちなみに現状のgccは割とすぐにあきらめて「ワーク用レジスタ使う」になります。
が、時々なぜか0x12000000+0x00340000+0x00005600+0x00000078になることも。ヒドス。

ということで、いい方法思いついた人居たら教えてください。
2分割のときは0x00010001の剰余系で考えると、ってので簡単に実現できたんだけど、3分割だと色々考えたんだけど全然ダメでした。
こういうのに関係する数学の分野名とかあったらそれでもいいです。

更新:20:15コメントにあった疑問を追記しました。

329033 journal

ttの日記: E350 + debian squeeze amd64日記まだまだはまる編 3

日記 by tt
久々にはまりまくりだなあ…

powertopコマンドで何かヒント出るかな、とためしに実行したら「USBの電力管理を有効に出来るよ」といわれたのでやってみた。結果…CPUコアの一つのbusy率が100%なった。ぉぃ…戻らないんでリブートすることに。

やっぱなんかおかしいなあということで、ためしにbackportsサービスを使ってカーネルを2.6.38にしてみた。結果…画面が出なくなった(汗)。radeon DRMが中途半端にE350対応になったため、のようだ。起動直後は画面も出ているのだが、画面モード変更以降で砂嵐的な画像しか出なくなる。確認したのはDVI出力時の画面表示のみなので、VGAとかは生きてるのかもしれないが…

一応ネットワーク越しに使うことは出来るのでそちら経由で見てみると、k10tempモジュールでCPU内蔵の温度センサが見えるようになってたりして進歩しているようではある。が、powertopコマンド実行したらセグメンテーションフォールトになるとか色々と謎も残る。

あと、別のマシンに同じOSを入れてsensorsコマンド実行したら、特にパッチとか当ててない奴でも普通に見えた。アレ、なんで…

USB Videoキャプチャは解像度変更他のコマンドもそれっぽくうてるようになった(少なくともエラーは出なくなった)けど、まだ画像を取ろうとすると全く取れないか、カーネルを巻き込んで落ちるかのどちらか。先は長い。コンソールに出るダンプを見ると、NULL踏んで落ちてるんで、E350他で起きるというUSB周りのハードウェアエラッタっぽいのだが…2.6.38で直っているのかどうかとかも確認してみるとしよう。

久々に色々遊べているが…仕事だったら泣きそうだな(笑)

326777 journal

ttの日記: PC-SDVD/U2G を解析してみるなど(3)

日記 by tt
キャプチャ開始とかキャプチャ条件(解像度など)を設定する部分を解析しようとするが、USBSnoopyだとどーゆーわけか映像データの転送が始まるとキャプチャが止まってしまう(アイソクロナス転送が始まるとそこでとまるみたい)。いろいろいじるがどうしようもないので再度ぐぐってみつけたUSBSniffというのを使ってUSBパケットのログを取ることに。WinXPでしか動かん、と書いてあるけど、手元ではWin7 64bitでも動いたので、マシンパワーも余裕のあるVAIO-Zでキャプチャするようにした。ログがテキスト形式になるのは見やすいけどサイズがでかくなってちょっぴり大変。さすがのVAIOZでもパケットキャプチャしつつ映像キャプチャすると派手に処理落ちしてコマ落ち・音途切ればりばりに。まあコマンド自体はキャプチャできたんでいいや。ログ保存・解析はGbEとSSDに溢れる環境ならそれなりに快適。

ということで無事(?)、キャプチャ開始回りや解像度、映像設定(色合・コントラストetc)周りの設定コマンドの確認も出来た。解像度設定コマンドの法則性が良く分からんが、使いそうな一通りのパターンでのコマンド列をゲットしたのでまあテーブルでいいや。

てなわけで、あとは動かしてみるだけというところまできた。さてさてどうなるやら。 なおこの処理の最中にオリジナルであるSTK11xドライバのバグっぽいのを見つけた。hue/saturationの設定部分でコメントとコードが一致してない。 まああとでメールするかね。

323880 journal

ttの日記: PC-SDVD/U2G を解析してみるなど(2) 2

日記 by tt
USB Snoopyのパケットダンプをまねすることで、とりあえず初期化部分と思しきところまでWindowsのドライバと同じことができるようになった…と思う。 ごまかしだけど、

[  285.571863] stk11xx: Melco - STK-1150 based device found. Product ID 0x0195.
[  285.571872] stk11xx: Release: 0005
[  285.571877] stk11xx: Number of interfaces : 3
[  285.572632] stk11xx: Initialize USB2.0 Syntek Capture device
[  286.134664] stk11xx: Syntek USB2.0 Capture device is ready
[  286.134874] stk11xx: Syntek USB2.0 Camera is now controlling video device /dev/video0
[  286.134957] usbcore: registered new interface driver usb_stk11xx_driver
[  286.134967] stk11xx: v2.2.0 : Syntek USB Video Camera

とdmesgに出るところまでは来た。まあ映像はおろか、まだ一枚も画像取れてませんが。というか、映像キャプチャスタートコマンドとかを打った時に通るcamera_init()関数とかは全く変更してないし、そもそもその辺りのパケットダンプは取得すら出来てない(汗)ので、たぶんキャプチャ使用とした瞬間に落ちそうな気がする。まあ先は長いけどまだまだ楽しめそうということで前向きに捉えておく。

323651 journal

ttの日記: emacs23 on debian squeeze

日記 by tt
ええっとおごちゃんに怒られそうですがいまだにemacs生活なので…

いままでemacs21でずっと粘ってきたんだが、時代の波には逆らえず23を使うことに。っていうかパッケージ自分で作ってまで頑張る元気は無いので… なのだが色々はまる。

Wnn6が使えない

emacsというより64bit環境に移動したことによる問題だが、これはあきらめる。最近はどうせWindowsからteraterm経由で使うことの方が多いのでLinuxの日本語入力機能はあきらめる。よってeggとかそのへんもさくっとあきらめる。ついでなんでquailなんて使えねーやつが立ち上がらないように

(global-set-key "\C-\\" 'nil) ; kill quail !

して、かわりにWindowsマシンでC-\でMS-IMEが立ち上がるようにしておく。 まあこれはいい。

migemoで後方検索するとエラーが出る

既知の問題らしい。2006年のパッチをあてればOk.

日本語メールが一部文字化け

既知の問題らしい。2008年のパッチをあてればOk.

ちゃんとパッケージャに伝えたほうが良いのかな。まあとりあえずはこれで。

typodupeerror

Stableって古いって意味だっけ? -- Debian初級

読み込み中...