请教CMD文件Memory配置的疑问

[复制链接]
4827|12
 楼主| xinyancode 发表于 2008-10-5 18:42 | 显示全部楼层 |阅读模式
<br /><br />请教CMD文件Memory配置的疑问<br /><br /><br /><br />我用的是TMS320LF2407A&nbsp;dsp,&nbsp;在配置CMD文件时遇到如下问题,感到困惑,&nbsp;请大家指教。<br /><br /><br />我的CMD文件如下,<br /><br />/*&nbsp;LF2407&nbsp;CMD&nbsp;*/<br /><br />MEMORY<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;PAGE&nbsp;0:&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VECS:&nbsp;origin&nbsp;=&nbsp;0x8000,&nbsp;&nbsp;length&nbsp;0x040<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PROG:&nbsp;origin&nbsp;=&nbsp;0x8860,&nbsp;&nbsp;length&nbsp;0x6000<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;PAGE&nbsp;1:&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;B0&nbsp;&nbsp;:&nbsp;origin&nbsp;=&nbsp;0x200,&nbsp;&nbsp;&nbsp;length&nbsp;0x100<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;B1&nbsp;&nbsp;:&nbsp;origin&nbsp;=&nbsp;0x300,&nbsp;&nbsp;&nbsp;length&nbsp;0x100<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DATA:&nbsp;origin&nbsp;=&nbsp;0x0803,&nbsp;&nbsp;len=0x600&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;My&nbsp;question&nbsp;is&nbsp;here&nbsp;*/<br />}<br /><br /><br /><br /><br />SECTIONS<br />{<br />&nbsp;&nbsp;&nbsp;.vectors&nbsp;:&nbsp;{}&gtVECS&nbsp;&nbsp;PAGE&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;中断向量表&nbsp;*/<br />&nbsp;&nbsp;&nbsp;.text&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;{}&gtPROG&nbsp;&nbsp;PAGE&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;可执行代码和字符串&nbsp;*/<br />&nbsp;&nbsp;&nbsp;.cinit&nbsp;&nbsp;&nbsp;:&nbsp;{}&gtPROG&nbsp;&nbsp;PAGE&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;.bss&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;{}&gtDATA&nbsp;&nbsp;PAGE&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;保留全局变量和静态变量空间&nbsp;*/<br />&nbsp;&nbsp;&nbsp;.const&nbsp;&nbsp;&nbsp;:&nbsp;{}&gtDATA&nbsp;&nbsp;PAGE&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;字符串和switch表&nbsp;*/&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;.switch&nbsp;&nbsp;:&nbsp;{}&gtPROG&nbsp;&nbsp;PAGE&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;包含.switch语句建立的表格&nbsp;*/<br />&nbsp;&nbsp;&nbsp;.stack&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;{}&gtDATA&nbsp;&nbsp;PAGE&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;为系统堆栈分配存储器&nbsp;*/<br />&nbsp;&nbsp;&nbsp;.system&nbsp;&nbsp;:&nbsp;{}&gtDATA&nbsp;&nbsp;PAGE&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;为动态存储器函数分配存储器空间&nbsp;*/&nbsp;<br /><br />}&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /><br /><br /><br />我的问题是在DATA:&nbsp;origin&nbsp;=&nbsp;0x0803,&nbsp;&nbsp;len=0x600&nbsp;&nbsp;这一行。&nbsp;当origin&nbsp;=&nbsp;0x0800时,或时origin&nbsp;=&nbsp;0x0801时,程序可以执行。但是当origin&nbsp;=&nbsp;0x0803时,程序运行就有问题,可以运行,但今不了中断,我不知是什么原因。<br /><br /><br /><br />我把.bss&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;{}&gtDATA&nbsp;&nbsp;PAGE&nbsp;1&nbsp;后面加上&nbsp;align&nbsp;16&nbsp;就可以正常运行了。让开始的地址开始于16的整数倍就没问题了。&nbsp;&nbsp;&nbsp;<br /><br />origin&nbsp;=&nbsp;0x0803&nbsp;这一语句是不是可以将开始地址定义在任一memory&nbsp;单元?<br /><br /><br /><br />请大家指教一些,非常感谢!<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />
hotpower 发表于 2008-10-5 21:08 | 显示全部楼层

