2012-06-12 69 views
3

我將AVR-GCC的T6963-based LCD driver移植到微芯片C18編譯器。我看過宏「pgm_read_byte」:有誰知道如何移植這個宏?如何將pgm_read_byte宏(AVR-GCC)移植到Mircrochip C18編譯器?

UPDATE

here我可以看到宏

#define pgm_read_byte(address_short) 
pgm_read_byte_near(address_short) 
... 
#define pgm_read_byte_near(address_short) __LPM((uint16_t)(address_short)) 
... 
#define __LPM(addr)       __LPM_enhanced__(addr) 
... 
#define __LPM_enhanced__(addr) \ 
(__extension__({    \ 
    uint16_t __addr16 = (uint16_t)(addr); \ 
    uint8_t __result;   \ 
    __asm__      \ 
    (       \ 
     "lpm %0, Z" "\n\t"  \ 
     : "=r" (__result)  \ 
     : "z" (__addr16)  \ 
    );       \ 
    __result;     \ 
})) 

回答

2

根據您發佈的鏈接的實現,宏定義爲:

#define pgm_read_byte(address_short)  pgm_read_byte_near(address_short) 
#define pgm_read_byte_near(address_short) __LPM((uint16_t)(address_short)) 

這些宏應該是便攜的,沒有任何問題,他們只是別名的其他功能/宏的名稱。 特別是你有麻煩嗎?到目前爲止你嘗試過什麼,出了什麼問題?

+0

謝謝你的回答,問題是即使__LPM((uint16_t)(address_short))不存在於C18中(它更多地用作'pgm_read_byte'),所以我正在尋找解決方案或解決方法。 –

+0

@ Maxwell-完全是一個完全不同的問題。你在移植這個宏時沒有問題,你想移植一個恰好被宏調用的函數。如果您可以提供原始__LPM函數的主體以及您的移植版本,我們可能會傳遞一些提示。 – bta

+0

對不起,也許這個問題還不夠清楚(我晚上太困了)。我在問題中添加了_LPM的主體。謝謝! –

2

AVR是哈佛架構和pgm_read_宏用來訪問駐留在比RAM的其他地址空間AVR閃存。

在具有線性地址空間的目標,你可以只使用指針來訪問數據:

#if defined (__GNUC__) && defined (__AVR__) 
#include <avr/pgmspace.h> 
#else 
#include <stdint.h> 
#define PROGMEM /* empty */ 
#define pgm_read_byte(x) (*(x)) 
#define pgm_read_word(x) (*(x)) 
#define pgm_read_float(x) (*(x)) 
... 
#endif