各位大虾:
最近在做仿真实验时,遇到了奇怪的现象,仿真器用的是XDS100,开发环境用的是CCS3.3.38.2,用的芯片是TMS320F2801,我配置为flash启动,启动时先进入boot区,在boot之后再跳转进入main,我在boot区的代码里面做了一个代码搬移,将存储在一个地址的代码搬移至一块ram空间(称为ram0),让boot区的一些函数在ram里面运行,在进入main后,我将存储在另一个地址的代码(一段epwm中断代码)同样搬移至ram0(和前一次空间一样,但是这一次的代码比前一次大),这时,我进入仿真模式的话,PC指针一直在main里面和boot区的那段代码里面来回运行(好像boot区替代了ISR的功能一样),但是真实情况是,芯片并没有运行boot区的代码,而是运行的ISR的内容,在CMD文件里,我们定义两段搬移代码地址时,用了UNION{}功能,请问一下,这是我们cmd文件配置有误,还是CCS版本的bug?
Eric Ma:
ruillong,
从你描述的情况来看,应该不是CCS的bug。
首先,你为什么要把bootROM的函数复制出来呢?这是出厂固化的代码,执行速度跟在RAM一样快,没必要复制,而且CMD对这段代码比较难操作,因为没有你没有bootROM的源码。
其次,PC一直在Main和boot去来回运行,这情形有点像程序跑飞,重启。你有开看门狗吗?以及你在调用epwm中断代码之前,有没有用memcpy函数把代码搬移过去RAM0.
最后,可以把CMD的UNION发上来看一下。
各位大虾:
最近在做仿真实验时,遇到了奇怪的现象,仿真器用的是XDS100,开发环境用的是CCS3.3.38.2,用的芯片是TMS320F2801,我配置为flash启动,启动时先进入boot区,在boot之后再跳转进入main,我在boot区的代码里面做了一个代码搬移,将存储在一个地址的代码搬移至一块ram空间(称为ram0),让boot区的一些函数在ram里面运行,在进入main后,我将存储在另一个地址的代码(一段epwm中断代码)同样搬移至ram0(和前一次空间一样,但是这一次的代码比前一次大),这时,我进入仿真模式的话,PC指针一直在main里面和boot区的那段代码里面来回运行(好像boot区替代了ISR的功能一样),但是真实情况是,芯片并没有运行boot区的代码,而是运行的ISR的内容,在CMD文件里,我们定义两段搬移代码地址时,用了UNION{}功能,请问一下,这是我们cmd文件配置有误,还是CCS版本的bug?
Jay:
你好。
根据你的描述,boot的代码和epwm的代码都能够搬到Ram0里面,但似乎在搬了epwm之后,RAM0中的boot代码被覆盖了,而且后面的代码比前面的长,所以运行起来ISR的功能没有影响。你可以检查一下,是否如此。
你可以尝试定义两个不同的RAM区域来分别存放boot代码和epwm的代码,看看是否可行。
还有,在进入主程序后,boot在RAM的里代码被覆盖了应该也没有关系吧,下次上电后boot在Flash中的代码还会把需要的搬到Ram中。不清楚,你的boot代码在主程序运行中还需要做什么工作?
各位大虾:
最近在做仿真实验时,遇到了奇怪的现象,仿真器用的是XDS100,开发环境用的是CCS3.3.38.2,用的芯片是TMS320F2801,我配置为flash启动,启动时先进入boot区,在boot之后再跳转进入main,我在boot区的代码里面做了一个代码搬移,将存储在一个地址的代码搬移至一块ram空间(称为ram0),让boot区的一些函数在ram里面运行,在进入main后,我将存储在另一个地址的代码(一段epwm中断代码)同样搬移至ram0(和前一次空间一样,但是这一次的代码比前一次大),这时,我进入仿真模式的话,PC指针一直在main里面和boot区的那段代码里面来回运行(好像boot区替代了ISR的功能一样),但是真实情况是,芯片并没有运行boot区的代码,而是运行的ISR的内容,在CMD文件里,我们定义两段搬移代码地址时,用了UNION{}功能,请问一下,这是我们cmd文件配置有误,还是CCS版本的bug?
user1880609:
回复 Eric Ma:
您好: 感谢您的回答,这边说明一下,我这边指的boot并不是芯片固有的bootROM区,这仅是我在进main之前的一小段代码,也是自己写的,用来做在线升级的。我已经通过实验验证,程序正常运行,只是在仿真情况下,PC指针执行出错了。这边的问题是,我将两端代码分别先后复制到同一个ram空间,实验说明的问题是,程序执行的是后面搬移的代码。现在的问题是仿真时,指针进入的是先前搬移的代码段,与实际运行不符合。
各位大虾:
最近在做仿真实验时,遇到了奇怪的现象,仿真器用的是XDS100,开发环境用的是CCS3.3.38.2,用的芯片是TMS320F2801,我配置为flash启动,启动时先进入boot区,在boot之后再跳转进入main,我在boot区的代码里面做了一个代码搬移,将存储在一个地址的代码搬移至一块ram空间(称为ram0),让boot区的一些函数在ram里面运行,在进入main后,我将存储在另一个地址的代码(一段epwm中断代码)同样搬移至ram0(和前一次空间一样,但是这一次的代码比前一次大),这时,我进入仿真模式的话,PC指针一直在main里面和boot区的那段代码里面来回运行(好像boot区替代了ISR的功能一样),但是真实情况是,芯片并没有运行boot区的代码,而是运行的ISR的内容,在CMD文件里,我们定义两段搬移代码地址时,用了UNION{}功能,请问一下,这是我们cmd文件配置有误,还是CCS版本的bug?
user1880609:
回复 Jay:
您好:
感谢您的回答,我已验证过,的确是后者覆盖了前者,问题是在做仿真的时候,PC指针却进入了被覆盖的代码段,与实际运行并不符合,这是否我在搬移代码到同一个ram的时候,CCS有了标签之类的东西,记住了ram空间的被覆盖的代码,所以运行的时候,PC指向了被覆盖的代码段。