簡體   English   中英

如何將pgm_read_byte macro(AVR-GCC)移植到Mircrochip C18編譯器?

[英]How to port pgm_read_byte macro (AVR-GCC) to Mircrochip C18 Compiler?

我將基於T6963的LCD驅動器從AVR-GCC移植到微芯片C18編譯器。 我看過宏“ pgm_read_byte ”:有沒有人知道如何移植這個宏?

UPDATE

這里我可以看到宏的實現

#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;                   \
}))

根據您發布的鏈接,宏定義為:

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

這些宏應該是可移植的而沒有任何問題,它們只是別名其他函數/宏的名稱。 你有什么特別的麻煩? 你到目前為止嘗試了什么,出了什么問題?

AVR是哈佛架構,pgm_read_宏用於訪問AVR的閃存,閃存位於RAM之外的其他地址空間。

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

#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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM