/home/tnishinaga/TechMEMO

日々行ったこと、面白かったことを書き留めます。

MacにPyOCDをインストールする方法について

先日mbed用のコンパイル環境を作る方法を解説した際、PyOCDのインストール方法については省略した。

その理由はPyOCDがLinuxWindowsにしか対応しておらず、Linux上でのインストールは特に問題なく行えたからだ。 しかし調べてみると、最近はPyOCDがMacでも動くようになっていた。

そこで早速Mac環境にインストールを試みたが、本家の説明だけではうまくいかなかったので、正しいインストール手順を備忘録として記す。

pipのインストール

PyOCDはpython2動作するので、python2の環境を揃える必要がある。 この環境を整えるため、まずはpipをインストールする。

$ sudo easy_install-2.7 pip

Cythonのインストール

PyOCDをMacで使用するために必要な cython-hidapi は、Cythonに依存しています。 そのため先にCythonをインストールする必要があります。

$ sudo pip install Cython

cython-hidapiのインストール

残りは一見、PyOCDのREADME通りのようにみえる。 しかしcython-hidapiのインストールスクリプトには setup-mac.py を選択する必要があるという罠がある。

$ brew install hidapi
$ git clone https://github.com/gbishop/cython-hidapi.git
$ cd cython-hidapi
$ sudo python2.7 setup-mac.py install

PyOCDのインストール

やるだけ

$ git clone https://github.com/mbedmicro/pyOCD
$ cd pyOCD/
$ sudo python setup.py install

TODO

公式リポジトリのREADMEにプルリクエストを投げる。

mbedのC++コードからCやアセンブラの関数を呼び出す

GCCを用いてC++のファイルからCやアセンブラで定義した関数が呼び出せない問題に引っかかったので、解決方法を記す。

解決方法

ヘッダなどでの関数定義に、以下のように "C" を入れるだけ。

extern "C" void hoge(void);

これだけでCやアセンブラの関数を呼び出すことができるようになる。

進捗

この問題の解決に3日かかりました。

Mac上にAVRマイコンの開発&書き込み環境を作った

AVRマイコンとはお手軽マイコン開発ツールArduinoに使われているマイコンである。

今回はATMEGA2560を用いる必要があったので、マイコン基板にはArduino MEGA2560を用いた。 書き込み器はAVRISP mk2を購入した。

開発環境の構築

基本的には、橋本商会さんの以下のページを参考に進める。

1つ異なる点として、書き込み用プログラムであるavrdudeのインストールにbrewを用いた。

$ brew install --with-libhid avrdude

AVRISP mk2とArduino MEGA 2560をつなぐ

まずArduino自体に電源を供給するため、ArduinoをUSBケーブルで接続する。

次に写真のように、ArduinoのICSPシルク側にmk2から出ているケーブルの出っ張りを合わせて差し込み、mk2をパソコンに接続すれば完了。

f:id:tnishinaga:20141028222353j:plain

HEXファイルを書き込む

AVRのコードはコンパイルするとHEXファイルができるので、これを書き込めば良い。

書き込みは以下のコマンドで行う。

$ avrdude -c avrispmkII -p atmega2560 -U flash:w:hoge.hex:i

-cは書き込みデバイス名、-pはターゲットマイコンを指定し、hoge.hexの部分を適宜変更すればいいらしい。

私の環境ではこれで書き込みが完了し、動作確認ができた。

進捗

だめです☆

mbedのオフラインコンパイル環境を作った

mbedとは、お手軽マイコン開発ツール群であるArduinoのARM版のようなものである。 オンラインのIDEを用い、mbedライブラリとユーザーの公開しているライブラリを用いてお手軽に開発を行うことができる。

しかし、デバッグはオンラインでは行えない。 デバッグを行いたい場合は、ソースコードのエクスポートを行い、オフライン環境でコンパイルし、オフラインのデバッガツールを用いて行わねばならない。

オフライン環境としては、MDK ARMというARM社謹製の開発ツールを使うのが一番である。 なぜなら、mbedのライブラリなどはすべてMDK ARMでコンパイルされているからだ。

しかしこのツールは1年で50万のライセンス料が必要で、個人は手の届かないシロモノであった。 しかたがないのでフリーなコンパイル環境(GCC)を用意することにした。

フリーな開発環境のインストール

mbedのオフラインコンパイル環境にはnewlib-nanoという標準Cライブラリが必要である。 そのため得意のcrosstool-ngを使った環境構築ができない。

