3

我正在将基于 T6963 的 LCD 驱动程序从 AVR-GCC 移植到微芯片 C18 编译器。我看过宏“ pgm_read_byte ”:有人知道如何移植这个宏吗?

更新

这里我可以看到宏的实现

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

2 回答 2

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))

这些宏应该是可移植的,没有任何问题,它们只是给其他函数/宏的名称起别名。你具体有什么问题?到目前为止,您尝试了什么,出了什么问题?

于 2012-06-12T01:02:32.713 回答
2

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
于 2012-07-27T01:41:24.617 回答