DATA origin >=VECS origin+length

DATA:&nbsp;origin&nbsp;=&nbsp;0x0840,&nbsp;&nbsp;len=0x5c0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 楼主| xinyancode 发表于 2008-10-6 22:02 | 显示全部楼层

请问二楼的兄弟,下面这一句是什么意思。

请问二楼的兄弟,下面这一句是什么意思。<br />DATA&nbsp;origin&nbsp;&gt=VECS&nbsp;origin+length<br />
玄德 发表于 2008-10-7 16:00 | 显示全部楼层

以下供你参考。

<br />1、向量表应当从0x0000开始,长度为0x40,这是编译器和芯片默认取中断向量的地方。而你放在0x8000的位置,就必须告诉编译器,2407似乎没有这种机制,2812有。<br />2、DATA区按理可以灵活地安排,0x0800,0x0801,0x0802,0x0803,0x0804,都可以,只要长度适当。估计问题不在这里,这只是表象而已。你可以看看map文件,是否有矛盾。<br />
 楼主| xinyancode 发表于 2008-10-10 09:27 | 显示全部楼层

请教CMD文件Memory配置的疑问

请教CMD文件Memory配置的疑问<br /><br /><br /><br />我用的是TMS320LF2407A&nbsp;dsp,&nbsp;在CCS2.2或ccs3.1的环境中C语言编程。在配置CMD文件时遇到如下问题,感到困惑,&nbsp;请大家指教。<br /><br /><br />我实现的是一个简单的定时中断的程序。<br /><br /><br /><br />CMD文件如下,&nbsp;&nbsp;/*&nbsp;LF2407&nbsp;CMD&nbsp;*/<br /><br />MEMORY<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;PAGE&nbsp;0:&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VECS:&nbsp;origin&nbsp;=&nbsp;0x8000,&nbsp;&nbsp;length&nbsp;0x040<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PROG:&nbsp;origin&nbsp;=&nbsp;0x8860,&nbsp;&nbsp;length&nbsp;0x6000<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;PAGE&nbsp;1:&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;B0&nbsp;&nbsp;:&nbsp;origin&nbsp;=&nbsp;0x200,&nbsp;&nbsp;&nbsp;length&nbsp;0x100<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;B1&nbsp;&nbsp;:&nbsp;origin&nbsp;=&nbsp;0x300,&nbsp;&nbsp;&nbsp;length&nbsp;0x100<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DATA:&nbsp;origin&nbsp;=&nbsp;0x0803,&nbsp;&nbsp;len=0x600&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;My&nbsp;question&nbsp;is&nbsp;here&nbsp;*/<br />}<br /><br /><br /><br /><br />SECTIONS<br />{<br />&nbsp;&nbsp;&nbsp;.vectors&nbsp;:&nbsp;{}&gtVECS&nbsp;&nbsp;PAGE&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;中断向量表&nbsp;*/<br />&nbsp;&nbsp;&nbsp;.text&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;{}&gtPROG&nbsp;&nbsp;PAGE&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;可执行代码和字符串&nbsp;*/<br />&nbsp;&nbsp;&nbsp;.cinit&nbsp;&nbsp;&nbsp;:&nbsp;{}&gtPROG&nbsp;&nbsp;PAGE&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;.switch&nbsp;&nbsp;:&nbsp;{}&gtPROG&nbsp;&nbsp;PAGE&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;包含.switch语句建立的表格&nbsp;*/<br /><br />&nbsp;&nbsp;&nbsp;.bss&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;{}&gtDATA&nbsp;&nbsp;PAGE&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;保留全局变量和静态变量空间&nbsp;*/<br />&nbsp;&nbsp;&nbsp;.const&nbsp;&nbsp;&nbsp;:&nbsp;{}&gtDATA&nbsp;&nbsp;PAGE&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;字符串和switch表&nbsp;*/&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;.stack&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;{}&gtDATA&nbsp;&nbsp;PAGE&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;为系统堆栈分配存储器&nbsp;*/<br />&nbsp;&nbsp;&nbsp;.system&nbsp;&nbsp;:&nbsp;{}&gtDATA&nbsp;&nbsp;PAGE&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;为动态存储器函数分配存储器空间&nbsp;*/&nbsp;<br /><br />}&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /><br /><br /><br />我的问题是在DATA:&nbsp;org&nbsp;=&nbsp;0x0803,&nbsp;&nbsp;len=0x600&nbsp;&nbsp;这一行。&nbsp;当origin&nbsp;=&nbsp;0x0800时,或时origin&nbsp;=&nbsp;0x0801时,程序可以执行。但是当origin&nbsp;=&nbsp;0x0803时,程序运行就有问题,可以运行,但进不了中断,但是程序会报道假中断程序里面。我不知是什么原因。<br /><br /><br />map文件我已经看了N遍,在org&nbsp;=&nbsp;0x0800,&nbsp;0x0801,&nbsp;0x0802,&nbsp;0x0803这几种情况下的map文件都看了没发现异常现象。<br />&nbsp;<br /><br />整个工程文件我打了一个包放在附件文件,有兴趣的朋友可以在您的环境试一下。感谢。<br /><br /><br />请大家指教一些这个原因到底在什么地方,非常感谢!<br />xinyancode@163.com<br /><br /> <br /> 相关链接:<a href='https://bbs.21ic.com/upfiles/img/200711/200711259444128.rar'>https://bbs.21ic.com/upfiles/img/200711/200711259444128.rar</a>
 楼主| xinyancode 发表于 2008-10-10 09:29 | 显示全部楼层

