菜鸟请教

[复制链接]
 楼主| ayb_ice 发表于 2007-9-20 17:53 | 显示全部楼层 |阅读模式
本人是FREESCALE菜鸟,请教CW6.0(HC08)C中怎样使用NOP指令...<br />还有0~255空间的变量效率较高,是否可以指定变量定位在0~255空间,怎样定位呢...<br />谢谢...
gxs64 发表于 2007-9-20 18:11 | 显示全部楼层

re

请教CW6.0(HC08)C中怎样使用NOP指令----&nbsp;&nbsp;&nbsp;&nbsp;_asm&nbsp;nop;
 楼主| ayb_ice 发表于 2007-9-20 19:52 | 显示全部楼层

请教2楼

第二个问题呢...
JerryBJ 发表于 2007-9-21 10:03 | 显示全部楼层

#pragma:

#pragma&nbsp;DATA_SEG&nbsp;MY_ZEROPAGE<br /><br />unsigned&nbsp;char&nbsp;val1,&nbsp;val2,&nbsp;val3;&nbsp;<br />//......&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />#pragma&nbsp;DATA_SEG&nbsp;DEFAULT
yewuyi 发表于 2007-9-21 14:36 | 显示全部楼层

MY_ZEROPAGE的定义在哪里?

  
 楼主| ayb_ice 发表于 2007-9-21 14:59 | 显示全部楼层

谢谢,赶紧去试一下...

  
 楼主| ayb_ice 发表于 2007-9-21 16:40 | 显示全部楼层

再次请教...

用#pragma&nbsp;DATA_SEG&nbsp;MY_ZEROPAGE这种方法定位在了0页,但是<br />&nbsp;&nbsp;&nbsp;&nbsp;if(i&nbsp;&&nbsp;0x01){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k++;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />这样的代码并没有被编译成位测试转移指令,怎样才能让它产生位测试转移指令...<br />看了一下反汇编,感觉CW远远没有KEIL产生的代码紧凑...<br />即可用位域的方式操作也没有产生位测试转移指令...
yewuyi 发表于 2007-9-21 17:38 | 显示全部楼层

是不是要开优化才会的把?

  
yewuyi 发表于 2007-9-21 17:39 | 显示全部楼层

汇编有没有位测试指令?

  
张明峰 发表于 2007-9-21 22:17 | 显示全部楼层

汇编有位测试指令

7楼的问题属于编译器的优化。并不是每个编译器都能将其译成对应的最精简位测试并跳转指令。<br /><br />你可以将重要的位变量定义成“位域”形式再试试。或者将编译器的优化级别提到最高。
张明峰 发表于 2007-9-21 22:43 | 显示全部楼层

证明

编了一段小程序,证明如下:<br /><br />#pragma&nbsp;DATA_SEG&nbsp;SHORT&nbsp;MY_ZEROPAGE<br />byte&nbsp;arg1;<br /><br />#pragma&nbsp;DATA_SEG&nbsp;DEFAULT<br />byte&nbsp;a1;<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(arg1&nbsp;&&nbsp;0x01)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a1++;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />翻译成汇编:<br />BRCLR&nbsp;0,&nbsp;arg1,&nbsp;*+7<br />LDHX&nbsp;&nbsp;#a1<br />INC&nbsp;&nbsp;&nbsp;,X<br /><br />现在这里不能上传图片,不然可以给你看看截屏图片。<br /><br />还是一句话:发现问题多找找自己的原因。<br /><br /><br />
yewuyi 发表于 2007-9-22 08:37 | 显示全部楼层

请问张工MY_ZEROPAGE在哪里?

我怎么没找到饿?
张明峰 发表于 2007-9-22 09:13 | 显示全部楼层

看PRM文件

