函数声明 请指教

[复制链接]
3387|17
 楼主| steven1234 发表于 2007-4-18 09:10 | 显示全部楼层 |阅读模式
下面这个函数声明<br /><br />#define&nbsp;Writeflash(addr,dat)&nbsp;&nbsp;&nbsp;*((volatile&nbsp;unsigned&nbsp;int&nbsp;*)(addr&lt&lt1)=(unsigned&nbsp;int)dat;<br /><br />请问一下,这个函数后面的符号&quot;=&quot;起什么作用啊,在程序中是如何代换的?<br /><br />自己学arm,有很多不明白,请高手指教.
djyos 发表于 2007-4-18 10:14 | 显示全部楼层

往指定地址写一个数啊

代码中好像少了三个括号,多了一个分号,应该是这样吧:<br />#define&nbsp;Writeflash(addr,dat)&nbsp;&nbsp;&nbsp;(*((volatile&nbsp;unsigned&nbsp;int&nbsp;*)(addr&lt&lt1))=(unsigned&nbsp;int)dat)<br />&nbsp;&nbsp;&nbsp;&nbsp;addr为地址,左移是为了与硬件匹配,你的板子应该是用了16位的flash,且cpu地址线a0没有连接,a1直接连到flash的a0.所以cpu的地址对应到flash就要左移1位.地址左移后再把它强制转换成指针,然后赋值.
 楼主| steven1234 发表于 2007-4-18 11:00 | 显示全部楼层

re:

我用的是16bit&nbsp;flash,在写数据进去时,这个代换是如何进行的,为什么中间会有一个&quot;=&quot;号,如果是Writeflash(0x5555,0xaa),这个是如何进行代换的?<br />另外:D0~D15数据线怎么知道有数据传过来啊<br /><br /><br />新手,以上问题请勿见怪.
ayb_ice 发表于 2007-4-18 16:52 | 显示全部楼层

这是带参数的宏定义

这是带参数的宏定义,看起来象函数,可不是函数...
xwj 发表于 2007-4-18 17:01 | 显示全部楼层

宏定义就是有参数的替换,可以是任意字符或指令

编译器扫描文件时碰到Writeflash(参数1,参数2)这样的字符串就会自动替换成<br />*((volatile&nbsp;unsigned&nbsp;int&nbsp;*)(1&lt&lt参数1)=(unsigned&nbsp;int)参数2;<br /><br />不过你那个宏,&nbsp;语法太成问题,编译不过的
平常人 发表于 2007-4-18 20:06 | 显示全部楼层

等号左面不能有运算式,(addr<<1)编译时出错

  
ayb_ice 发表于 2007-4-19 09:30 | 显示全部楼层

6楼说的不对吧...

  
djyos 发表于 2007-4-19 09:47 | 显示全部楼层

替换

#define&nbsp;Writeflash(addr,dat)&nbsp;&nbsp;&nbsp;(*((volatile&nbsp;unsigned&nbsp;int&nbsp;*)(addr&lt&lt1))=(unsigned&nbsp;int)dat)<br />Writeflash(0x5555,0xaa);会被替换成<br />(*((volatile&nbsp;unsigned&nbsp;int&nbsp;*)(0x5555&lt&lt1))=(unsigned&nbsp;int)0xaa)<br />即向cpu的地址0xaaaa写入数据0xaa,cpu的0xaaaa正好对应flash地址0x5555.<br /><br />这种替换在C语言的教材里面都会有讲的,只是前面的移位和类型转换要仔细理解.
 楼主| steven1234 发表于 2007-4-19 14:56 | 显示全部楼层

re

关于:<br />#define&nbsp;Writeflash(addr,dat)&nbsp;&nbsp;&nbsp;(*((volatile&nbsp;unsigned&nbsp;int&nbsp;*)(addr&lt&lt1))=(unsigned&nbsp;int)dat)<br /><br />当程序中有Writeflash(0x5555,0xaa),如何保证数据送到Flash,并且保证0x5555是地址,而0xaa是数据?<br /><br />只有上面的宏义,如何找到Flash的地址,如何让ARM传出数据的,有高手可否详细解释一下,谢谢&nbsp;.
 楼主| steven1234 发表于 2007-4-20 09:16 | 显示全部楼层

求救...想了几天想不明白(初学...痛苦...)

  
xwj 发表于 2007-4-20 09:44 | 显示全部楼层

你先仔细看看C教材中指针那一节,理解这一句的意思再说

(*((volatile&nbsp;unsigned&nbsp;int&nbsp;*)(addr&lt&lt1))=(unsigned&nbsp;int)dat);
 楼主| steven1234 发表于 2007-4-20 10:48 | 显示全部楼层

Re:

(*((volatile&nbsp;unsigned&nbsp;int&nbsp;*)(addr&lt&lt1))=(unsigned&nbsp;int)dat);<br /><br />writeflash(0x5555,0xaa)<br /><br />原来觉的只是将0x5555赋值给addr,然后addr左移一位,然后强制将其转换为unsigned&nbsp;int,并将其定义为指针,<br /><br />现在不明白,为什么要将其定义为指针..有什么作用?<br /><br />请楼上指点一下.
ayb_ice 发表于 2007-4-20 11:16 | 显示全部楼层

LZ精神可嘉,但不爱看书不行...

  
xwj 发表于 2007-4-20 11:24 | 显示全部楼层

晕,感情你是忽略全部括号 的优先运算啊?

  
djyos 发表于 2007-4-20 13:33 | 显示全部楼层

学习提高之道

先看书,肤浅地理解,<br />实践,遇到问题,<br />再看书,深入理解,<br />还是没有理解,问人,<br />弄明白以后,再回去看书,弄明白为什么当初不理解.<br /><br />楼主还是要好好看看书啊,只有书上的是系统而全面的,别人的解答虽然是正确的,但只能针对某一个问题的某一个方面,看书才能举一反三.<br />说句不客气的话,在嵌入式软件领域,你这个问题真的是很基础的问题.<br /><br />言重了,楼主不要砸**蛋.
 楼主| steven1234 发表于 2007-4-20 14:31 | 显示全部楼层

re:thanks

一直在跳者学&nbsp;听了你讲的&nbsp;还是专心看书先&nbsp;。<br /><br />谢谢!
nsearchf 发表于 2007-4-20 17:27 | 显示全部楼层

支持

2楼、4楼、8楼、15楼<br /><br />看来“&nbsp;djyos&nbsp;”自学能力比较强&nbsp;&nbsp;<br />
yangfanyh 发表于 2007-4-24 15:05 | 显示全部楼层

我也在自学

支持&nbsp;djyos&nbsp;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

13

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部