組込み

ローエンドマイコンにおける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] setlocaleは誰も使わないかもしれないが...

今回もR8CおよびM16C用の純正コンパイラNC30付属の標準ライブラリの話題です。今回取り上げるのは setlocal.c です。名前からもわかるように、setlocale関数を定義しています。

このソースコードは、最初は1999年に書かれたもののようです。改訂履歴がありませんので、おそらくはCopyrightの年を変えただけで、実際のコードは何も修正されてこなかったのだろうと思います。普通なら、十数年の実績があるコードといえるわけですが、実際にはベンダも含めてまともに使った、あるいは評価した人は誰もいないのではないかと思います。

この関数の最初の部分は第一引数の正当性を評価していますが、括目してよく見ると、とんでもないバグが見えてきます。

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

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

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

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

マイコン メモ

ここでは、各種マイコンに関する備忘録を書き留めていきます。

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を使う機会が増えてきそうな予感がしているので、改めて開発環境について調査してみました。今回は、ほんの触りだけですが、そのレポートをしてみたいと思います。

ハードウェアとソフトウェア両方の開発依頼が増えています。

数か月前から、急にハードウェアとソフトウェアの両方が必要となる開発依頼が増えています。ハードウェアだけの業者やソフトウェアだけの業者は多々ありますが、両方を一度に依頼できるところは意外に少ないからかもしれません。

実際、両方を一社で行えば、ハードウェアとソフトウェアの切り分けも適切に行うことができますし、開発期間の短縮や工数の縮小を図ることも可能です。

コンテンツ配信