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

AVR はハーバード アーキテクチャであり、pgm_read_ マクロは、RAM 以外のアドレス空間に存在する AVR のフラッシュ メモリにアクセスする役割を果たします。

線形アドレス空間を持つターゲットでは、ポインターを使用してデータにアクセスできます。

#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 に答える
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 に答える