Как портировать макрос pgm_read_byte (AVR) на 8051

Я пытаюсь перенести драйвер с AVR на 8051. Кто-нибудь знает, как портировать 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;                   \
}))

person Tony Lin    schedule 28.02.2015    source источник
comment
На какой компилятор 8051 вы ориентируетесь? Кроме того, есть ли у вас пример использования этого макроса вместе с тем, как объявляются данные, которые они хотят прочитать?   -  person Jester    schedule 28.02.2015
comment
Привет, Шут, я использую IAR. Образец: пиксели = pgm_read_byte_near(data + b - 1) & 0xaa; Кроме того, __result; в #define __LPM_enhanced__(addr) означает возврат __result?   -  person Tony Lin    schedule 01.03.2015


Ответы (1)


Какой компилятор? Какая марка 8051?

В Keil C51 вам просто нужно пометить память как code, и вы сможете нормально читать из памяти программы. Я думаю, что это работает с кастингом, поэтому вы можете попробовать (*(code uint8_t *)(address_short)).

На некоторых чипах память и кодовое пространство фактически находятся в одном плоском 16-битном адресном пространстве, что позволяет использовать неправильные инструкции (MOVC против MOVX) для успешного доступа к памяти. Эти чипы обычно также могут выполняться из оперативной памяти.

person Ben Jackson    schedule 02.03.2015