TOPPERS/SSPのGCCでのコンパイル

TOPPERS/SSP(FM3用-SPANSIONのCortex-M3)のGCCでコンパイルをしてみた。

(誤:ssp_cy8ckit050_gcc_20140309.zip -> 正:ssp_cq_frk_fm3_gcc-20140307.tar.gzでした。投稿を修正しました。)

環境:64bit版Windows 8.1 + Cygwin64(64ビット版Cygwin)

今回はCygwin上でクロスコンパイルをするのではなく、最も簡単と思われるMentor Graphics社の、
Sourcery CodeBench Lite Editionをインストールしました。
(Sourcery CodeBench自体はCygwin上でなくても動作します。)

1.Mentor Graphicsのサイトの以下のURLへいく。
https://www.mentor.com/embedded-software/sourcery-tools/sourcery-codebench/editions/lite-edition/

2.「ARM Processors」の「Download the EABI Release」をクリックする。
以下に移動する。
https://www.mentor.com/embedded-software/sourcery-tools/sourcery-codebench/editions/lite-edition/arm-eabi

3.この後メールで送られてきたインストール先のURLからインストーラ形式のファイルをダウンロード。

4.ファイルをダブルクリックしてインストーラの指示に従い(ほとんどNextボタンを押すだけ)インストール。

5.環境変数PATHに%HOME%\MentorGraphics\Sourcery_CodeBench_Lite_for_ARM_EABI\binが設定されているか確認(設定されていなければ自分で設定-コントロールパネル-システム-システムの詳細設定-詳細設定-環境変数から自分で設定)。

6.PCのCygwinのbash上で、TOPPERS/SSPのssp_cq_frk_fm3_gcc-20140307.tar.gzを展開する。

7.sspに移動。
cd ssp

8.ビルド用のディレクトリOBJSを作成、移動。
mkdir OBJS
cd OBJS

9.configureスクリプトを修正
spp/configureの213行目にcfgの位置が展開されるソースの階層構造に合っていない。
(誤)$cfg = $opt_g ? $opt_g : “\$(SRCDIR)/cfg/cfg/cfg”;
(正)$cfg = $opt_g ? $opt_g : “\$(SRCDIR)/cfg/cfg”;
ASPでは合っているのですが、SSPではcfgの階層が一段浅いため、configureの生成したMakefileではcfgが見つからなくなります。
ここを修正すれば、Interface誌付属FM3基板用簡易パッケージの最新版をコンパイルすることは出来ました。

configureは他のパッケージでもcfgの階層があっていない可能性があります。

10.configureスクリプトを実行

../configure -T cy8ckit050_gcc
(またはperl ../configure -T cy8ckit050_gcc)

11. make実行

・インストールのポイント
Sourcery CodeBenchはフリースタンディング環境用のEABIを選択することがポイント。ホスト環境用のものを選択すると、toppers-users#4074のように「__aeabi_unwind_cpp_pr0」という未定義シンボルエラーが発生する。
https://www.toppers.jp/TOPPERS-USERS/2013-April/003896.html
フリースタンディング用であればtoppers-users 4076のようにこのエラーは発生せずコンパイルが終了する。

・SSPについての注意点
CY8CKIT-050 PSoC 5LP Development Kit(Cypress Semiconductor)簡易パッケージは、ssp\target\cy8ckit050_gccの下にMakefile.targetが存在しないため、make実行中にエラーになる。

・実機での動作は未確認
コンパイルをしたときは実機がなかったため、動作は未確認です。
また、TOPPERSプロジェクトが提供しているARMを含むシミュレータであるskyeyeで確認したかったのですが、skyeyeはCortex-M3には未対応、かつTOPPERSプロジェクトで配布されているskyeyeは32ビットCygwin用バイナリであり、Cygwin64上ではエラーもださすに終了してしまうため、この点は未確認です。

・skyfreeについての補足
skyeyeのソースは昔のCywgwinではコンパイルできたのですが、CygwinがWDM(Windows Driver Model)に対応して以降、ヘッダファイルの配置、内容などがドラスティックに変更されたため、現在提供されているCygwinではskyeyeは(TOPPERSプロジェクトから提供されている、修正版skyeyeも、soruceforge.netで配布されている最新版でも)コンパイルできなくなっています。
さらにcygwinは常に最新版のみ配布しているため、旧版のcygwinを入手することも、困難です。

インターフェース2011年4月号特集、技術解説にTOPPERSが

CQ出版のインターフェース2011年4月号が、久しぶりにTOPPERS関連の記事が満載でしたので
ご紹介しまします。

