2018-01-01から1年間の記事一覧

Rustでプラットフォーム依存の処理を書く

#[cfg(...)] Attribute Rustでは #[cfg(...)] アトリビュートを使うことによって、OSやCPUに応じた条件コンパイルを行うことができる。 Conditional Compilation cfgは複数条件指定可能(OR, AND, NOT) #[cfg(any(unix, windows))] #[cfg(all(unix, target_…

RustのRange指定

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に使われる ... …

Linux kernel moduleビルドのメモ

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-${…

Rust: Xargoとarm-binutils無しでCortex-Mターゲットのファームウェアをビルドする

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の構造体のメモリレイアウトについてのメモ。 Rustで次のような構造体を定義したときに、構造体のメモリレイアウトはどうなるか? struct Layout { b1: u8, s1: u16, b2: u8, w1: u32, b3: u8, w2: u32, s2: u16, s3: u16, } 検証時のRustのバージョンは…

RustでのIOストリーム処理

Go言語のio.Reader, io.Writer interfaceを使ったio.Cooyのような処理をRustで行うためには、std::io::Read traitとstd::io::Write traitを使って各ストリームを扱えばいい。 標準入力から標準出力へデータをコピーするサンプルコードを次に書く。 copy関数…

Cortex-MターゲットをOpenOCD + GDBでデバッグする(gdb-dashboard or VSCode)

OpenOCDとGDBを使ったarmのCortex-Mターゲットのデバッグ方法についてまとめておく。 個人的に、CUIベースでのデバッグにはgdb-dashboard、GUIベースでのデバッグにはVSCodeを使うのが好みなため、この2つのUIを介してデバッグする方法についてそれぞれ書く…

systemd環境でのコアダンプ解析

systemd環境下においては、従来(systemd無しの環境)のコアダンプ解析とは勝手が違ってくる。 コアダンプを有効にする ulimitコマンドでcore file sizeが0になっていないことを確認する。 $ ulimit -a -t: cpu time (seconds) unlimited -f: file size (blo…