打印

请教CMD文件Memory配置的疑问

[复制链接]
3975|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xinyancode|  楼主 | 2008-10-5 18:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


请教CMD文件Memory配置的疑问



我用的是TMS320LF2407A dsp, 在配置CMD文件时遇到如下问题,感到困惑, 请大家指教。


我的CMD文件如下,

/* LF2407 CMD */

MEMORY
{
    PAGE 0: 
         VECS: origin = 0x8000,  length 0x040
         PROG: origin = 0x8860,  length 0x6000
       
    PAGE 1: 
          B0  : origin = 0x200,   length 0x100
          B1  : origin = 0x300,   length 0x100
          DATA: origin = 0x0803,  len=0x600           /* My question is here */
}




SECTIONS
{
   .vectors : {}>VECS  PAGE 0       /* 中断向量表 */
   .text    : {}>PROG  PAGE 0     /* 可执行代码和字符串 */
   .cinit   : {}>PROG  PAGE 0 
   .bss     : {}>DATA  PAGE 1     /* 保留全局变量和静态变量空间 */
   .const   : {}>DATA  PAGE 1      /* 字符串和switch表 */    
   .switch  : {}>PROG  PAGE 0     /* 包含.switch语句建立的表格 */
   .stack    : {}>DATA  PAGE 1     /* 为系统堆栈分配存储器 */
   .system  : {}>DATA  PAGE 1      /* 为动态存储器函数分配存储器空间 */ 

}    




我的问题是在DATA: origin = 0x0803,  len=0x600  这一行。 当origin = 0x0800时,或时origin = 0x0801时,程序可以执行。但是当origin = 0x0803时,程序运行就有问题,可以运行,但今不了中断,我不知是什么原因。



我把.bss     : {}>DATA  PAGE 1 后面加上 align 16 就可以正常运行了。让开始的地址开始于16的整数倍就没问题了。   

origin = 0x0803 这一语句是不是可以将开始地址定义在任一memory 单元?



请大家指教一些,非常感谢!











相关帖子

沙发
hotpower| | 2008-10-5 21:08 | 只看该作者

DATA origin >=VECS origin+length

DATA: origin = 0x0840,  len=0x5c0           

使用特权

评论回复
板凳
xinyancode|  楼主 | 2008-10-6 22:02 | 只看该作者

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

请问二楼的兄弟,下面这一句是什么意思。
DATA origin >=VECS origin+length

使用特权

评论回复
地板
玄德| | 2008-10-7 16:00 | 只看该作者

以下供你参考。


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

使用特权

评论回复
5
xinyancode|  楼主 | 2008-10-10 09:27 | 只看该作者

请教CMD文件Memory配置的疑问

请教CMD文件Memory配置的疑问



我用的是TMS320LF2407A dsp, 在CCS2.2或ccs3.1的环境中C语言编程。在配置CMD文件时遇到如下问题,感到困惑, 请大家指教。


我实现的是一个简单的定时中断的程序。



CMD文件如下,  /* LF2407 CMD */

MEMORY
{
    PAGE 0: 
         VECS: origin = 0x8000,  length 0x040
         PROG: origin = 0x8860,  length 0x6000
       
    PAGE 1: 
          B0  : origin = 0x200,   length 0x100
          B1  : origin = 0x300,   length 0x100
          DATA: origin = 0x0803,  len=0x600           /* My question is here */
}




SECTIONS
{
   .vectors : {}>VECS  PAGE 0       /* 中断向量表 */
   .text    : {}>PROG  PAGE 0     /* 可执行代码和字符串 */
   .cinit   : {}>PROG  PAGE 0 
   .switch  : {}>PROG  PAGE 0     /* 包含.switch语句建立的表格 */

   .bss     : {}>DATA  PAGE 1     /* 保留全局变量和静态变量空间 */
   .const   : {}>DATA  PAGE 1      /* 字符串和switch表 */    
   .stack    : {}>DATA  PAGE 1     /* 为系统堆栈分配存储器 */
   .system  : {}>DATA  PAGE 1      /* 为动态存储器函数分配存储器空间 */ 

}    




我的问题是在DATA: org = 0x0803,  len=0x600  这一行。 当origin = 0x0800时,或时origin = 0x0801时,程序可以执行。但是当origin = 0x0803时,程序运行就有问题,可以运行,但进不了中断,但是程序会报道假中断程序里面。我不知是什么原因。


map文件我已经看了N遍,在org = 0x0800, 0x0801, 0x0802, 0x0803这几种情况下的map文件都看了没发现异常现象。
 

整个工程文件我打了一个包放在附件文件,有兴趣的朋友可以在您的环境试一下。感谢。


请大家指教一些这个原因到底在什么地方,非常感谢!
xinyancode@163.com


相关链接:https://bbs.21ic.com/upfiles/img/200711/200711259444128.rar

使用特权

评论回复
6
xinyancode|  楼主 | 2008-10-10 09:29 | 只看该作者

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

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

使用特权

评论回复
7
玄德| | 2008-10-10 17:25 | 只看该作者

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

刚才用你的项目文件做了实验,得到一些结果。

你的向量表VECS安排在SARAM区(8000起始),程序空间PROG安排到与片内FLASH空间不相重叠的位置(8000以上),这些绝对都是非主流的做法(我不敢说是错的),所以导致这个莫名其妙的问题。

