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;
}
アセンブラ展開は以下のようになりました。
ソース1が右側で、差分部分は黄色いマーキングを入れました。 違いは、constからコピーするソース1では、差分部分にromx命令が入っています。 romxは、ROM内データをアキュームレータ(Aレジスタ)に格納する命令です。 したがって、PSoCではマイコンのアーキテクチャの関係で、constか否かを厳密にコーディングする必要がありますね。
アクセスカウント(累計) : - アクセスカウント(本日) : - アクセスカウント(昨日) : -