ターゲット基板開発環境一覧

Jetson TK1 を USB メモリ起動にした記録

Jetson TK1 で USB HDD を使用して起動させたいとのコメントがあったので、とりあえず USB メモリを代用としてこちらから起動する方法にトライしてみました。
今更 TK1 という感じもありますが、 Jetson TX1 は性能がよくてほしいところではあるんですが価格ネックですね。
jetsontk1_with_usb
今回の作業は Windows 上に VMware Player で構築した Ubuntu 15.10 環境で作業しています.

続きを読む


RPI2 の Windows10 IoT Core のカーネルデバッグ

Windows10 IoT Core アニバーサリーアップデートを適用した RPI2 で、カーネルデバッグができるように環境を構築してみました。

必要なもの

必要なものは以下の通りです

  • Win10 IoT Core 導入済み RaspberryPI2
  • LANケーブル
  • USB-シリアル変換ケーブル

自分が使用している USB シリアル変換ケーブルは以下のものです。
ちょっとドライバ導入に手間があったりしますが、使えています。


準備(WinDBG)

WinDBG を使う必要があるのでこれを入手します.
これは Windows SDK か Windows Driver Kit に含まれています。
Windows SDK のほうは WinDBG だけインストールも行うことができます。これは インストーラーでどの機能をインストール選択するかの際に、 “Debugging Tools for Windows” のみ選択で、 WinDBG のみをインストールできました。

ドライバの開発という点では Windows Driver Kit を使用しますが、デバッグ目的であれば Windows SDK を選択するのでよいのかなと思います。なお今回使用した Windows Software Development Kit は,Windows 10.0.14393.33 というバージョンのものとなっていました。
続きを読む


Windows10 IoT Core のアニバーサリーアップデート

デスクトップの Windows10 にアニバーサリーアップデートが来たように、 Windows 10 IoT Core についても アニバーサリーアップデートが来ました。今回はこれの導入手順や新機能などを紹介してみたいと思います。

導入について

以前にIoT Core を導入している場合で、 Windows 10 IoT Core Dashboard がインストールされている環境では、 Dashboard を起動すると以下のようにウィンドウが表示されて、更新を促されるので更新を行います。
win10-iot-update-01

ちなみに Windows 10 IoT Core Dashboard は以下のページから取得可能です。
Microsoft Windows 10 IoT Core Get Start
こららの詳細は、以前の導入記事を参照していただければと思います。

win10-iot-update-02
Dashboard から必要事項を入力して microSD カードにイメージデータを書き込みます
他に作業することはないのでしばらく待ちます。

書き込みが完了した microSD カードを Raspberry Pi 2 に装着して、電源をいれます。
初回起動にはそこそこの時間(5分程度)がかかるので、画面が落ち着くまで待ちます。

ちなみに OS のバージョンとしては 10.0.14393.0 となっていました
続きを読む


gcc 組込み関数(memcpyとか)のインライン展開抑制

アライメントに寛容な x86 の話ではなく、 ARM プロセッサのお話になります。OSが動いていてソフトウェア例外を処理できるような状況では非アライメントなデータであってもなんとか動くので表面化しませんが、そのアタリをケアしない状況ではプログラムが停止してしまう原因の1つです。

さて非アライメントなデータ列をコピーしたりクリアしたりする際に、memcpy, memset などを使用することがあります。
デバッグ時にはうまく動いていたのに、最適化を有効にしたリリースビルドでは, このあたりでうまく動作せずに例外を出してしまったりすることがあります。

仕方なくこれらの関数の自前版を用意してこちらを使うようにしてしまうのも1つの手です。しかし memcpy, memset などのまま対処することも可能なことがわかりましたのでここで紹介したいと思います。
ここまでに言い忘れてしまいましたが、 gcc を使用した開発環境でのお話です。

原因

そもそも最適化によって何が起こり、正常に動かなくなってしまうのか。この原因は gcc が自分の組み込み関数を使用し、最適化によってインライン展開されてしまうことによります。

インライン展開されてもアライメント寛容なコードであればまだ良かったりしますが、速度重視のために最適化されているのでそうはならないのが現実です。

対策

