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" ); |
関連記事
コメントを残す