还想请上面的玄德 兄继续指教

还想请上面的玄德&nbsp;兄继续指教,谢谢
玄德 发表于 2008-10-10 17:25 | 显示全部楼层

这个问题跟向量表的安排、代码空间的安排有关。

刚才用你的项目文件做了实验,得到一些结果。<br /><br />你的向量表VECS安排在SARAM区(8000起始),程序空间PROG安排到与片内FLASH空间不相重叠的位置(8000以上),这些绝对都是非主流的做法(我不敢说是错的),所以导致这个莫名其妙的问题。<br /><br />据我所知,SARAM区的应用比B0、B1、B2复杂,一般只安排在数据空间、存数据用,而不会安排程序(VECS属于程序)。如果一定要把程序和数据同时往SARAM里面塞(你的程序就是这样),恐怕要去咨询TI公司了。<br /><br />把PROG安排在8860的位置,超出了32K范围,这很可能有问题。首先,你要在这个空间外接存储器。其次,我有过这样的经历:我的一个应用程序,代码长度超出了32K,片内FLASH不够用,想在8800~FDFF外扩一个FLASH芯片,不知道该怎么做,TI公司告诉我很复杂,必须修改CCS。也就是说,程序代码要放在32K以上的空间,几乎不可能,但我不敢肯定,仿真状态下外接RAM是否也不可能。当然,在8000~FFFF区域,接一个用于掉电数据保护之类的FLASH,是可以的,也有人这么做。<br /><br />总之,只要按照主流的做法修改CMD,把VECS定位在0x0000,PROG定位到0x0044或更高,就一切OK,不存在0x803的问题了,CMD的其他内容一点都不用动。<br /><br /><br />
 楼主| xinyancode 发表于 2008-10-12 14:59 | 显示全部楼层

非常感谢 玄德 兄的指点

非常感谢&nbsp;玄德&nbsp;兄的指点!!!&nbsp;我正在想一个新的方案去验证这个问题。<br /><br /><br /><br />实际上我上面贴的例子的代码和memory的安排是出自一家公司的开发板。<br />开发板在2407外扩了一片64k×16的SRAM,&nbsp;这块SRAM的中的32k被映射到了2407的程序空间(8000~FFFF)<br />另外的32k存储单元映射到了数据空间(8000~FFFF)。<br /><br /><br /><br />这样程序在仿真时就是在程序空间的8000-FFFF中运行的,共32k的空间。由于2407的中断向量不能重新定位,就让2407的程序空间的0000单元一复位就跳转到<br />8000单元,跳到新的中断向量表上去运行。因此有上面的我的程序的中断向量和程序都是从8000开始的。我买的这块开发板就是这样。<br /><br /><br /><br />我上面描述的0803的这个奇怪问题在开发板也同样出现,因此我没别的办法。<br /><br /><br /><br />另外,玄德兄能否将您的2407的存期器是如何扩展的告诉我。能否给我一个电路图让在下参考一下。
 楼主| xinyancode 发表于 2008-10-12 19:08 | 显示全部楼层

