2012-06-12 4 views
3

Я портирую T6963-based LCD driver из AVR-GCC на компилятор микрочипа C18. Я видел макрос «pgm_read_byte»: кто-нибудь знает, как переносить этот макрос?Как перенести макрос pgm_read_byte (AVR-GCC) в компилятор Mircrochip C18?

UPDATE

От here я могу увидеть реализацию макро

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

ответ

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

тех макросов должны быть переносимыми без каких-либо проблем, они просто накладывают имена других функций/макросов. Что конкретно у вас возникли проблемы с? Что вы пробовали до сих пор, и что пошло не так?

+0

Спасибо за ваш ответ, проблема даже __LPM ((uint16_t) (address_short)) не существуют в C18 (он больше используется как 'pgm_read_byte'), поэтому они ищут решение или обходное решение. –

+0

@ Максвелл. Это совсем другая проблема. У вас не возникли проблемы с переносом этого макроса, вы хотите портировать функцию, которая вызывается макросом. Если вы можете предоставить тело оригинальной функции __LPM вместе с вашей портированной версией, мы могли бы пройти несколько советов. – bta

+0

Извините, может быть, вопрос был не совсем ясен (я был слишком сонным ночью). Я добавил тело _LPM в вопрос. Благодаря! –

2

AVR - это архитектура Гарварда, а макросы pgm_read_ служат для доступа к флэш-памяти 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