/*&nbsp;This&nbsp;is&nbsp;a&nbsp;linker&nbsp;parameter&nbsp;file&nbsp;for&nbsp;the&nbsp;JL8&nbsp;*/<br />NAMES&nbsp;END&nbsp;/*&nbsp;CodeWarrior&nbsp;will&nbsp;pass&nbsp;all&nbsp;the&nbsp;needed&nbsp;files&nbsp;to&nbsp;the&nbsp;linker&nbsp;by&nbsp;command&nbsp;line.&nbsp;But&nbsp;here&nbsp;you&nbsp;may&nbsp;add&nbsp;your&nbsp;own&nbsp;files&nbsp;too.&nbsp;*/<br /><br />SECTIONS&nbsp;/*&nbsp;here&nbsp;all&nbsp;RAM/ROM&nbsp;areas&nbsp;of&nbsp;the&nbsp;device&nbsp;are&nbsp;listed.&nbsp;Used&nbsp;in&nbsp;PLACEMENT&nbsp;below.&nbsp;*/<br />&nbsp;&nbsp;Z_RAM&nbsp;&nbsp;=&nbsp;READ_WRITE&nbsp;0x0060&nbsp;TO&nbsp;0x00FF;&nbsp;<br />&nbsp;&nbsp;RAM&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;READ_WRITE&nbsp;0x0100&nbsp;TO&nbsp;0x015F;<br />&nbsp;&nbsp;ROM&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;READ_ONLY&nbsp;&nbsp;0xDC00&nbsp;TO&nbsp;0xFBFF;<br />END<br /><br />PLACEMENT&nbsp;/*&nbsp;here&nbsp;all&nbsp;predefined&nbsp;and&nbsp;user&nbsp;segments&nbsp;are&nbsp;placed&nbsp;into&nbsp;the&nbsp;SECTIONS&nbsp;defined&nbsp;above.&nbsp;*/<br />&nbsp;&nbsp;DEFAULT_ROM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INTO&nbsp;ROM;<br />&nbsp;&nbsp;DEFAULT_RAM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INTO&nbsp;RAM;<br />&nbsp;&nbsp;_DATA_ZEROPAGE,&nbsp;<font color=#FF0000>MY_ZEROPAGE</font>&nbsp;&nbsp;&nbsp;INTO&nbsp;Z_RAM;<br />END<br /><br />STACKSIZE&nbsp;0x30<br /><br />VECTOR&nbsp;0&nbsp;_Startup&nbsp;/*&nbsp;reset&nbsp;vector:&nbsp;this&nbsp;is&nbsp;the&nbsp;default&nbsp;entry&nbsp;point&nbsp;for&nbsp;a&nbsp;C/C++&nbsp;application.&nbsp;*/<br />//VECTOR&nbsp;0&nbsp;Entry&nbsp;&nbsp;/*&nbsp;reset&nbsp;vector:&nbsp;this&nbsp;is&nbsp;the&nbsp;default&nbsp;entry&nbsp;point&nbsp;for&nbsp;a&nbsp;Assembly&nbsp;application.&nbsp;*/<br />//INIT&nbsp;Entry&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;for&nbsp;assembly&nbsp;applications:&nbsp;that&nbsp;this&nbsp;is&nbsp;as&nbsp;well&nbsp;the&nbsp;initialisation&nbsp;entry&nbsp;point&nbsp;*/<br /><br /><br />实际上这个名字在C语言文件中可以随便取,只要在PRM文件里写明对应的内存区即可。例如你可以写程序:<br />#pragma&nbsp;DATA_SEG&nbsp;SHORT&nbsp;YEWUYI_PAGE0<br />byte&nbsp;arg1;<br />然后修改PRM文件标明:<br />&nbsp;&nbsp;_DATA_ZEROPAGE,&nbsp;MY_ZEROPAGE,&nbsp;<font color=#FF0000>YEWUYI_PAGE0</font>&nbsp;&nbsp;&nbsp;INTO&nbsp;Z_RAM;<br />
yewuyi 发表于 2007-9-22 10:25 | 显示全部楼层

原来被看漏了

只是一个定义,肯定可以随便改名字了……
yewuyi 发表于 2007-9-22 10:26 | 显示全部楼层

谢了老张……

  
张明峰 发表于 2007-9-22 12:45 | 显示全部楼层

楼上不用客气

