プログラミング

[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の場合、標準ライブラリのソースファイルは以下の場所に格納されています。

マイコン メモ

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

itoaのテンプレート化

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

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

『絶対現場主義 C#入門』を購入しました

仕事でC#を使うこともそれなりにあるというのに、実は、これまで体系的に勉強したことがありませんでした。とはいえ、今さらその辺の入門書を読む気にもなれず、ずるずる来ていました。けれども、ちょうど実装者こと丸岡孝司さんが『絶対現場主義 C#入門』を書かれたということなので、いい機会なので購入して勉強することにしました。

itoaを自作する その5

かなり引っ張ってしまいましたが、今回で最終回です。これまでに実装したutoa関数を使ってitoa関数を実装することにしましょう。

itoaを自作する その4

今回は、最後に残った方法、すなわち再帰を使ってitoa関数を実装する方法についてです。例によって、「itoa関数を自作する」というタイトルにはなっていますが、まずはutoa関数を作っています。このutoa関数を使ったitoa関数の実装については、次回に書くことを予定しています。

itoaを自作する その3

今回は、いったん逆の並びの文字列を作っておき、後からそれを逆に並べ替える方法についてです。前回同様、「itoa関数を自作する」というタイトルにはなっていますが、まずはutoa関数を作っています。

コンテンツ配信