[ZLG-ARM] 请教C代码内嵌汇编地址装载问题!

[复制链接]
 楼主| wlsui 发表于 2007-4-25 11:05 | 显示全部楼层 |阅读模式
在我写的C程序中有一小段代码为了获得较高的执行效率,需要内嵌汇编,但不知道怎样才能正确加载C代码定义的变量地址.<br />比如:<br />在C代码中有如下定义:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;ADData[32]&nbsp;=&nbsp;{0};<br />那在汇编代码中如何将数组ADData的首地址装载入寄存器R1呢?<br />我试过&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;R1,[ADData],但汇编出来的代码却是空语句nop<br />而用&nbsp;LDR&nbsp;&nbsp;&nbsp;R1,=ADData,则会报语法错误<br /><br />请高手指教!
zlgARM 发表于 2007-4-25 22:11 | 显示全部楼层

吴*穗

把ADData[32]设置为全局变量试试,(否则内嵌汇编部分代码会看不到该变量)。<br />或者,你在调用内嵌汇编的函数里声明个数组作试验,看内嵌汇编能不能看到它。<br /><br />赋值的时候,用MOV&nbsp;R1,ADData这样的形式试试。<br />
 楼主| wlsui 发表于 2007-4-26 21:41 | 显示全部楼层

谢谢!

您是...张工?近来还好吧!<br />呵呵(应该不会是陈工吧)<br />您说的那种方法我试过了,但汇编出来的代码也是nop<br />我现在找出了问题及解决的方法,在赵寒星的《ARM开发工具——ADS原理与应用》第120页:<br />“嵌入式汇编和armasm之间的区别”一点中:<br />嵌入汇编器“不支持LDR&nbsp;Rn,=expr伪指令而是使用MOV&nbsp;Rn,expr指令向寄存器赋值;不支持语句标号表达式,不支持ADR和ADRL伪指令”<br />MOV&nbsp;Rn,expr也就是您说的那种方法,我试过了,不行。<br />我现在的方法是将uint32&nbsp;ADData[320]定义为全局变量,然后新建一个汇编文件ADRead.s,在该文件开头使用:<br />AREA&nbsp;&nbsp;&nbsp;&nbsp;globals,CODE,READONLY&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;声明代码段globals,只读属性<br />&nbsp;&nbsp;&nbsp;&nbsp;EXPORT&nbsp;&nbsp;&nbsp;&nbsp;TLC5510_READ&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;可以被外部引用&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;IMPORT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ADData&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;声明外部变量<br />声明就行了。然后在下面写自己的汇编代码。C程序调用时直接写TLC5510_READ().也就是仿照Startup.s和IRQ.s的写法。不过这已经不像是内嵌汇编了.<br />不知道有没有其它更简单的方法。<br />这是我在做毕业设计时遇到的问题.我现在想获得高速AD的数据,但又没有FIFO,所以想通过汇编来实现.<br />现在毕业设计遇到的问题是频率一高什么信号都乱了.20MHz的晶振接入SmartSOPC的带的AD&nbsp;DA&nbsp;PACK时就连输入电源都成20MHz了(泰克所测),用ARM产生5MHz的PWM作为ADC的CLK时就不会出现这种情况.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

263

帖子

1

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