关于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函数还有什么意义吗? PutCharSerial(“你好!!!");//往串口发送数据串
这个发送的数据只是ASC码,并没有读到flash,最简单的测试是直接发送一个变量,变量定义在FALSH中,你再操作看看撒 PutCharSerial(“你好!!!"); 中的"你好!!!"同时存在于FLASH与RAM中,不是直接从FLASH里面读出来,而是从FLASH加载至RAM中,再发送到串口.
本贴被 my2jia 编辑过,最后修改时间:2008-09-17,16:44:17. 人气真低啊,都没人回复,算了,请版主删了吧。 建议楼主去查下程序是如何编译的链接的。 什么是text段,什么是已初始化段,什么是未初始化段。
AVR的flash和ram并不像ARM等32位处理器那样统一编址,这就导致了读两块空间必须使用不同的指令。所以程序中是需要你自己去制定改放在哪。 我现在是这样考虑的,对不对请大家自己判断。
1、PutCharSerial(“你好!!!");//往串口发送数据串
2、const char flash_str1[] PROGMEM= "大家好!!!"
对这两种方式,在生成HEX文件并烧写进FLASH里面的时候,都是存在FLASH里面的。
第一种方法是在执行程序的时候,编译器会用自己生成一段程序把FLASH里面的
“你好!!!”拷贝到RAM里面,然后再发送到串口。
具体生成的这一段程序在拷贝过程中有没有调用上述三个读FLASH程序,我不能确定。
第二种方法是直接从FLASH里面读取数据发送到串口,中间不需要占用RAM。
页:
[1]