ThinkPad X220に標準で搭載されている無線LANカードとBluetoothドーターカードでは、IEEE 802.11a/b/g/n、Bluetooth 2.0までしかサポートされていない。 そこで、これらをIntel 9260NGWに換装し、IEEE 802.11a/b/g/n/ac + Bluetooth 5に対応させる。 購入し…
X220/X230 FHD mod kit (rev.6)を使って、ThinkPad X220のディスプレイをFull HDディスプレイに換装する。 ディスプレイの分解までは、LenovoのThinkPad X220 ハードウェア保守マニュアルに則って分解する。 X220 FHD mod kitの実装手順については、FHD mod …
ThinkPad X220のマザーボードを換装して、Core i5-2520MからCore i7-2640Mにアップグレードする。 LenovoのThinkPad X220 ハードウェア保守マニュアルに則って分解する。 購入した商品 商品 価格 ThinkPad motherboard core i7-2640M $56.66 ドイツ Thermal …
ThinkPad X220のキーボードが好きだ。 ThinkPad A285を買ったが、やはりX220のキーボードを打ちたくなる。 ただX220は今となっては、解像度は低いし、802.11 acやBluetooth 4以降に対応していないし、手元にあるCore i5モデルだとUSB3.0もついてないし、そし…
BIOSの更新プログラムや、CPUのファームウェアの更新プログラムはWindowsしかサポートしていないものが多い。 PC環境がLinuxしかない場合、以下のような記事に従い、isoをUSBに書き込むことでBIOSのアップデートができる。 How to update Lenovo BIOS from L…
この記事ではRustのビルドシステムであるCargoを使って、Cのコードをビルドし、それをRustのコードから呼び出す方法について紹介します。 ※記事作成時のRustのバージョンはrustc 1.33.0です。 この記事で取り扱うRustの知識とクレートは次の通りです。 build…
電子回路のシミュレーションツールを探していたところ、ブラウザ上で動的にシミュレートするサービス CircuitJS1 を見つけました。 Circuit Simulator Applet ちょうどQucsという他の電子回路シミュレータを触り始めたところだったのですが、Qucsでは回路に…
#[cfg(...)] Attribute Rustでは #[cfg(...)] アトリビュートを使うことによって、OSやCPUに応じた条件コンパイルを行うことができる。 Conditional Compilation cfgは複数条件指定可能(OR, AND, NOT) #[cfg(any(unix, windows))] #[cfg(all(unix, target_…
RustのRange .. は[start..end)の半開区間だが、 ..= を使うことで、[start..=end]の閉区間にすることができる。 for i in 0..5 { print!("{},", i); } // => 0,1,2,3,4 for i in 0..=5 { print!("{},", i); } // => 0,1,2,3,4,5 また、matchに使われる ... …
ArchLinux(4.17.10)上でのkernel moduleビルドを試したメモ。 Linux kernelのソースコードを入手する prepare_kernel_source.sh #!/usr/bin/env sh set -eu KERNEL_VERSION=`uname -r | sed -r 's/([0-9]+\.[0-9]+\.[0-9]+).*$/\1/'` LINUX_VERSION=linux-${…
2018年4月、Rustでの組み込みプログラミング環境に2つの大きなニュースが舞い込んできた。 Xargo と arm-none-eabi-lld 無しでCortex-M向けのビルドが可能に PSA: You no longer need Xargo to do ARM Cortex-M development#rustlanghttps://t.co/C6VhbyM0t…
Rustの構造体のメモリレイアウトについてのメモ。 Rustで次のような構造体を定義したときに、構造体のメモリレイアウトはどうなるか? struct Layout { b1: u8, s1: u16, b2: u8, w1: u32, b3: u8, w2: u32, s2: u16, s3: u16, } 検証時のRustのバージョンは…
Go言語のio.Reader, io.Writer interfaceを使ったio.Cooyのような処理をRustで行うためには、std::io::Read traitとstd::io::Write traitを使って各ストリームを扱えばいい。 標準入力から標準出力へデータをコピーするサンプルコードを次に書く。 copy関数…
OpenOCDとGDBを使ったarmのCortex-Mターゲットのデバッグ方法についてまとめておく。 個人的に、CUIベースでのデバッグにはgdb-dashboard、GUIベースでのデバッグにはVSCodeを使うのが好みなため、この2つのUIを介してデバッグする方法についてそれぞれ書く…
systemd環境下においては、従来(systemd無しの環境)のコアダンプ解析とは勝手が違ってくる。 コアダンプを有効にする ulimitコマンドでcore file sizeが0になっていないことを確認する。 $ ulimit -a -t: cpu time (seconds) unlimited -f: file size (blo…
OpenOCDを使ってSTM32F401 Nucleo-64にST-Link経由でFirmwareを書き込む。 OpenOCDとST-Linkドライバのインストール Arch Linuxなら以下のコマンドでインストールする。 $ pacman -S openocd stlink Firmwareを書き込む OpenOCDで指定できるinterface, targe…
x86_64-unknown-linux-gnuのホスト環境上で、CHIP向けのバイナリをRustでクロスコンパイルすることを目的とする。 概要 rustup target add ${target_triple} でターゲットのツールチェインを追加 ターゲットのリンカをインストール Cargoのconfigファイルに…
Rustのクロスコンパイル環境構築の検証にDockerを使い始めた。 開発環境を構築する際、最初は試行錯誤しながら行なうため、さぁ環境が構築ができた、となった時に行なってきた手順のどれが最低限必要なものだったのかがわからなくなることが多い。 必要だと…
Rustのコンパイラのソースコードの中で使用されていた"Triple"という言葉の意味がわからなかったので調べた。 Target Triplet - OSDev Wiki Target Triplets describe a platform on which code runs and are a core concept in the GNU build system. They …
書籍執筆支援システムRe:VIEWの環境構築のメモ。 依存パッケージのインストール Re:VIEWを使うために必要なパッケージをインストールする。 $ sudo pacman -S ruby ruby-rubyzip texlive-most texlive-langjapanese poppler-data dvipdfmxのフォントのエラー…
追記: 以下の記事にfunction! s:plug.is_installed(name)としてプラグインの存在確認方法が載っていました。 おい、NeoBundle もいいけど vim-plug 使えよ by @b4b4r07 on @Qiita 例として、プラグインの存在確認をするための関数を定義してみます。vim-plug…
ある値のn bit目からn+m bit目までを別の値で置き換えたい、という時がある。 例えば、以下のような値a,bがあったとして uint8_t a = 0b01010101; // 0x55 uint8_t b = 0b10101010; // 0xAA aの値の2〜4bit目をbの値で置き換えた値cを求めたい。 a,bが上記の…
組み込み開発の自動テスト化検討のためにUSBGPIO8とか買ってみようかと思ったけど、マニュアル読むと単にPCからUARTコマンド送ってGPIO制御するだけっぽい— ryochack (@ryochack) September 2, 2015 これならUARTがあるマイコンとUSBシリアル変換モジュール…
ctags使っていて、Cとアセンブラでお互いにタグジャンプできないのが不便だったので、やっつけでtagsファイルを書き換えるスクリプト書いた。 Gist: ryochack / ctags_ac.rb アセンブラからCの関数を呼ぶ時には、関数名の先頭に"_"がつく。 そのため、tagsフ…
2014.6.14追記 途中MakeContainer()/MakeContainerOneLine()がごちゃごちゃになっていたのを修正 golangでは、ヒープに置かれるデータの初期化方法によって内部の挙動が若干異なるみたい。 (環境はx86_64、go version 1.2.2) 違いが出たのは以下のコード。 …
Goではgoroutineを使うことで並行処理をとても簡単に実行できるが、複数goroutineとの同期が難しい。 そこで、複数走らせたgoroutineのメッセージを用いた同期方法について考えてみた。 以下のように、複数のチャネルからのメッセージを受信する必要がある時…
長いタイトル…。 こないだ書いたgorepっていう検索ツール、もうちょっと速くしたいなと思ってファイル読み込みの部分をmmap()で置き換える検討中。(ちょっぱやのagもmmap()を使っている) mmap()での高速化確認用にCとGoで簡単なコード書いて実験していたら、…
標準出力のディスクリプタを取得して、それが端末を参照しているかどうかを判定する。 使いどころは端末に出力する時と、ファイルにリダイレクト出力する時とで表示の仕方を変えたいとき。 例えば、以下のページの方法でターミナルの文字をカラーにできる。 …
ディレクトリ名やらファイル名やらGrep検索やらを一緒くたに正規表現で検索する"gorep"っていうツール書いた。 https://github.com/ryochack/gorep 以下のコマンドを打ち込むと、カレントディレクトリ以下から再帰的にgo..pにマッチするディレクトリ、ファイ…
パタヘネ本の7章(マルチコアとマルチプロセッサとクラスタ)に以下のような(ちょっと違うけど)図が載っていたので、Goの並行処理を使って100,000個の数の和を求めてみた。 最初の図とはちょっと違って、実際の制御はこんな感じ。 値が2つ揃ったら、加算を行う…