|
发表于 2013-4-10 09:27:00
|
显示全部楼层
不同MCU的体系结构不同,数据存储格式会有区别。
在AVR GCC中,由于读取PROGMEM区域要使用LPM指令,
函数在实现的时候内嵌汇编完成操作,我们以pgm_read_word(address_short) 为例,
具体在pgm space.h中如此定义:
#define pgm_read_word(address_short) pgm_read_word_near(address_short)
#define pgm_read_word_near(address_short) __LPM_word((uint16_t)(address_short))
#define __LPM_word_enhanced__(addr) \
(__extension__({ \
uint16_t __addr16 = (uint16_t)(addr); \
uint16_t __result; \
__asm__ \
( \
"lpm %A0, Z+" "\n\t" \
"lpm %B0, Z" "\n\t" \
: "=r" (__result), "=z" (__addr16) \
: "1" (__addr16) \
); \
__result; \
}))
在单片机应用系统中,一般编译结果分段存储在FLASH中,
开机硬件会拷贝相应的代码段至RAM区,这就是所谓的全局变量。
因为单片机的FLASH支持按字节读取数据,为了节省RAM,常量尽量被写入FLASH区域。
Realview MDK 为ARM系列单片机开发平台,编译器不同,定义自然会有区别。
FLASH是按扇区擦除,可能会破坏其他数据,系统若支持IAP可以直接对FLASH区域编程,
存储固件的区域一般会被硬件保护。
|
|