2013-02-02 95 views
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

+0

請澄清,因爲你已經多次被問過,.s文件中的東西是真的代碼還是數據;請定義'功能不正確';並請繼續在這裏的整個對話而不是回到electronics.stackexchange.com它來自哪裏。否則,我根本看不到你在這裏發佈的觀點。 – EJP

回答

0

正如我在寫electronics.stackexchange.com,你基本上是騙來的編譯器有D1,通過鑄造,爲unsigned long,當它根本不是無符號的。這很可能導致賽道出現問題。

如果開始在D1的東西代碼,可以符合C調用約定,D1應被宣佈爲extern void D1(void),所有的結構成員和變量,並且利用其地址參數應該聲明爲void (*D1)(void),你可以使用語法(*var)()通過這些值進行調用。我不知道nowPlaying.file1變量的用途是什麼:如果function()正確聲明,也可以直接撥打function(D1),即如上所述。

如果是數據,它應該是const short D1[],而且您不需要彙編程序:您可以將C中的值提供爲const short D1[] = {...};。編譯器應該將D1放入代碼段,因爲它是const

+0

@downvoter請解釋。告訴我們爲什麼函數指針不應該使用爲此目的而提供的語法來輸入,爲什麼它優於將其轉換爲無符號長整數和後退整數。 – EJP

0

dspic flash size可以大於16bits。你的部分有128kb的代碼閃存。你想如何填充16位整數?