代わりにこれらの問題を解消したツール群が公開されていたので、作者に感謝しつつ使うことにした。

インストール方法は以下のように、ソースをとってきたあと mac_install を実行し、パスを通すだけ。

$ mkdir -p ~/src && cd ~/src
$ git clone https://github.com/adamgreen/gcc4mbed
$ cd gcc4mbed
$ ./mac_install
$ echo 'export PATH=$PATH:~/src/gcc4mbed/gcc-arm-none-eabi/bin'

デバッグ方法(簡易説明)

PyOCDを用いる。インストール方法は省略。

mbedデバイスをつなげて test/gdb_server.py を起動するとgdbサーバーが立ち上がる。

$ python2.7 gdb_server.py

あとはarm-none-eabi-gdbを立ち上げて、リモート接続してデバッグする。

$ arm-none-eabi-gdb hoge.elf
(gdb) target remote localhost:3333

進捗

だめです。

Macでcrosstool-ng使ってARMの開発環境をつくろうと奮闘したが力尽きた話

背景

タイトルそのままなので省略。 なお、crosstool-ngのインストールにはhomebrewを用いた。

$ brew install crosstool-ng

crosstoo-ng version

$ brew info crosstool-ng
crosstool-ng: stable 1.19.0
http://crosstool-ng.org
/usr/local/Cellar/crosstool-ng/1.19.0 (1446 files, 12M) *
  Built from source
From: https://github.com/Homebrew/homebrew/blob/master/Library/Formula/crosstool-ng.rb
==> Dependencies
Build: autoconf ✔, automake ✔, libtool ✔, coreutils ✔
Required: wget ✔, gnu-sed ✔, gawk ✔, binutils ✔, libelf ✔
==> Caveats
You will need to install modern gcc compiler in order to use this tool.

進捗一覧

できたこととできなかったことの一覧

できたこと

  • case-sensitive問題の回避
  • gsed問題の解決
  • ggrep問題の解決

挫折したところ

  • static linkなバイナリの生成

進捗詳細

case-sensitive問題

crosstool-ng(以下ct-ng)はcase-sensitive――つまり大文字小文字区別できる環境でないとコンパイルさせてくれない。 Macはデフォルトではnon case-sensitiveファイルシステムになってるので、case-sensitiveファイルシステム環境を作って、その上でコンパイルすればこの問題を回避できる。

case-sensitiveファイルシステム環境を作る

Macのディスクユーティリティからcase-sensitiveなディスクイメージを作ってマウントして、その上で作業を行う。 詳しい手順は以下を参照。

あとはct-ngのconfigをいじって、ソースの保存先、バイナリの保存先をすべてこのディスクイメージ上で行うようにする。

gsed問題

ct-ngはGNU-sedを使うので、環境変数を設定してNon-GNUな環境ではgsedを用いるようになっている……のだけど、一部コードがこの環境変数を使ってないのでエラーとなる。 以下のコマンドで修正する。

$ chmod +w /usr/local/Cellar/crosstool-ng/1.19.0/lib/ct-ng.1.19.0/scripts/functions
$ sed -i -e "s/sed /${sed} /" /usr/local/Cellar/crosstool-ng/1.19.0/lib/ct-ng.1.19.0/scripts/functions

ggrep問題

基本的にはgsedと同じ。

$ brew install homebrew/dupes/grep
$ sed -i -e "s/grep/${grep} /" /usr/local/Cellar/crosstool-ng/1.19.0/lib/ct-ng.1.19.0/scripts/functions

ただしgrep環境変数がggrepを使うようになっていないので修正する。

$ cd /usr/local/Cellar/crosstool-ng/1.19.0/lib/ct-ng.1.19.0/
$ chmod +w paths.sh paths.mk

あとはこの2ファイルの環境変数

export grep=/usr/bin/grep

から

export grep=ggrep

のように修正する。

static linkなバイナリの生成

ct-ngは静的リンク(static link)でプログラムをコンパイルできるかをチェックしているが、最近のMacは静的リンクができない。 これの解決方法が見つからないため挫折。

以下、その時のログ。

[DEBUG]    ==> Executing: 'x86_64-build_apple-darwin13.4.0-gcc' '-O2' '-g' '-pipe' '-L/usr/local/lib' '/Volumes/case-sensitive-disk/arm-gcc/.build/arm-baremetal-eabi/build/test.c' '-static' '-o' '/Volumes/case-sensitive-disk/arm-gcc/.build/arm-baremetal-eabi/build/.gccout'
[DEBUG]    ld: library not found for -lcrt0.o
[ERROR]    collect2: error: ld returned 1 exit status

