[PIC]C18コンパイラでstrcpy()使用時,文字列セットが出来ない

PICのプログラムをC18コンパイラを使用して開発している場合、以下のコードは正しく動作せず、Bufferに”hello”という文字列がセットされません。
(当然ですが、このコードはVisual C++の様な普通のCコンパイラだと正しく動きます)

char Buffer[32];
strcpy( Buffer, "Hello" );




これは、”Hello”の文字列定数がプログラムメモリに配置されるのに対して、strcpy()関数は指定された番地のRAM(File Register)からデータをReadしようとする為です。

PICはハーバードアーキテクチャを使用しているため、プログラムメモリとRAMのアドレス空間が分離しています。上記のコードでは、”Hello”が保存されているプログラムメモリの番地をRAMの番地と見なして、メモリコピーが行われるため、結果として不正な番地のデータを読み出してしまうことになります。


これを防ぐには、プログラムメモリからデータを読み込むよう明示する必要があります。
C18コンパイラではこのような場合の為にstrcpypgm2ram()という関数を用意しています。

問題のコードを以下の様に変更すると、想定どおりBuffer配列に”hello”という文字列がセットされます。

char Buffer[32];
strcpypgm2ram( Buffer, "hello" );



関連記事

コメントを残す

メールアドレスが公開されることはありません。