据我所知,SARAM区的应用比B0、B1、B2复杂,一般只安排在数据空间、存数据用,而不会安排程序(VECS属于程序)。如果一定要把程序和数据同时往SARAM里面塞(你的程序就是这样),恐怕要去咨询TI公司了。

把PROG安排在8860的位置,超出了32K范围,这很可能有问题。首先,你要在这个空间外接存储器。其次,我有过这样的经历:我的一个应用程序,代码长度超出了32K,片内FLASH不够用,想在8800~FDFF外扩一个FLASH芯片,不知道该怎么做,TI公司告诉我很复杂,必须修改CCS。也就是说,程序代码要放在32K以上的空间,几乎不可能,但我不敢肯定,仿真状态下外接RAM是否也不可能。当然,在8000~FFFF区域,接一个用于掉电数据保护之类的FLASH,是可以的,也有人这么做。

总之,只要按照主流的做法修改CMD,把VECS定位在0x0000,PROG定位到0x0044或更高,就一切OK,不存在0x803的问题了,CMD的其他内容一点都不用动。


使用特权

评论回复
8
xinyancode|  楼主 | 2008-10-12 14:59 | 只看该作者

非常感谢 玄德 兄的指点

非常感谢 玄德 兄的指点!!! 我正在想一个新的方案去验证这个问题。



实际上我上面贴的例子的代码和memory的安排是出自一家公司的开发板。
开发板在2407外扩了一片64k×16的SRAM, 这块SRAM的中的32k被映射到了2407的程序空间(8000~FFFF)
另外的32k存储单元映射到了数据空间(8000~FFFF)。



这样程序在仿真时就是在程序空间的8000-FFFF中运行的,共32k的空间。由于2407的中断向量不能重新定位,就让2407的程序空间的0000单元一复位就跳转到
8000单元,跳到新的中断向量表上去运行。因此有上面的我的程序的中断向量和程序都是从8000开始的。我买的这块开发板就是这样。



我上面描述的0803的这个奇怪问题在开发板也同样出现,因此我没别的办法。



另外,玄德兄能否将您的2407的存期器是如何扩展的告诉我。能否给我一个电路图让在下参考一下。

使用特权

评论回复
9
xinyancode|  楼主 | 2008-10-12 19:08 | 只看该作者

多谢玄德兄的指教



多谢玄德兄的指教,情况的确如此,造成这种怪现象的原因正是在于SARAM在2407 dsp复位后既在程序空间又在数据空间。我把原来映射在.data段的内容都映射到片外的扩展数据空间,就再也不会发生这种问题。

因此我也就彻底理解了为什么我的开发板上带的程序这一行
DATA: org=0x0860,  len=0x600     /* SARAM  segment */           
为什么非得写0x0860这个起始地址。就是要和程序分开一段空间。



原因也在我没有注意到复位后默认的状态是DON=1;  PON=1; SARAM存在于两个空间。




另外,请教玄德兄:您说的主流的做法是不是将片外扩展的程序空间就定在0000-7FFFF这一段,和片内的flash地址完全一样,通过mp/MC设置使2407在仿真时放完片外存储器,脱机运行时在片内flash中运行。


能否赐给在下一幅电路图,不胜感激!!

使用特权

评论回复
10
玄德| | 2008-10-13 15:54 | 只看该作者

111


我所说的主流做法,一般是这样:
1、如你所说,片外扩展的程序空间(SRAM)就定在0000-7FFF这一段,和片内的flash地址完全一样,通过mp/MC设置使2407在仿真时使用片外的SRAM,脱机运行时在片内flash中运行。地址放在0000-7FFF,在脱离仿真器运行时,某些时候CMD文件可以不做修改,只改变mp/MC的设置就行。
2、在数据空间0x8000以上,外扩SRAM。
如果已经研发成功,不需要再仿真,而且片内的RAM够用,则外围的SRAM就可以完全撤除掉,不论程序空间还是数据空间。

关于电路图,其实没有必要再给你。倒不是我保守,是真的没有太大的意义。原因有二:1、别人的电路,往往和自己的情况有差别,而且还要看CPLD的程序内容(现在很少有人用74系列电路去搭一个译码电路),要从电路和程序去分析设计者的意图,是自下向上的过程,很容易看糊涂和被误导。2、只要把情况搞明白了,根据自己需要,自上而下地设计,也不难。

如果一定要看,网上的图集很多,最好是看TI官方合作伙伴的图。

使用特权

评论回复
11
还我今生| | 2008-10-14 16:26 | 只看该作者

学习了

使用特权

评论回复
12
xinyancode|  楼主 | 2008-10-18 23:24 | 只看该作者

再谢玄德兄

玄德兄是我这几年遇到的dsp水平最高的一位。真是实在佩服。


如果愿意,请您给在下一个电子邮箱的地址。愿意能和您交个朋友。


我看到您的帖子在讨论2812的问题,我现在还没有完全熟悉它,不过试验室里北京瑞泰公司2812的实验箱,您若需要点什么,就告诉我,看我能否提供您一点资料。


再次感谢!



使用特权

评论回复
13
nealfei| | 2009-9-19 00:47 | 只看该作者
小弟我听你们的谈话,不胜感激,我也刚刚学这玩意,听你们说了这么多,我的收获很不小,真是谢谢你们了!希望能和你们多有交谈讨论,也望各位不吝指教,先行谢谢了!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

85

主题

147

帖子

0

粉丝