1

デバイス: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ビット幅です。

私は同じ質問をに投稿しました

https://electronics.stackexchange.com/questions/56858/absolute-address-of-a-function-in-microchip-xc16

4

2 に答える 2

0

D1私が electronic.stackexchange.com で書いたように、あなたは基本的に についてコンパイラに嘘をついていunsigned longます。これは、軌道に沿って問題を引き起こす可能性が非常に高いです。

D1 で始まるものが C 呼び出し規則に準拠できるコードである場合、D1として宣言するextern void D1(void)必要があり、そのアドレスを取得するすべての構造体メンバーと変数およびパラメーターは として宣言する必要がありvoid (*D1)(void)、これらの値を使用して呼び出すことができます構文(*var)()。変数の目的がわかりません。上記のように、適切に宣言されているかどうかnowPlaying.file1を呼び出すこともできます。function(D1)function()

データの場合は であるconst short D1[]必要があり、アセンブラは必要ありません。C で値を として提供できますconst short D1[] = {...};。コンパイラは、D1 をそのままコード セグメントに挿入する必要がありconstます。

于 2013-02-03T05:59:39.507 に答える
0

dspic フラッシュのサイズは 16 ビットを超える場合があります。パーツには 128kb のコード フラッシュがあります。これを 16 ビットの int にどのように詰め込みますか?

于 2016-05-31T11:38:32.057 に答える