Interface(CQ出版社)

2011年4月号 特集「学んで使って楽するリアルタイムOS入門」
プロローグ 「知ってて当たり前!組み込みリアルタイムOSプログラミング」編集部
第1章 「組み込みシステムとリアルタイムOS」南角茂樹
第2章 「リアルタイムOSから得られるメリットとその特徴」杉本明加
第3章 「TOPPERS/ASPを理解して、プログラムをビルドしよう!」杉本明加
第4章 「本特集で使われる用語の解説」杉本明加
第5章 「タスクと各種ハンドラ間でデータをやりとりする方法」杉本明加
第6章 「メモリやI/Oなどの資源をリアルタイムOSで管理する方法」杉本明加
第7章 「FeliCaカードリーダーを使ったID読み取り機の制作」杉本明加
第1章 「Windows上のシミュレータでTOPPERS/ASPを動作させる」小泉義行

技術解説
「MINDSTORMS NXT用TOPPERS/JSPを使いこなす」竹内良輔

特集は、2009年5月号付属のARMマイコン基板(ARM7マイコンLPC2388)+拡張基板
に移植されたTOPPERS/ASP上でのプログラム開発がテーマです。
ビルドからデバッグ、各種サービスコールの使い方がサンプルプログラム付きで解説
されています。
FelicCaカードリーダーを用いたアプリケーションは、ソフトウェアの設計にも大きく紙面が
割かれており、筆者が作り上げていくプロセスが感じ取れる記事になっています。

また、第7章は、英国Keil社のARMマイコン()のWindows上のシミュレータで
TOPPERS/ASPのsample1を動かした記事です。
私自身も今回初めて知りました。

これとは別に、TOPPERSプロジェクトでもオープンソースのSkyEye(AT91SAM7S
プロセッサをシミュレーション)を拡張した、マルチプロセッサシミュレーション環境である、
TOPPERSカーネル向けシミュレーション環境を開発成果物として公開しています。
また、このシミュレーション環境をターゲットとしたTOPPERSカーネルも公開しています。

TOPPERSプロジェクトは、ETロボコンに特別協賛しTOPPERS賞を設け、さらにソフトウェア
プラットフォームとその教育教材の提供、教育セミナーの開催を行っています。

ETロボコン2010

「ETロボコン2010に対する取組み

MINDSTORMS NXT用TOPPERS/JSPプラットフォーム

MINDSTORMS NXT用TOPPERS/ASP+TECSプラットフォーム

今回は上記の2つのうち、NXT用TOPPERS/JSPプラットフォームの解説です。
今後、NXT用TOPPERS/ASP+TECSプラットフォームの解説もされる予定と聞いています。

それから、今年もETロボコンが開催されます。
現在、日本全国で説明会を実施中です。詳しくは以下を参照してください。

ETロボコン2011実施説明会

東海地区は2月27日(日)13:30-17:00(受付開始 13:00)、名古屋大学情報基盤センター4F演習室で行われます。

この場所は、実は昨日参加したTOPPERSプロジェクト組込みコンポーネントWGのミーティングを行ったところです。

こんな建物のところです。

\"演習室のある建物\"

また、NXT用TOPPERS/ASP+TECSプラットフォームのうちのTECSは、

TOPPERS Embedded Component System)

のことであり、TOPPERSプロジェクトが開発した組込みシステムに適したコンポーネントシステムです。

TECSとは

上記のURLにて、仕様書、ツール、教育教材が公開されています。

また、先日の記事「携帯型端末で学ぶ、はじめてのコンポーネントベース開発 」でご紹介しましたように、NEPにおいて3/10(木),3/11(金)にTECS関連の公開講座(無料)が開催されます。
こちらは、3月4日まで募集しています。

https://www.toppers.jp/TOPPERS-USERS/201102/msg00008.html
(toppers-users 3403) NEP のTECS 関連講座のご案内

携帯型端末で学ぶ、はじめてのコンポーネントベース開発

3月10日(木)、11日(金)の2日間、NCES人材育成プログラム(NEP)の公開講座「端末で学ぶ、はじめてのコンポーネントベース開発 」が名古屋大学で開催されます。

今回は、Raisonance社の携帯型端末「STM32Primer2」の上に、TECS(TOPPERS Embedded Component System)を用いた
演習があります。
STM32Primer2のLED、JOYSTICK、LCD画面表示、タッチパネル、AUDIOを操作するソフトウェアをTECSのコンポーネントとして段階的に開発していくというカリキュラムです。
受講者一人に対して、STM32Primer2、開発用PCが用意されているので、しっかりと取り組めると思います。