おわりに

以上、挫折しました記録です。 この後を何とか出来る人は引き継いでいただけると嬉しいです。

とりあえずsedgrepの件については、アップストリームでも治ってなかったらパッチを送る予定です。

MacBookPro(early2011)のHDDをSSDにした

自宅でメインに使っているMBPの動作が遅すぎて遅すぎて仕事にならないのでこれを機に買い換えたかったのですが、 まるまる買い換えるほどお金の余裕がないので、HDDをSSDに換えることで高速化を図ることにしました。

今回購入したSSDは以下。

SanDisk SSD UltraII 240GB 2.5インチ [国内正規品]メーカー3年保証付 SDSSDHII-240G-J25

SanDisk SSD UltraII 240GB 2.5インチ [国内正規品]メーカー3年保証付 SDSSDHII-240G-J25

商品は1週間ぐらいで届いた。

以降、再インストールの記録。

環境

MacBookPro early 2011

OSのインストール

インターネットからインストールが行えなかったので、仕方なくSnow Leopardのインストールディスクからインストールを行い、Mavericksにあげた。以下手順。

  1. Snow Leopardをインストール
  2. ソフトウェア・アップデートを数回繰り返してApp StoreからMavericksをインストール可能にする。
  3. App StoreからMavericksをインストール

App Storeで入れたもの

OneDrive

Microsoftクラウドストレージ

iPhoto

iMovie

Toy Viewer

日本語フォントの入ったSVGやEPSもきれいにPNGとかにできるツール。昔は減色などの編集もできたが、今はなくなってしまった。ちょっと不便。

WinArchiver

Windowsで問題なく開けるZIPを作るツール

Memory Diag

メモリ状況の表示、お掃除とかができるツール

Network Strength

ネットワークの状況を表示できるツール

LanScan

同一セグメント内にいるマシンとそのIP、MACアドレスを検索できるツール

Xcode

Dash

プログラミング言語関連の資料が読めるツール

CHM View

Windowsツールによくある.chm形式のマニュアルを読むためのツール

Go2Shell

Finderのツールバーに追加すると、今開いてるディレクトリからコンソールを起動できる。ツールバーへの追加方法はMavericksからはCommandを押しながらドラッグアンドドロップに変更されていることに注意。

デスクトップ関連

XtraFinder

Shiftit

Macで画面分割をするツール

日本語入力環境

ことえりが糞すぎるので、Google日本語入力をインストール。

ことえりの無効化方法

システム環境設定を開いて、キーボードの設定の入力ソースからことえりを削除する。

開発環境

homebrew

$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
$ brew update
$ echo export PATH='/usr/local/bin:$PATH' >> ~/.bash_profile
$ export PATH=/usr/local/bin:$PATH
$ brew install wget

バージョン管理

$ brew install mercurial git

SourceTree

GUIで使えるバージョン管理ツール

GNUツール

brew install gnu-sed gawk gcc

圧縮ソフト?

$ brew install xz

Xwindow

プログラミング言語

Python,Haskell

$ brew install python3 ghc cabal-install
$ brew linkapps
$ cabal update

Python3(3.4)のインストール時、なぜかpipがうまく動かなくなることがあったが、以下のコマンドでインストールしなおしたら動いた。原因はよくわからない。

$ brew install xz && brew remove python3 && brew cleanup && brew install python3

Ruby

Rubyはバージョン依存がひどいので、rbenvで複数バージョンを切り替えられるようにしておく。 方法は以下を参照した。

$ brew install rbenv ruby-build
$ echo '# rbenv path' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ echo 'export PATH="$HOME/.rbenv/shims:$PATH"' >> ~/.bash_profile
$ source ~/.bash_profile

$ rbenv install 2.1.3
$ rbenv install 1.9.3-p547
$ rbenv rehash
$ rbenv shell 2.1.3
$ echo 'rbenv shell 2.1.3' >> ~/.bash_profile

執筆関係

執筆業のためのツールを色々入れる。

TeX

試行錯誤のすえMacTexでインストールを行うのが一番ラクなことがわかったので、2.4GBのダウンロードに耐えてインストールする。

Re:VIEW

MarkdownとTeXの中間ぐらいの難易度で書ける組版処理ソフト。 BareMetal本や同人誌を書く際に使ってるので入れる。

$ gem install review

SublimeText

