InstrumentsTOSHIBAXilinxホーム製品情報コンピューテックスの製品についてご紹介します。VC組込み製品IoTシリーズ組込みボード組込みモジュール無線LANモジュールショッピングサポート当社製品に関するさまざまなサポート情報をご提供しています。お問い合わせ各種お問い合わせフォームをご紹介します。「ARM」記事一覧ARMを採用するためのヒントARMで開発をはじめよう2017/03/14ARMを採用するためのヒント今やARMは組込みでもスタンダードとなりつつあります。実際に採用しようと思うと、まだまだ分からないことが多くて、悩んでおられる方も多いのではないでしょうか。「乗り換えにかかるコストは?」そんな疑問を持ちながらも今一歩を踏み出せない開発者のみなさんへ、SuperHとの比較を交えながら、ARMの素朴な疑問にお答えします。どのARMからスタートするかARMコアのCPUはとても種類が多いため、どれを選択していいのか分からないというご意見をよくいただきます。CPUクロックや搭載されている周辺デバイス、チップのサイズ、価格などを考慮して決める必要がありますし、開発環境も忘れてはならない要素の一つです。同じARMコアを使っていてもCPUベンダが異なると、ハードウェアの設計のしやすさが全く違うものになりますので、留意しておく必要があります。実は私たちも、ARMを使った製品開発を行っているユーザの立場にいます。CPUを以下の表にまとめました。評価ボードこのようにローエンドからハイエンドまで用途に応じて、各社のCPUを使用してきました。エレクトロニクスのRZ/A1シリーズをおすすめします。RZ/A1は扱いやすくARMのエントリチップとして最適です。実際、私たちも6つの製品にRZ/A1を使用しています。RZ/A1をおすすめするのか、その理由をご説明しましょう。第一のポイントとしては、CPUのマニュアルがすべて日本語で用意されているということです。海外製のチップを使うとき、英語のドキュメントしかなく、苦労された経験をお持ちの方も多いのではないでしょうか。新しい概念が説明されている場合は、日本語で書かれている方が早く理解することができますし、製品の品質に差が出てくることもあります。次に、周辺デバイスがルネサスの思想を受け継いだ設計になっていることが挙げられます。各ベンダのCPUを比較すると、周辺デバイスにベンダの特色が現れてきます。RZ/A1ではレジスタマップがSH726xを継承していますので、SH726xシリーズを使われていた場合は馴染みやすい仕様になっています。内蔵RAMが大きいのも特長と言えます。少ないRZ/A1LCでも2MB、RZ/A1Hでは10MBものRAMが搭載されています。通常の組込み用コントローラに使用するなら十分なスペックですし、これだけあればμITRONも余裕で動作します。ハードウェアの設計上、外部RAMの搭載を考える必要がなくなりなり、部品の点数を抑えることができます。そのほかのハードウェア設計上の利点としては、電源が2系統で済み、入切のシーケンスにも制約が無いため、電源周りの回路がシンプルに設計できます。パッケージとしてQFPが用意されていますので、基板面積は若干大きくなりますが、多層基板を使わずにコストダウンを図ることができます。ROMにはシリアルフラッシュメモリが使えますので、配線を少なくし、基板面積を小さくすることができます。SH-2Aの置き換えとした場合、CPUクロックの周波数も200MHzから400MHzへとアップしています。DMIPSとなっていますので、周波数に比例して、およそ2倍の性能が得られます。以上のようにRZ/A1を採用するメリットを説明しましたが、コスト面で見ても同クラスのCPUより安く(当社調べ)入手できますので、興味のある方は一度調べてみてはいかがでしょうか。SuperHとの違いはARMコアはSuperHとアーキティクチャが全く異なる32/64ビットのRISCプロセッサです。最初は戸惑われるかもしれませんが、「ここが違う」というツボを押さえておけばプロセッサとしての原理は同じです。ARMには64ビット版もありますが、ここではARMの主流である32ビット版について説明します。ARMコアとはARMというCPUはARM社のコアライセンスを受けたチップベンダが、独自の周辺機能を付加してチップ化したものです。ARMのコアは同じでもチップベンダによって様々な特色が出てきます。ARMコアとはARM7、ARM9、ARM11、Cortex-A、Cortex-R、Cortex-Mのことで、例えばルネサスのRZ/A1であれば、コアはCortex-A9という言い方をします。現在、主流のCortexシリーズにはアプリケーション用のCortex-A、リアルタイム制御用のCortex-R、マイクロコントローラ用のCortex-Mの3タイプがあり、さらにA9、R4、M3のように番号が付加されて、グレードや機能の有無が区別されます。ARMとThumbARMにはSuperHにはない、ARM命令とThumb(サム)命令という命令セットの概念があります。ARM命令は32ビットでパフォーマンス重視、Thumb命令は16ビットでメモリサイズを重視した命令となっています。ARM命令は一つ一つが非常に高機能ですが、Thumb命令はシンプルに作られています。SuperHの命令を知っている方なら、16ビット命令のThumbの方がしっくりくるかもしれません。ARMとThumbはBXという特殊な分岐命令を実行することで、ARM命令の領域とThumb命令の領域を自由に切り替えて実行させることができます。使い方としては、例えば、メインプログラムをThumb命令で動作させてメモリを節約し、パフォーマンスを上げたいサブルーチンだけARM命令で実行するというようなことが考えられます。リセットや割り込みなどの例外が発生した場合は、自動的にARM命令に切り替わりますので、例外処理はARM命令で書くのが普通です。ARMかThumb、どちらの命令コードを出力するかは、コンパイラのオプションやソースコード内の#pragmaで指定することができます。各社のARM用コンパイラにはこのような機能が用意されています。Cortex-M系のコアはThumb命令のみ動作可能でARM命令は存在しません。Thumb命令にはThumbを拡張したThumb-2や、ThumbEEなどのバリエーションがあり、現在はThumb-2が主流となっています。レジスタARMにはSuperHと同様、R0~R15の汎用レジスタが16個あります。R13はスタックポインタ、R14はリンクレジスタ、R15はプログラムカウンタと役割が決まっていますので、実際に汎用レジスタとして使えるのはR0~R12です。R14のリンクレジスタはBLなどのサブルーチンコール命令が実行されたときに、その次の実行番地が自動的に記憶されるレジスタです。関数の先頭でR14を保存しておき、関数の最後で保存したアドレスへジャンプすることでリターンを行います。ちなみに、ARMにはサブルーチンからリターンする専用の命令はありません。その他、プログラムのステータスを表すレジスタとしてPSRがあります。PSRのビットはフラグとなっており、例えば、演算結果を示すゼロフラグやキャリーフラグなどがあります。R13とR14はバンクレジスタになっており、例外発生時に自動的に切り替わるようになっています。高速割り込みという例外の場合は、R8~R12がバンクレジスタとして切り替わるようになっています。ARM命令セットの特徴ARMの命令は非常に高機能で、高級言語を意識した作りになっています。通常はコンパイラがうまくやってくれますので、命令を意識することはないかもしれません。ブートコードやデバイスドライバを書く場合は、まだまだアセンブラを使うことがありますので、知っておいて損はありません。以下にARM命令の特徴を説明します。ほとんどの命令は条件判断付きほとんどのARM命令は条件判断が付加されていて、条件によってその命令を実行するかしないかを1命令で決定できるようになっています。直前の演算結果が0ならレジスタへの代入を行う、というようなことができ、条件分岐命令を使わなくてもかなりのことができてしまいます。#2上の例はR4をデクリメントした結果が0ならば、R6に2を代入します。zero)が付加されて、条件判断を行っています。この条件には16のパターンがあり、eqのほかne、ge、gt、le、lt、alなどがあります。al(always)は常に実行される条件で、通常はmovalをmovのようにalを省略して記述します。算術系オペランドは3つ算術系ARM命令のオペランドは3つあります。これにより、C言語の2項演算式の代入文を表すことができます。#4」となりC言語の式をそのまま表すことができます。オペランドでシフト処理ARM命令にはオペランドにシフト処理が指定できます。専用のシフト命令が無くても、算術演算や代入命令一つでシフト処理まで完結します。#3上の例はR4を左へ1ビットシフトします。下の例はR3を右に3ビットシフトした結果とR4を加算してR4に代入します。この例では符号ビットを考慮しないロジカルシフトですが、ほかにも算術シフトやローテイトなどがあり、シフト演算に必要なものはそろっています。インクリメント、デクリメントもOKロード、ストア命令のオペランドにはC言語のポインタを意識したインクリメント、デクリメントの機能がついています。0;」は以下のように展開されます。#1このようにポインタへの代入とインクリメントがstr命令一つで実現されていることが分かります。レジスタプッシュとポップC言語では関数の入口で保護したいレジスタをプッシュし、出口でポップする命令が実行されるようになっています。通常なら保護したいレジスタの数だけPUSH命令を連ねる必要があるのですが、ARMでは1命令で複数のレジスタのプッシュとポップができるようになっています。}stmdbの例はR13の示すアドレスよりR4、R5、R6、R7、R9、R14をプッシュし、プッシュしたアドレス分R13を更新します。ldmiaの例はプッシュしたレジスタをポップし、R13を更新します。R13はスタックポインタの役割をします。アボートなどがあります。例外ベクタにはSH-2Aのようにジャンプ先アドレスではなく、ジャンプ命令そのものを順番に書いておく方式が採用されています。順番は下記の表のようになっており、リセット例外が0番目と決まっています。高速割り込みリセット信号が入力されると0番地へ一旦飛び、そこに書かれてあるジャンプ命令が実行される仕組みになっています。実際には以下のようにブランチ命令ではなく、PCへのロード命令で行うことが多いようです。=FIQHandlerARMではPCへ値を代入する命令があり、代入した値の番地にジャンプします。これはブランチ命令が-32MB~+32MB空間までしかジャンプできないため、メモリ配置によっては目的のプログラムに届かないことがあるためです。ベクタのアドレスは0番地とFFFF0000番地が選べますが、多くの場合ブートモードによって決まっています。0番地の設定をローベクタ、FFFF0000番地の設定をハイベクタと呼んでいます。任意のベクタアドレスに設定するにはVBARというコプロセッサのレジスタに値を書き込みます。これはSuperHのVBRに相当します。ちなみに、JTAGエミュレータのデバッグ機能としてベクタキャッチブレークというのがあります。これを使えばメモリアボートなどの例外発生時にブレークをかけることができますので、プログラムが暴走した時のデバッグに役立ちます。ブートシーケンスARMではリセット時のブートシーケンスにも一癖あるので注意が必要です。SuperHではリセットがかかると、リセットベクタから命令通りに動作しますが、ARMでは一旦、チップに内蔵されている固定のROMコードを経由して、ブートのデバイスを選択する処理が動作します。CPUはROM以外にもブートのデバイスを選ぶことができ、SDカードやLAN、シリアルポートなどからブートすることができます。SDカードからブートする場合は、以下のようなシーケンスとなります。実際にはSDカードから固定ファイルを読み出すために、1次ブートローダをRAMに展開して動作させるCPUもあります。このようにCPUをブートさせるために複雑なシーケンスと、かなりの量のプログラムコードが実行されることになります。JTAGエミュレータでデバッグを行う際に、チップベンダの仕様によってはリセット番地できっちり止めることができず、内蔵ROMのコードが少しだけ実行されてしまうことがあります。このようになると初期化が中途半端な状態になり、デバッグのときにメモリへアクセスできなかったり、RUNさせるとすぐに暴走するなどの現象を引き起こす場合があります(この現象を業界用語で「チョロ走り」といいます)。RZ/A1ではリセット番地できっちり止めることができますので、こういう面でも安心できます。キャッシュ多くのARMコアにはキャッシュが搭載されています。1次キャッシュと2次キャッシュがあり、1次キャッシュはプログラム領域とデータ領域の2系統を別々にキャッシュすることができます。Cortex-Aクラスのコアでは当たり前のように大容量(128KB以上)の2次キャッシュが搭載されています。エンディアンARMは基本的にリトルエンディアンのCPUです。ビッグエンディアンで動作させることも可能ですが、ARMのシステムとしては主流ではありません。ちなみに、ARMにはbig.LITTLEという技術がありますが、これは省電力を目的としたマルチコアの制御のことで、エンディアンとは関係ありません。FIFO)と呼ばれる内蔵メモリをトレースバッファとして使うデバッグ機能が搭載されています。JTAGエミュレータがETB/ETFをサポートしていれば、数Kサイクル程度の命令実行の履歴を残すことができます。これを使えば、不正な例外処理や、エラー発生時の原因調査ができますので非常に便利です。ARM社が提唱しているデバッグ機能は他にも強力なものがありますが、これらを搭載するかどうかはARMチップベンダの判断となっています。ETB/ETFについては基本的なデバッグ機能として、多くのチップベンダが自社のCPUに搭載しています。コンパイラは何を選べばいいかARMコアに対応している主なコンパイラを下記の表に示します。ARM純正コンパイラ、64ビット版もある。Cortex-M/Rなどマイクロコントローラに特化した製品。サードパーティでは高い実績がある。当社の一部の製品でも使用。TI製のチップをサポート。有償版があり、サポートもOK。日本ではAICが窓口。Studiosがサポート。ルネサス向けのGNUコンパイラ。Cortex-M/Rなどマイクロコントローラに特化したGNUコンパイラ。LinuxがメインだがWindows用GNUコンパイラも利用可能。studioという統合開発環境がありますので、強力なコンパイラと統合開発環境を無償でそろえることができます。License)があり、「ソースコードを公開しなければならない」と思っておられる方も多いと思いますが、GPLのライブラリと一緒にリンクしなければこの問題は避けられます。組込み用ではNewlibというフリーソフトウェアの標準Cライブラリがあり、これを使えばソースコードの公開を回避できます。Cは最終的に責任をもってサポートしてくれるところがないのですが、使い方やバグ情報はネット上にアップされており、参考にできる資料がたくさんあります。Cを使用していますが、コンパイラのバグや使い方で問題となったことはほとんどありません。製品開発時にきっちりとしたサポートを望まれる場合は、ARM純正またはIARシステムズのコンパイラを選択されるとよいでしょう。OSの選択はどうするかARM対応しているOSにはμITRON系、Linux、TOPPERS、RTXなど各種あります。ARMで使える主なOSを以下の表にまとめました。μITRON系RTOSとして国内では人気のあるOS。μITRON系RTOS。オープンソースのμITRON系RTOS。ライセンス既定に従えば無償での使用が可能。TOPPERS/ASPをベースにパッケージ化された製品。様々な組織やチップベンダから提供されている。ロイヤリティフリーの軽量RTOS。SuperHを使われてきた方であれば、ミスポのNORTiをご存知の方も多いのではないかと思います。NORTiはARM用も充実しており、各社のARMコアに対応しています。ルネサスのRZ/A1用もあり、当社のRZ/A1のボード用にもシリアルポートとLANがすぐ動くサンプルが用意されています。OSにこだわらなければRTXというロイヤリティフリーのRTOSもあります。これはもともとCortex-M用に開発されたものですが、ルネサスのホームページからRZ/A1用に移植したものをダウンロードすることができます。システムコールの呼び出しはμITRONと異なりますが、RTOSの概念としては共通するものがありますので、選択肢として検討の価値はあります。Cortex-Aクラスのコアを搭載したチップには、ほぼ組込みLinuxが搭載されており、当社でもLinuxを使用した製品をいくつかリリースしています。オープンソースの強力なミドルウェアやアプリケーションが無償で使用できるというメリットは大きいですが、反面、カーネルやドライバを自社ターゲットで動作させるためのハードルは高いです。ドライバやミドルウェアをそろえるにはARMの各チップベンダからは、ほとんどと言っていいほど、周辺I/O用のドライバサンプルが提供されていますので、ひと昔前に比べると開発工数がかなり削減できます。主なミドルウェアもオープンソースのものが充実してきていますので、サポートを気にしなければ安価にシステムを構築できるようになっています。RZもルネサスのホームページからドライバがダウンロードできるようになっています。自社のターゲットで動かすにはカスタマイズが必要ですが、ここでもドキュメントが日本語で用意されているので、比較的移植は簡単に行えます。ミスポのNORTiにはカーネルのほかにTCP/IPプロトコルスタックが標準でついていますので、NORTiを採用される場合はTCP/IPのミドルウェアを改めて導入する必要がありません。開発ボードとJTAGエミュレータ自社でボードを開発される場合でも、お手本となる開発用のリファレンスボードは必要です。ボードがなくても開発は進められますが、あった方がはるかに開発効率は上がります。市販されているボードには、周辺デバイスを制御するドライバも用意されていることが多いので、ハードもソフトもそれに習って開発すれば、工数がかなり短縮できます。ARMのリファレンスボードも少し前までは高価でしたが、今では数千円から数万円で購入できますので、開発のための初期投資が楽になりました。ちなみに、当社でもRZ/A1Lのボードを7,700円(税込)で販売しています。組込みソフトウェアの開発にJTAGエミュレータは欠かせない存在です。JTAGエミュレータにはARM純正品や、海外製の安い製品、中にはJTAGエミュレータの回路を取り込んだリファレンスボードまであります。これらのほとんどが、Eclipseベースのデバッガと接続して使用できるようになっています。デバッグの工数は開発工程の30%~50%を占めると言われています。デバッグツールに接している時間は思っている以上に長いため、使い慣れたツールを使うのが結局のところ工数短縮につながることになります。ARMを使っていますが、自分たちのツールを自ら使うことで、機能や使い勝手をツールにフィードバックしています。CPUへの対応を行っています。下記は最近、動作確認を行ったボードの一覧表です。ARM64でのみ使用可能です。RZを採用したときの環境のまとめRZ/A1を採用する場合に、おすすめできる開発環境の組み合わせを表にしました。上から組み合わせの価格が安い順に並んでいます。CとRTXとJ-Linkを組み合わせて使えば、最も安く開発環境をそろえることができます。ソフトウェアにはサポートがありませんので、何か問題が発生しても自力で解決していく力量が必要になります。J-Linkのハードウェアが故障した場合、海外のメーカへ直接修理を依頼する必要がありますので、タイトな開発プロジェクトでは避けた方が無難かもしれません。studio+NORTi+PALMiCE3の組み合わせをおすすめします。使い慣れたRTOSと、強力な開発環境をリーズナブルな価格でそろえることができます。記事に関するご感想やお問い合わせは、下記フォームよりお送りください。問必須ご記入頂きましたら1回だけクリックしてくださいこのサイトは、プライバシー保護のため、TLS/SSL暗号化通信を導入しています。reserved.当社ページではJavaスクリプトを使用しています。情報が正しく表示されない部分があります。