gcc のコンパイルオプションで実はこのインライン展開の抑制が可能です。
-fno-builtin-(functionname) というオプションになります。なので、 memset,memcpy らを抑制する場合には、 -fno-builtin-memset, -fno-builtin-memcpy といったようなオプションを指定することとなります。




VisualStudio 2015 で Linux アプリの開発&デバッグ その2

前回は単独のプロジェクトでソースコードも1つだったので、
今回はスタティックライブラリを使用しての複数のソースコードで動作を試してみたい思います。

準備

前回はソースコード単独でビルドできる状態だったので、実行体の生成のため gcc を呼び出すコードを書いていました。
今回からは複数のコードやライブラリのリンクと言ったことも考慮するためにこの部分を make コマンドを実行するように変更しました。
これにより Makefile さえエディットすれば、ソースコードの変更に対応できるようになります。注意点としては VisualStudio でのプロジェクトへのソースコードの追加と、Makefile の中身は同期されないので、手動(もしくは他の手段で)同期をとる必要があるかもしれません。ただ大事なのは Makefile なのでこちらをエディットすることを守ればなんとかなりそうです。

具体的にはプロジェクトのプロパティで Build Command Line を以下のように変更しました。(実際にはこれを1行で記入してください)
vs2015-target-linux-use-staticlib-0

またプロジェクトに登録したファイルの転送は考えたくなかったので、Linux で Samba を導入し、共有フォルダに VisualStudio のプロジェクトを作るようにしています。

続いてスタティックライブラリの準備にとりかかります。
続きを読む


VisualStudio 2015 で Linux アプリの開発&デバッグ

VisualStudio 2015 で別PCで動いている Linux 環境でのアプリ開発およびデバッグということができるかを試してみました。

必要なものは以下の通りです。

  • Linux環境の別ターゲット
  • VisualStudio 2015 を ”Visual C++ Android 開発”付きでインストール

ここでは VisualStudio 2015 Professional, Windows10 Pro (x64) で確認しています。
vs2015-target-linux-11

セットアップ

最低限の必要なものは準備が終わっているものとして、環境構築の説明をしていきます。

Linux側の準備

ここでは少し古いですが CentOS 6.5 の環境があったのでこれで説明します。
Samba を用いて Linux-Windows のファイル共有ができるように設定しておきます。
またコードのコンパイルを Linux で行うために、コンパイラなどのツールチェインをインストールしておきます。

Windows側の準備

Visual Studio GDB Debugger 」という拡張プラグインをインストールします。
これは以下のページからダウンロードすることができます。
https://visualstudiogallery.msdn.microsoft.com/35dbae07-8c1a-4f9d-94b7-bac16cad9c01
VisualStudioGDB.vsix というファイルがダウンロードされるので、ダブルクリックでインストールを行います。
(本プラグインは Microsoft のデジタル署名がついているようでした)

このプラグインが Plink を使うようなので、Putty のページからファイルを取得してきます。
Putty のページ: http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html

インストールしてしまっても良さそうですが、開発環境に tortoise Git も入っており、こちらが標準で使っている TortoisePlink でないものを設定済みだったりするとかち合うため、安全を考えて zip アーカイブを取得することにします。

そして、これを適当なところに展開します。ここでは C:\tools\putty に展開しました

続きを読む


クロスコンパイラの作成 (ARM/Barematal)

毎回同じような時期にクロスコンパイラの作成をやっている気がします。
今回は対象を Raspberry PI 2 で、ベアメタル用のクロスコンパイラの作成をテーマにやっています。

使用した環境やツールは以下のようになっています。

  • Ubuntu 15.10 (AMD64)
  • gcc version 5.2.1 20151010 (Ubuntu 5.2.1-22ubuntu2)

使用したソース類

  • gcc 5.3.0
  • binutils 2.25.1
  • newlib-2.1.0

ディレクトリ構成例

意外とここが大事なので注意してください。自分のやってみた範囲ではコードと中間成果物の位置関係が大事な部分があるようです。ここを対応していないような構成を取ってしまうと、途中でエラーが発生して進めなくなってしまいました。

make作業

binutils, gcc, newlib らを先に説明したような場所に展開します。

