搜索
bottom↓
回复: 18

关于char flash *str

[复制链接]

出0入0汤圆

发表于 2009-4-25 09:21:31 | 显示全部楼层 |阅读模式
马老师,你好.
今天看你的教程,其中在"通用点阵字符LCD显示器应用"中的一段程序中出现关于指针定义;

char flash *str

这个里面加了个flash是什么意思啊?谢谢!

出0入0汤圆

发表于 2009-4-25 13:27:45 | 显示全部楼层
编译器存储器类型修饰。
表示指针指向的变量需要被保存在Flash中。

该修饰符属于编译器扩展,不通用。建议用宏实现。

出0入0汤圆

 楼主| 发表于 2009-4-25 15:41:23 | 显示全部楼层
首先感谢楼上兄台.

我就是不大明白为什么要这么用..

这样用和我直接flash char *str有什么不一样...同样都在flash中进行定义啊.?

出0入0汤圆

发表于 2009-4-25 18:17:31 | 显示全部楼层
char flash *str ===>定义一个指向在FLASH中的char型的指针,而该指针存放在RAM中。(必须在RAM中,这样指针才能变化)
flash char *str ===>定义一个指向在RAM中的char型的指针,但指针存放在FLASHM中。(这个指针基本是不能用的了,因为FLASH中的变量其值不能改变)。

=============================================
改正:

flash char * flash str ===>定义一个指向在RAM中的char型的指针,但指针存放在FLASHM中。(这个指针基本是不能用的了,因为FLASH中的变量其值不能改变)。

出0入0汤圆

发表于 2009-4-25 19:55:37 | 显示全部楼层
To 3#
请指名您使用的编译器系统的名称。有可能您的表述是正确的。
但通常而言,您的表述有问题。

对于该问题的十分具体的描述,我没有查标准。

但是通常而言,表述如下:
定义:A * B C
表达:C是一个指针变量;C本身的类型修饰由B给定;A表示C指向的类型的修饰。
描述:const int * const ptr;首先ptr是一个指向int的指针;然后*ptr=xx这样的赋值不行,因为第一个const;ptr=xxx这样的也不行,即便xxx有强制类型转换,也不行,因为第二个const。

因此,基于此推论,并且结合Keil C51的用法:
char flash * ptr一般来说等价于flash char * ptr。ptr在RAM,指向Flash。
char * flash ptr,ptr在Flash,变量在RAM。

由于flash关键字为编译器扩展,具体情况 必须 通过查阅编译器手册确定。

出0入0汤圆

发表于 2009-4-25 21:21:41 | 显示全部楼层
谢谢楼上的纠正,我记错了。

下面是CVAVR中的说明:

/* Pointer to a char string placed in SRAM */
char *ptr_to_ram="This string is placed in SRAM";

/* Pointer to a char string placed in FLASH */
flash char *ptr_to_flash1="This string is placed in FLASH";
char flash *ptr_to_flash2="This string is also placed in FLASH";

/* Pointer stored in FLASH to a char string placed in SRAM */
char * flash flash_ptr_to_ram="This string is placed in SRAM";

/* Pointer stored in FLASH to a char string placed in FLASH */
flash char * flash flash_ptr_to_flash="This string is placed in FLASH";

出0入0汤圆

 楼主| 发表于 2009-4-27 18:23:15 | 显示全部楼层
后面的没看懂..
暂时就明白马老师的先就好.
char flash *str ===>定义一个指向在FLASH中的char型的指针,而该指针存放在RAM中。(必须在RAM中,这样指针才能变化)
flash char *str ===>定义一个指向在RAM中的char型的指针,但指针存放在FLASHM中。(这个指针基本是不能用的了,因为FLASH中的变量其值不能改变)。

再次感谢马老师和dr2001兄弟

出0入0汤圆

 楼主| 发表于 2009-4-27 18:32:07 | 显示全部楼层
对了,马老师,我买了块你的实验板.请问板的原理图在哪可以找到>!谢谢

出0入0汤圆

发表于 2009-4-27 19:50:42 | 显示全部楼层
楼上:

1。原理图在本站找,另外我编写出版的教程《AVR单片机嵌入式系统原理与应用实践》中也有。
2。你拷贝后面关于flash char *str 的解释是不对的,我已经做了改正。正确的是
   
  flash char * flash str ===>定义一个指向在FLASH中的char型的指针,但指针存放在FLASH中。(这个指针基本是不能用的了,因为FLASH中的变量其值不能改变)。

   char flash *str 和 flash char *str 相同,===>定义一个指向在FLASH中的char型的指针,而该指针存放在RAM中。(必须在RAM中,这样指针才能变化)

出0入0汤圆

 楼主| 发表于 2009-4-28 07:39:03 | 显示全部楼层
噢,明白了.
谢谢!

出0入0汤圆

发表于 2009-10-22 18:00:34 | 显示全部楼层
原来如此

出0入0汤圆

发表于 2009-10-23 09:06:31 | 显示全部楼层
马老师你好, 你说的flash char * flash str 中,第二个flash说明 str指针是存放在FLASHM中的,但前面char之前还加了一个flash怎么还是指向在RAM中的char型的指针,而不是指向flash中的指针呢?我没用过CVAVR的编译器,这一点总感觉有些奇怪。

出0入0汤圆

发表于 2009-10-23 19:46:33 | 显示全部楼层
我写错了,应该是指向FLASH,放在FLASH中

出0入8汤圆

发表于 2009-10-23 20:14:13 | 显示全部楼层
谢谢马老师,我也看明白了.

出0入0汤圆

发表于 2009-10-24 09:46:30 | 显示全部楼层
MARK

出0入0汤圆

发表于 2009-10-26 08:47:51 | 显示全部楼层
嗯,明白了马老师。

出0入0汤圆

发表于 2009-11-21 20:25:17 | 显示全部楼层
flash好像不能指针吧!
eeprom好像可以用,AVR初学者

出0入0汤圆

发表于 2009-11-27 10:20:45 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-12-2 12:42:49 | 显示全部楼层
回16楼:

尽管AVR的RAM已经比较大了,但还是有限。因此如果一组在系统中不需要变化的数据,比如7段数码管的对照表,就可以考虑不放在RAM中,而放在FLASH中,省出RAM可以使用更多的变量。

既然这组数据在FLASH中,就可以使用指针。指针也是一个变量,但必须放在RAM中,因为它是变化的。在RAM中定义一个指针变量,该指针指向FALSH中的数据是完全可以的。

不管使用AVR哪个C平台,这个都需要对标准C进行扩展。每个平台有些不同,应该仔细看平台的使用帮助。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-3 11:10

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表