多谢玄德兄的指教

<br /><br />多谢玄德兄的指教,情况的确如此,造成这种怪现象的原因正是在于SARAM在2407&nbsp;dsp复位后既在程序空间又在数据空间。我把原来映射在.data段的内容都映射到片外的扩展数据空间,就再也不会发生这种问题。<br /><br />因此我也就彻底理解了为什么我的开发板上带的程序这一行<br />DATA:&nbsp;org=0x0860,&nbsp;&nbsp;len=0x600&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;SARAM&nbsp;&nbsp;segment&nbsp;*/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />为什么非得写0x0860这个起始地址。就是要和程序分开一段空间。<br /><br /><br /><br />原因也在我没有注意到复位后默认的状态是DON=1;&nbsp;&nbsp;PON=1;&nbsp;SARAM存在于两个空间。<br /><br /><br /><br /><br />另外,请教玄德兄:您说的主流的做法是不是将片外扩展的程序空间就定在0000-7FFFF这一段,和片内的flash地址完全一样,通过mp/MC设置使2407在仿真时放完片外存储器,脱机运行时在片内flash中运行。<br /><br /><br />能否赐给在下一幅电路图,不胜感激!!<br /><br />
玄德 发表于 2008-10-13 15:54 | 显示全部楼层

111

<br />我所说的主流做法,一般是这样:<br />1、如你所说,片外扩展的程序空间(SRAM)就定在0000-7FFF这一段,和片内的flash地址完全一样,通过mp/MC设置使2407在仿真时使用片外的SRAM,脱机运行时在片内flash中运行。地址放在0000-7FFF,在脱离仿真器运行时,某些时候CMD文件可以不做修改,只改变mp/MC的设置就行。<br />2、在数据空间0x8000以上,外扩SRAM。<br />如果已经研发成功,不需要再仿真,而且片内的RAM够用,则外围的SRAM就可以完全撤除掉,不论程序空间还是数据空间。<br /><br />关于电路图,其实没有必要再给你。倒不是我保守,是真的没有太大的意义。原因有二:1、别人的电路,往往和自己的情况有差别,而且还要看CPLD的程序内容(现在很少有人用74系列电路去搭一个译码电路),要从电路和程序去分析设计者的意图,是自下向上的过程,很容易看糊涂和被误导。2、只要把情况搞明白了,根据自己需要,自上而下地设计,也不难。<br /><br />如果一定要看,网上的图集很多,最好是看TI官方合作伙伴的图。<br />
还我今生 发表于 2008-10-14 16:26 | 显示全部楼层

学习了

  
 楼主| xinyancode 发表于 2008-10-18 23:24 | 显示全部楼层

再谢玄德兄

玄德兄是我这几年遇到的dsp水平最高的一位。真是实在佩服。<br /><br /><br />如果愿意,请您给在下一个电子邮箱的地址。愿意能和您交个朋友。<br /><br /><br />我看到您的帖子在讨论2812的问题,我现在还没有完全熟悉它,不过试验室里北京瑞泰公司2812的实验箱,您若需要点什么,就告诉我,看我能否提供您一点资料。<br /><br /><br />再次感谢!<br /><br /><br /><br />
nealfei 发表于 2009-9-19 00:47 | 显示全部楼层
小弟我听你们的谈话,不胜感激,我也刚刚学这玩意,听你们说了这么多,我的收获很不小,真是谢谢你们了!希望能和你们多有交谈讨论,也望各位不吝指教,先行谢谢了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

85

主题

147

帖子

0

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