お申込みはこちらからできます。 –

ちなみにSTM32Primer2を用いたTECSの教材は、TOPPERSプロジェクトのサイトからも公開されています(「TECS 教材(STM32 Primer2 を用いてTECS を学ぶ)」)。

STM32Primer2については、以下のサイトが詳しいです。
http://www.stm32circle.com/hom/index.php

また「STM32Primer2」で検索すれば、日本語でも情報が見つかります。

www.toppers.jpのTOPICSをフィード化

最近リニューアルされたTOPPERSプロジェクトのサイトですが、まだフィードの配信を行っていません。

トップページにTOPICSとして、TOPPERSプロジェクトの最新ニュースが掲載されているのですが、これがフィードとして配信された方がうれしいなと思っていました。

今回livedoor ラボ「EDGE」が提供している「Page2Feed API 」という、ページをRSS化してくれるサービスを使ってみたところ、結構それらしい結果が得られたので報告します。

やり方は上記のURLに行き、RSS化したいページのURL、今回は「http://www.toppers.jp 」を入力して、「Generate」ボタンを押すだけです。

結果は以下のようになります。

プレビュー用のURLでの表示)

page2feed

生成されたフィードのURLは以下の通りです。

https://ic.edge.jp/page2feed/http://www.toppers.jp

このサービスの利用自体は無料とされていますが、実験的なサービスのため、告知なく終了する場合がありますとのことです。

NECSのシンポジウムでTECSの発表があります

名古屋大学組込システム研究センター(NCES)が「第2回組込みシステム研究センターシンポジウム」を、9月15日、 16日に名古屋大学野依記念館において開催します。

これはNCESの第1期4年間の成果紹介するものとのことです。

その第2日目の午後の部、「セッション 3 共同研究発表」において、「TECS:組込み向けのコンポーネントシステム」の発表があります。

詳しくは、名古屋大学組込みシステム研究センター シンポジウム(第2回)を参照してください。

お申し込みはこちらから行えます。

変数間の循環参照関係を調べる方法

変数間の循環参照関係を調べる方法を考えてみました。

プログラミング言語とまでいかなくても、簡単なスクリプトや設定ファイルの中で、変数の初期化に、定数式だけでなく他の変数の値が参照できるという文法の場合を想定しています。

ぶっちゃけ、ここで話題にしているTECSのCDLでも、セルの変数の初期値に、セルの属性の初期値を参照できるという文法になっているため、CDLを解釈するプログラムの実装時には気をつける必要があるというのが、今回の考察の動機です。

注)現在公開されているTECSのCDLの文法では、ここで問題にしている循環参照は起こりません。この記事はあくまでも、解釈するプログラムの実装についての考察です。

ここでN個の変数をv1,・・,vnとします。
初期化の対象となる変数をvxとするとし、初期化を記号”=”で表すと、

vx = (v1,・・,vnを含む定数式)

となります。
これは一般的な関係を表すものであり、まったく他の変数を参照しない場合も含みます。
上記の右辺において、参照しない変数に対しては係数0を掛けているものとします。

ここで問題にしているのは、変数が1回でも参照されているか否かです。
具体的に上記の右辺でv1が何回加減乗除されようと、式にあらわ得るv1の個数ではなく、その個数ではなく、あくまでも式に変数v1が現るか、現れないかだけです。

N個変数それぞれについて、初期化を表すと、以下のようになります。

v1 = (v1,・・,vnを含む定数式)


vn = (v1,・・,vnを含む定数式)

ここで、変数vxの初期値を求めるために、変数vxの右辺に現れる他の変数をその変数の右辺で置き換えます。
右辺が全て定数式になれば、変数vxの初期値が確定します。

しかしここで変数の参照が循環していると、いつまでたっても置き換えが終わりません。
極端な話、

v1 = v1

のように指定された場合です。

さらに、以下のようなたすき掛けの参照関係で循環していることを見つけるのは簡単ではありません。

v1 = v2
v2 = v3
v3 = v1

このような循環した参照関係が存在していなければ、置き換えを実行して初期値を求めことが出来ます。
逆に循環した参照関係が存在していれば、エラーとして置き換えを実行せずに済みます。

以下は私が考えた方法です。

v1 = (v1,・・,vnを含む定数式)


vn = (v1,・・,vnを含む定数式)

から、左辺の変数を集めてベクトルと見なします。

v = (v1,・・,vn)

各初期化式の右辺で変数が参照されていれば1、参照されていなければ0とする行列Bを用いると、

