[英]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.