恋をするかどうかは知らないけど、Re:VIEW用のプラグインがあるので使用している。Re:VIEWプラグインEmacsにもあるらしいので、Emacs使いに乗り換えたいが一向にコマンドが覚えられないので乗り換えられずにいる。

pandoc

Haskellで書かれたドキュメント変換ツール。 Markdown,Tex,HTMLなど相互に変換できて超便利。 PDFにも対応しているが、未だ直接PDFに変換できたことがない。 だれか知っている方は教えてください……。

$ cabal install pandoc

電子工作関連

普段のマイコン電子工作に使うツールたち。

lpcXpresso

NXPマイコン用のEclipseベースIDE。最近はmbedがあるのであまり使わないけど一応。

Arduino IDE

お手軽開発のため。

なお、Mavericksではドライバの関係でシリアル通信がうまくいかないので、以下を参考に修正する。

$ cd /System/Library/Extensions/IOUSBFamily.kext/Contents/PlugIns 
$ sudo mv AppleUSBFTDI.kext AppleUSBFTDI.disabled 
$ sudo touch /System/Library/Extensions

このあとFTDIのサイトからドライバ落としてきてインストールする。

CoolTerm

便利なGUIコンソールアプリ。

MPLAB IDE X

PICマイコンの開発環境。過去の遺産の保守のため。

KiCAD

期待のフリーな回路図CADソフト。 現在Eagleから頑張って乗り換え中。

eagle

小型の基板であれば無料で使える商用回路図CADソフト。 過去の遺産の保守のために。

おわり

とりあえず以上でおわり。 上記手順をHomebrewである程度自動化できるらしいので、いつかやる(やらないフラグ

おまけ:結局SSDにした効果は?

再起動に数十分待たされることはなくなったし、ファイルアクセスでシステム全体が固まることはなくなった。 しかしいかんせんCPUが古くて遅いので、アニメ見ながら作業とかしようとすると重い。 早めにお金貯めて、新しいパソコンを買いたい。

TFTPサーバーから相対パスでファイル取得できない問題について

著書「BareMetalで遊ぶ Raspberry Pi」追記のため、U-Bootを使ってプログラムをネットワークブートさせながら開発しようとしたのですが、RasPiがプログラムを拾ってこれずにこけてしまいました。

試しにログを吐かせてみると、こんなエラーが出ていました。

tftp> trace 
Packet tracing on.
tftp> verbose
Verbose mode on.

tftp> get test.img
getting from 192.168.12.50:test.img to test.img [octet]
sent RRQ <file=test.img, mode=octet>
received ERROR <code=2, msg=Only absolute filenames allowed>
Error code 2: Only absolute filenames allowed

absoluteと書いてあるので、試しに絶対パス指定でやってみたら成功。

tftp> get /srv/tftp/test.img
getting from 192.168.12.50:/srv/tftp/test.img to test.img [octet]
sent RRQ <file=/srv/tftp/test.img, mode=octet>
received DATA <block=1, 512 bytes>
sent ACK <block=1>
...

なんだこれ……。

調べて見ると「 -c -s オプションをつけるとうまくいった」という報告があったので、試しに /etc/default/tftpd-hpa を以下の様に書き換えて再起動してみると、今度は問題なく相対パス指定で取得できました。

# /etc/default/tftpd-hpa

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="-c -s"
$ sudo /etc/init.d/tftpd-hpa restart
tftp> get test.img
getting from 192.168.12.50:test.img to test.img [octet]
sent RRQ <file=test.img, mode=octet>
received DATA <block=1>

調べてみると、-cオプションは--createオプションの略で、これがあると新しいファイルの作成ができるようになる……あれ? 相対パスを指定するオプションではないですね……なぜ直った……。

なぜ直ったのか、ちょっと自信がありませんが、とにかくこの修正で動くようになったので、著書の方も修正しておくことにします。

追記

そもそも修正前の設定ファイルは以下の様になっていた。

# /etc/default/tftpd-hpa

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure"

つまり正確には --secure-s -c に変更を行った結果、動作するようになった。

調べてみるとsecure TFTPというのは、chrootのように特定のディレクトリをルートのように見せかけることで、他の様々なディレクトリを除かれないようにするものだった。

つまり、tftp-hpaは 127.0.0.1(localhost) に対しては --secure オプションが効くが、 どうやらその他のアドレスでは -s オプションでないと secure TFTPが使えないらしい。

これ、ちょっと元のコード読んでみるしかないですね……。