v = B * v

となります。
ここで、左辺のベクトルをv’として区別します。

v’ = B * v

これは、初期化式を素直に表したものですが、置き換えすることは、v’からvを求めることになりますので、行列Bの転置行列をAとして、

v = A * v’

とします。

v1 = (1,0,・・,0,0)
v2 = (0,1,・・,0,0)


vn = (0,0,・・,0,1)

つまり、ベクトルvは各変数を表すベクトルが基底ベクトルになります。

A * v’は、変数xがどの変数を(自分自身も含めて)参照しているかを示すベクトルになります。
つまり、上記で言う(1回の)置き換えを表しています。
A^2(行列Aの2乗)は、2回目の置き換えを表しています。

A * v’
A^2 * v’


A^n * v’

ベクトル(A^x * v1)が、変数v1への参照を含んでいるかは、(A^x * v1)とv1の内積の値により分かります。
内積が0であれば、参照を含んでいません。
逆に内積が0でなければ、参照を含んでいます。

以上をまとめると、以下のようになります。

・行列Aは成分が0か1のどちらかである非負行列です。
・行列Aは、変数の参照関係に基づく1回の置き換えを表します。
・各変数を表すベクトルは、基底ベクトルである。
・x回目の置き換え結果を表すベクトル(A * vn’)とvn’の内積が0であれば、x回目の置き換えは、変数vnへの参照を含みません。

行列Aの対角成分が0であれば、上記の内積は必ず0になります。
行列Aの性質より、行列の対角要素の和であるトレース(trace)が0であれば、どの基底ベクトルに対しても0になります。

従って、行列Aの1乗からn乗までを求め、それぞれのトレース(trace)が0であれば、変数間に循環参照は存在しないといえます。

逆にいえば、トレース(trace)が0でない場合が見つかれば、その時点で循環参照が存在するといえます。

また、行列の性質から、A^xが零行列になれば、A^(x+1)からA^nも零行列になるため、零行列が得られた時点で打ち切っても構いません。

参考文献

線形代数的グラフ理論」 竹中淑子 培風館

プログラミングのための線形代数」 平岡和幸・堀玄共著 オーム社

MinGW + MSYSインストールメモ

現在、MinGW、MSYSのインストーラは新たに開発中である。

このため、各種プログラムを最新版で使用しようとするならば、それらのアーカイブをいちいちダウンロードして、手元のマシンで展開する必要がある。

しかし、TOPPERS/ASP上での開発に使うなど、主にWindows上でのクロス開発環境を用意するためという目的であれば、(メンテナンスされていないとされる)インストーラによるインストールが最も簡単、確実である。

バージョンが古いといっても、これは使用された実績があると捉えたほうが適切である。

以下では、最近手元のマシンにMingW+MSYSをインストールし直した時の記録のメモである。

1.MinGW

https://www.mingw.org/

インストール用ファイルの入手先

https://sourceforge.net/projects/mingw/files/

インストール方法

https://www.mingw.org/wiki/Install_MinGW

https://www.mingw.org/wiki/Getting_Started

コンパイラ等のインストール方法

https://www.mingw.org/wiki/HOWTO_Install_the_MinGW_GCC_Compiler_Suite

以下より、Automated MinGW InstallerのMinGW-5.1.6.exeをダウロードし、C:\MinGWにインストール。

https://sourceforge.net/projects/mingw/files/Automated%20MinGW%20Installer/MinGW%205.1.6/MinGW-5.1.6.exe/download

2.MSYS

インストール方法

https://www.mingw.org/wiki/MSYS

以下をダウンロードし、C:\MSYS\1.0にインストール。

https://downloads.sourceforge.net/mingw/MSYS-1.0.11.exe

3.MSYS DTK 1.0

以下をC:\MSYS\1.0にインストール

https://downloads.sourceforge.net/mingw/msysDTK-1.0.1.exe

4.MSYS Core 1.0.11

以下をC:\MSYS\1.0に展開。

https://sourceforge.net/projects/mingw/files/MSYS%20Base%20System/Current%20Release_%20MSYS-1.0.11/msysCORE-1.0.11-bin.tar.gz/download

tar xvf  msysCORE-1.0.11-bin.tar.gz –directory=/c/msys/1.0

5.MSYSでコンパイル、インストールする時の注意点

MSYSをインストールが終わると、

mount c:/mingw /mingw

となっている。

https://www.mingw.org/wiki/MSYS
では、MSYSでautotoolsを使う場合、以下のようにすべきと書かれている。
./configure --prefix=/mingw
make
make install

