C++

『組込み現場の「C++」プログラミング 明日から使える徹底入門』をウェブ上に全文掲載しました。

ずいぶんご無沙汰しています。

タイトルの通りなのですが、このたび株式会社クローバーフィールドのウェブサイトに『組込み現場の「C++」プログラミング 明日から使える徹底入門』を全文掲載しました。

URLは下記の通りです。

http://embedded.cloverfield.jp/組込み現場の「c++」プログラミング/

構成途中の原稿をベースにしたので、書籍の内容とは若干異なっていると思います。
結果、校正時に直した間違いが残っている可能性が十分あります。

もし、何か気づかれた場合は、株式会社クローバーフィールドまでご連絡いただければ幸いです。

組込みエンジニアを募集しています。

現在、弊社とも関係が深い株式会社クローバーフィールドで、CまたはC++が使える組込み系のエンジニアを募集しています。
少なくともスタート時点では、クローバーフィールド社内での開発に関わっていただきます。

経験者、未経験者ともに募集中ですので、興味のある方はお問い合わせください。
その際、簡単な自己紹介と職務経歴書を添えていただけると助かります。

ローエンドマイコンにおけるC++プログラミング

以前から、R8C Tinyを中心にC++の開発環境について調査してきました。その後、H8 Tinyについても同様の調査を行いました。さらに、少しではありますが、AVRについても調査を行いました。特に、H8 TinyとAVRについてはGCCでもC++を使えますので、開発環境は選択肢が増えます。

[R8C][M16C] インライン関数とインラインアセンブラとテンプレートの関係

NC30のC++には、2種類のインライン関数があります。_inlineとinlineです。Cの場合には、これらは単に名前の違いだけで機能的な差異はありません。しかし、C++では全く別のものなので注意が必要です。

_inlineはCでも使える拡張機能で、ごく特殊なケースを除けば、確実にインライン置換されます。その代り、さまざまな制約があります。例えば、_inlineを使ったインライン関数内で静的オブジェクトを宣言すると、警告が出た上、翻訳単位ごとに別の実体が生成されます。また、再帰呼び出しもできなければ、関数へのポインタも取得できません。

inlineを使ったインライン関数はC++の仕様に基づきますが、デフォルトではインライン置換されません。インライン置換させるためには、-Ostatic_to_inlineおよび-Oforward_function_to_inlineオプションを付けてコンパイルする必要があります。もちろん、これらのオプションを付けたからといって、必ずインライン置換されるわけではありません。

[R8C][M16C] #pragma ADDRESSの調査

NC30には、指定したアドレスにオブジェクトを配置するための#pragma ADDRESS指令があります。これは通常、SFRにアクセスするために用いるもので、*(volatile unsigned char*)0x0052 などと書くより便利です。また、1ビットのビットフィールドにアクセスする場合には、bset などのビット命令に展開されるという強みもあります。

今回、まず初めに調査したのは、CとC++に共通した内容として、#pragma ADDRESSで使用したオブジェクトを直接使用した場合は効率のよいコードが生成されるけれども、ポインタや(C++の場合は)参照を使って間接的にアクセスした場合はどうかということです。実際試してみた結果、間接的にアクセスした場合はビット命令は生成されず、通常のオブジェクトと同じように扱われることが分かりました。

次に調査したのは、C++で#pragma ADDRESS指令を使う場合、オブジェクト名の指定はどの程度のことができるのかということです。というのは、Cであればオブジェクト名は単純な識別子で必ず表現できますが、C++の場合は、名前空間やクラス名やテンプレート引数が絡んでくるからです。

[R8C][M16C] NC30標準ライブラリのメモリ効率

R8CおよびM16Cの純正コンパイラNC30に付属している標準ライブラリを評価しています。弊社では、M16CよりはR8Cを使う機会が多いため、ローエンドのマイコン用ライブラリとしてどうかという観点で見るように心がけています。

ローエンドのマイコン用ということであれば、実行効率よりはメモリ効率の方が重要になるケースが多いはずです。特にRAMの使用量はかなり気になります。通常、シングルチップのマイコンというのは、ROMとRAMの両方を内蔵していますが、ROMよりRAMの方が圧倒的に小さいからです。そういう意味では、NC30付属の標準ライブラリにはいろいろと荒が目立ちます。

NC30の場合、標準ライブラリのソースファイルは以下の場所に格納されています。

itoaのテンプレート化

以前、「itoaを自作する」という記事を連載しました。そのときの最後に、itoaをC++のテンプレートを使って効率化する方法をそのうち書くことを予告しました。今回は、その内容になります。

テンプレート化するにあたって、まずは何をテンプレート引数にするかを考えなければなりません。最も安易な方法は、整数値の型と文字型をテンプレート引数にするというものです。

NC30で日本語識別子を使う

今回は、ルネサス製のマイコンM16CおよびR8C用のC/C++コンパイラであるNC30で日本語識別子を使う方法について考えてみることにします。以前、GCCで日本語識別子を使うという記事を書きましたが、それと同じ方法がNC30でも使えることが分かってきました。つまり、NC30でも国際文字名を使うことができるのです。

R8C/TinyのC++コンパイラ

前回は触りだけでしたので、詳細を小分けにして書いていきたいと思います。今回はルネサスの純正コンパイラNC30のC++コンパイラについてです。

NC30のC++コンパイラは、フロントエンドにEDGを使っているようですので、C++の一般的な部分に関してはある程度安心して使うことができるはずです。ですので、今回はNC30特有の部分、それも(M16Cではなく)R8C/Tiny特有の部分を中心に見ていくことにします。

R8C/Tinyの開発環境

今後、仕事でR8C/Tinyを使う機会が増えてきそうな予感がしているので、改めて開発環境について調査してみました。今回は、ほんの触りだけですが、そのレポートをしてみたいと思います。

コンテンツ配信
このエントリーを含むはてなブックマーク