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;
}

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

src_diff(const_nonconst).gif

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




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


添付ファイル: filesrc_diff(const_nonconst).gif 699件 [詳細]

トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-01-12 (金) 00:39:29 (4629d)