/usr/localにインストールするのは避けるべきだそうだ。
これは、MinGWのコンパイラがデフォルトで/usr/localを見ないかららしい。

6.xzのインストール
xzという圧縮フォーマットで圧縮されたファイルを伸長展開できるようにするため、xvをインストール。
コンパイルには、mingPORT.shというシェルスクリプトを利用。

xvのコンパイルに必要なプログラムをインストールまたはバージョンアップしておく。

tar tvf autoconf-2.63-1-msys-1.0.11-bin.tar.lzma –lzma –directory=/c/msys/1.0

tar tvf ../../gettext-0.17-1-msys-1.0.11-bin.tar.lzma --lzma
--directory=/c/msys/1.0

(正確には、これに含まれるautopointが必要だった)
tar xvf automake1.11-1.11-1-mingw32-bin.tar.lzma –lzma –directory=

/c/msys/1.0

pushd /usr/bin;mv aclocal _aclocal; ln -s aclocal-1.11 aclocal;popd

tar xvf xz-4.999.9beta_20091209-3-mingwPORT.tar.bz2
cd xz-4.999.9beta_20091209/mingwPORT
./mingwPORT.sh

RubyとC言語における文字列リテラルの違い

こちらのブログ(TECS 開発ブログ ruby のシンボルと文字列)で触れられているrubyのシンボルと文字列の違いについでですが、私はRubyとC言語における文字列リテラルの扱いの違いの影響の方が大きいのではないかと思います。

C言語で

char *a = “ABCEDFG”;

char *b= “ABCEDFG”;

とかくと、「AGCDEFG」がstaticな領域に取られて、aとbが同じアドレスを指すようになります。

#C言語の規格を見ていないので、正確ではないかもしれません。同じなドレスをさすことが多いとしておきます。

しかし、Rubyの場合、単に”ABCDEFG”とすると、これはString.new(“ABCDEFG”)と同じことであり、”ABCDEFG”という文字列を持つStringクラスのインスタンスを生成することになります。

p “ABCDEFG”.object_id

p “ABCDEFG”.object_id

と2回書くと、それぞれ異なる値のオブジェクトIDを返します。

最初に書いたC言語の書き方に近いことをRubyで実現するには、シンボルリテラルを使います。

p :ABCEDFG.to_sym

p :ABCEDFG.to_sym

こちらは、同じシンボルリテラルならば常に同じSymbolオブジェクトを指します。

ただし、Symbolオブジェクトは一致するかしないかぐらいしか比較する手段がありません。

#Ruby 1.9ではメソッドが増えているので事情は違っていますが。

Symbolオブジェクトに対して文字列長の大小の比較とか、アルファベット順のソートなどは出来ません

その点から言うと、文字列というよりはC言語でいうポインタとか配列の添え字を用いた比較に近いです。

C言語でもポインタの値自体の大小比較とか、ソートなどは極めて限定された状況でないと意味のある結果は得られません。

Rubyの中でもSymbolクラスは特殊です。

特筆すべきは、Symbol.newはNoMethodErrorになることです。

Symbolオブジェクトを作るには、シンボルリテラルを記述するかStringクラスのto_symメソッド、internメソッドを用います。

SymbolオブジェクトとStringオブジェクトは1対1対応しています。

またそれぞれのクラスにto_str, to_symが定義されています。

したがって、SymbolオブジェクトとStringオブジェクトの間で同値姓をチェックしたいならば、いったんどちらかに変換してから==で比較するという方法を取ることはできます。

# 本来は、比較する対象があいまいにならないようにするべきでしょうが。

これは私見ですが、Rubyで文字列リテラルが毎回異なるStringオブジェクトを生成すること自体を知らない人の方が多いのではないでしょうか。

もっというと、Stringクラスの非破壊的メソッドを使っているのに、「文字列が変更されていない。おかしい!」という質問がくることの方が多いです。

メソッドの返値が新たに生成されたオブジェクトであることを気にしなくても、Rubyプログラミングは出来てしまう、というか、トレードオフとして「安全である」と強調されます。

多分、Symbolがあることを知らない人の方が多いのでは。

また、初級者のレベルでは、「何故Symbolを使う必要があるか分からない」はずです。

結局、Symbolを使おうという人は、Ruby使いの中では明らかに初心者ではないです。

(上級者でない)多くの人にとって、Symbolは知らないし、知っても、使い道が分からない、有難味が分からないがため、使わないのが現状ではないでしょうか。

#ライブラリとか、フレームワークをつくる側になると、無視できない無駄に感じるようになると思います。