C 如何将pgm_读取字节宏(AVR)移植到8051

C 如何将pgm_读取字节宏(AVR)移植到8051,c,assembly,embedded,avr,8051,C,Assembly,Embedded,Avr,8051,将端口驱动程序从AVR连接到8051。 有人知道如何移植pgm读取此宏的字节吗? #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) __L

将端口驱动程序从AVR连接到8051。 有人知道如何移植pgm读取此宏的字节吗?

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

什么编译器?8051是什么牌子的

在Keil C51中,您只需将内存标记为
code
,就可以很好地读取程序内存。我认为这种方法适合于铸造,所以你可以试试
(*(code-uint8\u-t*)(address\u-short))


在某些芯片上,内存和代码空间实际上位于一个平坦的16位地址空间中,因此可能使用错误的指令(
MOVC
vs
MOVX
)来成功访问内存。这些芯片通常也可以在RAM之外执行。

您的目标是哪个8051编译器?另外,您是否有此宏的示例用法,以及如何声明他们要读取的数据?嗨,Jester,我使用IAR。示例:pixels=pgm_read_byte_near(data+b-1)&0xaa;还有,结果如何;在#define(定义)(LPM)中(addr)表示返回(结果)吗?