PRM文件在项目设计中有时非常重要,因为它定义和分配了所有片上内存的资源,包括RAM和Flash-ROM。通过自己改写分配特定的内存区域,你可以将特定的变量指定分配到特定的RAM区间,或者将特定的程序模块放到特殊的Flash空间,或者留出特定的Flash空间用以EEPROM模拟。举几个例子:<br /><br />*&nbsp;定义变量段使其在复位初始化时不被自动清零(C语言编程)<br />SECTIONS&nbsp;/*&nbsp;here&nbsp;all&nbsp;RAM/ROM&nbsp;areas&nbsp;of&nbsp;the&nbsp;device&nbsp;are&nbsp;listed.&nbsp;Used&nbsp;in&nbsp;PLACEMENT&nbsp;below.&nbsp;*/<br />&nbsp;&nbsp;Z_RAM&nbsp;&nbsp;=&nbsp;READ_WRITE&nbsp;0x0060&nbsp;TO&nbsp;0x00FF;&nbsp;<br />&nbsp;&nbsp;<font color=#0000FF>RAM_SV&nbsp;=&nbsp;NO_INIT&nbsp;&nbsp;&nbsp;&nbsp;0x0100&nbsp;TO&nbsp;0x011F;</font>&nbsp;/*非自动清零段*/<br />&nbsp;&nbsp;RAM&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;READ_WRITE&nbsp;0x0120&nbsp;TO&nbsp;0x015F;<br />&nbsp;&nbsp;ROM&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;READ_ONLY&nbsp;&nbsp;0xDC00&nbsp;TO&nbsp;0xFBFF;<br />END<br />在PLACEMENT声明中写<br />&nbsp;&nbsp;RAM_KEEP&nbsp;INTO&nbsp;RAM_SV;<br />程序中定义:<br />#pragma&nbsp;DATA_SEG&nbsp;RAM_KEEP<br />byte&nbsp;arg1;<br /><br />*&nbsp;保留一段Flash作为EEPROM模拟<br />SECTIONS&nbsp;/*&nbsp;here&nbsp;all&nbsp;RAM/ROM&nbsp;areas&nbsp;of&nbsp;the&nbsp;device&nbsp;are&nbsp;listed.&nbsp;Used&nbsp;in&nbsp;PLACEMENT&nbsp;below.&nbsp;*/<br />&nbsp;&nbsp;Z_RAM&nbsp;&nbsp;=&nbsp;READ_WRITE&nbsp;0x0060&nbsp;TO&nbsp;0x00FF;&nbsp;<br />&nbsp;&nbsp;RAM&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;READ_WRITE&nbsp;0x0120&nbsp;TO&nbsp;0x015F;<br />&nbsp;&nbsp;<font color=#0000FF>EEPROM&nbsp;=&nbsp;READ_ONLY&nbsp;&nbsp;0xDC00&nbsp;TO&nbsp;0xDDFF;</font>&nbsp;/*保留512字节做EEPROM模拟*/<br />&nbsp;&nbsp;ROM&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;READ_ONLY&nbsp;&nbsp;0xDE00&nbsp;TO&nbsp;0xFBFF;<br />END<br />在PLACEMENT声明中写<br />&nbsp;&nbsp;EE_DATA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INTO&nbsp;EEPROM;<br />程序中定义数据并可以初始化<br />#pragma&nbsp;CONST_SEG&nbsp;EE_DATA<br />const&nbsp;byte&nbsp;str1[]=&quot;123456&quot;;
yewuyi 发表于 2007-9-22 13:18 | 显示全部楼层

难得教主今天有空讲课,多问点问题。

<br /><br />READ_WRITE&nbsp;定义在哪里?<br />是编译器自己规定的关键字吗?<br /><br />&nbsp;RAM_KEEP&nbsp;INTO&nbsp;RAM_SV;<br />请问INTO的定义在哪里?<br /><br />各个MCU的PRM文件中的关键字基本都一样的,但俺一直不是很明白,<br />俺很少改动PRM文件,印象总好象就是过去NEC的时候改过一次堆栈的大小(不够用了就改大点),基本都是用的default,用C语言,俺是个半吊子。<br /><br />-Z(DATA)NEAR_I,NEAR_Z,NEAR_N,HEAP+_HEAP_SIZE=FE00-FE1F<br />-Z(DATA)CSTACK+_CSTACK_SIZE=FE40-FEFF<br />请问张工这两句怎么理解?<br />俺这么理解对不对?<br />1:-Z(DATA)CSTACK+_CSTACK_SIZE=FE40-FEFF<br />CSTACK地址:FE40<br />_CSTACK_SIZE长度=FEFF-FE40<br />-Z(DATA):初始化数据为0<br />2:-Z(DATA)NEAR_I,NEAR_Z,NEAR_N,HEAP+_HEAP_SIZE=FE00-FE1F<br />NEAR_I,NEAR_Z,NEAR_N,HEAP这4个区域地址分配在同一个地址段FE00-FE1F内<br /><br />这是搞得IAR里面的一段。
张明峰 发表于 2007-9-22 20:18 | 显示全部楼层

IAR我没有用过

关于IAR的两个问题,看字面意思及其惯用的语法形式,你的理解应该是正确的。实际上有关连接定位的配置文件所含的内容描述,可以参考最后生成的MAP文件一起来理解。<br /><br />关于PRM文件中的READ_WRITE、NO_INIT、READ_ONLY、INTO等都是约定的语法关键词,详细可以参考Codewarrior安装后的帮助文件&quot;Build_Tools_Utilities.pdf&quot;
 楼主| ayb_ice 发表于 2007-9-24 08:01 | 显示全部楼层

这个论坛还有点人气,看来FREESCALE还是不错...

  
 楼主| ayb_ice 发表于 2007-9-24 08:48 | 显示全部楼层

感谢张明峰...

原来是要加SHORT的缘故...<br />本人是FREESCALE的超级菜鸟,才接触几天而已,对KEIL&nbsp;C51较熟,最近对FREESCALE感兴趣,想学深点,想对汇编了解一下,想对编译器深入了解一下,所以有些问题比较菜,以后还会问些很菜的问题,希望高手不吝赐教...<br />在此先谢谢了...<br />不知张明峰是不是图示的那个张明峰...<br />对了要&quot;只有本版版主或积分大于500的人才可以帖图哦!&quot;<br />图贴不上来了...<br />就是那个写个PICC中文手册的上海的那个张明峰<br />不管是不是还是要谢谢你...
您需要登录后才可以回帖 登录 | 注册

本版积分规则

222

主题

15491

帖子

34

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