yxlcarter 发表于 2008-9-17 11:52:51

关于GCC编译器对FLASH的操作【恢复】

在看到芯艺的<<AVR单片机GCC程序设计>>里面对

2.4 在程序中访问FLASH 程序存储器

里面介绍了三个函数

pgm_read_byte(prog_void * addr)

pgm_read-word(prg_void *addr)

pgm_read_dword(prg_void* addr)

用于对在FLASH里面数据进行读取操作。

如果我用

PutCharSerial(“你好!!!");//往串口发送数据串

“你好!!!”也是存在FLASH里面,烧写的时候是直接把“你好!!!”写在FLASH里面,执行

PutCharSerial(“你好!!!");//

是直接从FLASH里面读出来,通过串口发送到PC机。

而芯艺的书上,关于在程序中访问FLASH程序存储器。是一定要用上面提供的三个函数,才能从FLASH里面读取数据。

这不是互相矛盾吗?

既然PutCharSerial(“你好!!!");//可以直接从FLASH里面读取数据,提供的三个读FLASH函数还有什么意义吗?

andyjuly 发表于 2008-9-17 16:58:00

PutCharSerial(“你好!!!");//往串口发送数据串

这个发送的数据只是ASC码,并没有读到flash,最简单的测试是直接发送一个变量,变量定义在FALSH中,你再操作看看撒

my2jia 发表于 2008-9-17 16:42:44

PutCharSerial(“你好!!!"); 中的"你好!!!"同时存在于FLASH与RAM中,不是直接从FLASH里面读出来,而是从FLASH加载至RAM中,再发送到串口.





本贴被 my2jia 编辑过,最后修改时间:2008-09-17,16:44:17.

yxlcarter 发表于 2008-9-17 16:37:48

人气真低啊,都没人回复,算了,请版主删了吧。

bozai 发表于 2008-9-18 09:14:17

建议楼主去查下程序是如何编译的链接的。 什么是text段,什么是已初始化段,什么是未初始化段。



AVR的flash和ram并不像ARM等32位处理器那样统一编址,这就导致了读两块空间必须使用不同的指令。所以程序中是需要你自己去制定改放在哪。

yxlcarter 发表于 2008-9-18 08:59:02

我现在是这样考虑的,对不对请大家自己判断。

1、PutCharSerial(“你好!!!");//往串口发送数据串

2、const char flash_str1[] PROGMEM= "大家好!!!"

对这两种方式,在生成HEX文件并烧写进FLASH里面的时候,都是存在FLASH里面的。

第一种方法是在执行程序的时候,编译器会用自己生成一段程序把FLASH里面的

“你好!!!”拷贝到RAM里面,然后再发送到串口。

具体生成的这一段程序在拷贝过程中有没有调用上述三个读FLASH程序,我不能确定。

第二种方法是直接从FLASH里面读取数据发送到串口,中间不需要占用RAM。
页: [1]
查看完整版本: 关于GCC编译器对FLASH的操作【恢复】