デバイス:dsPIC33FJ128GP802
私は次のようにいくつかの*.sファイルを持っています
.global _D1
.section .speex, code
_D1:
.pword 0x66C821, 0x1B0090, 0xD96C36, 0x9B60B0, 0xDD4E36, 0xBF4E53
.pword 0xD1098B, 0x719BD9, 0x873989, 0x003B69, 0x279035, 0xED4244
.pword 0xE1403C, 0x54D439, 0x826550, 0xC59627, 0xDD0432, 0x88FA29
私は*.hで同じことを宣言しました
extern void D1(void);
今、私はD1をテーブル読み取り関数に渡しています
nowPlaying.file1 = (unsigned long) D1;
function(nowPlaying.file1);
私の問題は、D1のアドレスが0x8000を超える場合、ルーチンが正しくないことです。大小のコードモデルを試しましたが、結果は同じです。これは、ポインタの16ビット制限によるものだと思います。コードから直接D1の絶対アドレスにアクセスする方法はありますか?組み込み関数やマクロのようなものかもしれません。
コンパイラのマニュアルには次のように書かれていることに注意してください。
MPLAB XC16 Cコンパイラは、関数へのポインタを完全にサポートしているため、関数を間接的に呼び出すことができます。関数ポインタは常に16ビット幅です。
私は同じ質問をに投稿しました