PSoC > PSoCの実験 > Cコンパイラ使用メモ

PSoC/PSoCの実験

このページの目次

PSoCマイコンでのCコンパイラの使用

  • コンパイラの入手法、ライセンス登録方法については、 こちらで解説しております。

constポインタとnon constポインタに注意

PSoCマイコンは「ハーバード・アーキテクチャ」を使用しており、リニアなアドレス空間ではなく、ROM、RAM、レジスタがそれぞれ別なアドレス空間になっています。したがって、アドレスの値そのものでは、その値の指し示す先がROMなのか、RAMなのかを区別する事ができません。

したがって、ポインタは宣言する時にconst修飾子を付けることで明示的にROMにアクセスする事を指定します。

今まで、こういったアーキテクチャのCPUを扱った事が無かったので、最初悩みました。^^;

実際にコンパイルして実験してみる

ポインタ間の1バイトメモリーコピーのテスト処理を作成してアセンブラの展開を比較してみます。まず、以下の2つの関数をご覧下さい。違いは、コピーソースがconstであるか否かです。

void ConstMemCpy(char* dst,const char* const_src);
/** constポインタからnon-constポインタへのメモリコピーテスト
 * @param dst コピー先のnon-const charポインタ
 * @param const_src コピー元のconst charポインタ
 */
void ConstMemCpy(char* dst,const char* const_src){
	*dst = *const_src;
}
void MemCpy(char* dst,char* src);
/** non-constポインタからnon-constポインタへのメモリコピーテスト
 * @param dst コピー先のnon-const charポインタ
 * @param src コピー元のnon-const charポインタ
 */
void MemCpy(char* dst,char* src){
	*dst = *src;
}

アセンブラ展開は以下のようになりました。

#ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (src_diff(const_nonconst).gif)

ソース1が右側で、差分部分は黄色いマーキングを入れました。 違いは、constからコピーするソース1では、差分部分にromx命令が入っています。 romxは、ROM内データをアキュームレータ(Aレジスタ)に格納する命令です。 したがって、PSoCではマイコンのアーキテクチャの関係で、constか否かを厳密にコーディングする必要がありますね。




アクセスカウント(累計) : - アクセスカウント(本日) : - アクセスカウント(昨日) : -

最終更新:2014年01月31日 23:49