9

受け入れる関数を宣言しconst char*、文字列リテラルを渡すと、

警告:[2066]割り当てにおける型修飾子の不一致

文字列リテラルはrom const char*。逆も同じです。

PICはハーバードアーキテクチャですが、メモリは1つの連続したアドレス空間にマップされるため、理論的には、RAMポインタとROMポインタの両方を同じ方法でサポートできるはずです。おそらく、RAMポインタは16ビットであるのに対し、ROMポインタは24ビットであるため、ROMポインタを使用する必要があります。

ただし、aconst char*をaにキャストするだけでconst rom char*は機能しません。

4

2 に答える 2

4

残念ながら、これはMicrochipC18コンパイラの固有の制限です。C18のポインタは、ROMまたはRAMのいずれかを指すことができますが、両方を指すことはできません。

これが、たとえばMicrochipApplicationLibrariesでROMおよびRAM操作の重複した関数が見つかる理由です。

BYTE* TCPPutString(TCP_SOCKET hTCP, BYTE* Data);
ROM BYTE* TCPPutROMString(TCP_SOCKET hTCP, ROM BYTE* Data);

Hi-Tech PICC-18コンパイラには、実行時に決定される適切なアドレススペースがあり、より柔軟なポインタの使用が可能になります。これが私がPICC-18を支持してC18を捨てた理由の1つです。

詳細については、この質問への回答とJohnTemplesによるハイテクPICC-18とMPLABC18の比較を参照してください。

于 2011-05-17T11:59:48.867 に答える
2

mizoの答えに追加する(私は主にArduino.SEとEE.SEで答えるので、コメントすることはできません)

XC8コンパイラには、実行時に適切なアドレス空間を決定する機能もあります。

そうです、Hi-Tech PICC-18はこれを行いますが、これを行うコンパイラはこれだけではありません。

現時点ではコンパイラの切り替えが不可能かどうかは理解できましたが。


そのため、次の関数を使用することをお勧めしますstring.h

/** @name memcpypgm2ram
 * The {\bf memcpypgm2ram} function performs a {\bf memcpy} where
 * {\bf s1} points to data memory and {\bf s2} points to program
 * memory.
 * @param s1 pointer to destination in data memory
 * @param s2 pointer to source in program memory
 * @param n number of characters to copy
 */
void *memcpypgm2ram (auto void *s1, auto const MEM_MODEL rom void *s2, auto sizeram_t n);

/** @name memcpyram2pgm
 * The {\bf memcpyram2pgm} function performs a {\bf memcpy} where {\bf s1} 
 * points to program memory and {\bf s2} point to data memory.
 * @param s1 pointer to destination in program memory
 * @param s2 pointer to source in data memory
 * @param n number of characters to copy
 */
MEM_MODEL rom void *memcpyram2pgm (auto MEM_MODEL rom void *s1, auto const void *s2, auto sizeram_t n);

そして、あなたはあなたの関数を次のようにすることができます:

void YourStringFunction(ramstring);

void YourStringFunctionAccpetingRom(romstring){
YourStringFunction(memcpypgm2ram(romstring));
}

^これは実際のコードではなく、より多くの疑似コードです。また、それが効率的かどうかもわかりません。

于 2015-04-03T08:52:32.243 に答える