基本的には別ディレクトリで作業するため build-* なディレクトリを作成します。

前提条件

先に説明したように、ベアメタルな環境を想定しているため、
この先の手順で作成したコンパイラを用いて linux で動く何かを作ることはできません。
また Raspberry Pi 2を対象として決めているので、 hard float ABI を使用し、arm-mode の命令を使ってほしいという想定で設定を行っています。

binutils 2.25.1

ここでは以下の設定で make, install を行いました.

disable-werror を付けないと、binutils の make に失敗してしまうので、付加してあります。以前はそのようなことがなかったため、ホスト gcc のバージョンが上がっていることによる挙動差かなと思っています。
さて、この binutils らをこの先使用するためにパスを通しておきます。

gcc 5.3.0 1回目

定番の話にはなるのですが、1回目のgcc では C言語のみの設定で gcc のみを生成させます。

newlib 2.1.0

ターゲットのシステムには OS がないため linux の共有オブジェクト群はありません。
システムコール類に当たる部分も自作する環境を考えているので
newlib のシステムコールを外した状態で出来上がるようにしています。
そのオプションが、”disable-newlib-supplied-syscalls” です。

make install の部分で失敗することがあれば、ディレクトリ構成を見直した方がよい感じでした。
試してみた範囲では構成を直しただけで成功するようになりました。

gcc 5.3.0 2回目

libcらが newlib によってできたため、残りの gcc の作業を行います。
先ほどのディレクトリに戻って、 make all で残っていた make作業を再開します。

まとめとこれから

これで C言語が使える gcc が出来上がりました。
C++も使えるようにするのであれば、C++ も有効にしてgccのmake 3回目を行えばよいようです。変更する部分は、 –enable-languages=c,c++ となります。

このようにしてできた gcc で -v で確認してみると以下のようになりました。

コツがわかればクロスコンパイラの作成は難しい点はなさそうです(たぶん


PowerVR SGX*** のカーネルドライバのソースコード

結構触っていない期間が長くなってしまいましたが MIPS Creator CI20 の最近の様子はどうだろうと思って調べてみました。http://elinux.org/MIPS_Creator_CI20 にアクセスしてみたら、実は既にこのボードって3世代くらいになっているようです。形的には最新の世代の正方形に近いものがいいなぁと思ってます。しかし未だに日本の発売はなさそうで、残念。

今の最新では Debian 8 の環境開発が進んでいるようで、SGXドライバが使えないという話は昔の話となりつつあるような感じです。そして自分が使っていたシステムイメージなどは CI20_Distros_Legacy のページに行ってしまっていました。
そしてこのページには Debian 8 Jessie 部分で、”Graphics acceleration will not work (the powervr drivers currently don’t work with xorg 1.16).” なんて記載が残ってました。現行のページでは release note にもそんな話は見当たらないので、そこそこ使えたりするんじゃないでしょうか。そのうち時間できたら試してみるかもしれません。

その一方で驚いたのが CI20_Dev_Zone のページです。こちらは通常は覗くことがないかもしれません。自分もたまたま発見したのですが、このページの後半で Linux Kernel のビルドに関しての説明があるあたりで驚きました。
 それが “Building GPU Kernel Module from sources” という部分です。 PowerVR の SGX のドライバは今まではバイナリ提供でソース類を明かさなかったのですが、コレを見るとカーネル部分のドライバソースも公開されているようです。これらに関してはこちらの CI20-SGX_kernel_moduleのページのようです。ここでは 3.0.8 でも 3.18 カーネルでも対応してるっぽいです。

 ちょっと興味があったので中身を開けてみたら、 pvrsrv のソースっぽいものがあったり、各PowerVR のチップ(sgx530, sgx535, sgx543, sgx544, sgx540)といったもののレジスタのヘッダがあったりととてもおもしろい気がします。このあたりのチップは他の組込ボードでも使われているケースがあるので、割と使えるものな気がしています。

OpenGL も動くグラフィックスドライバがソースコード付きの公開というのは自分は初めて見た気がします。これはとても興味深いですね。(ただしOpenGLの解釈部分などはここじゃないようですが)