打印

[求助]TMS320F2812中断问题

[复制链接]
1417|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ddungsasa|  楼主 | 2013-7-16 22:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
工作以后,初学DSP,由于项目需要,在以前别人做的DSP程序上扩展功能,主要是串口中断和定时器中断,中断设置确定没有问题,由于功能需要,主程序中switch语句和if语句较多,功能没有全部实现时,使用编译器的1级优化,勾选优化代码大小,程序正常运行,但是使用更高级别的优化时,串口中断就出现错误 如果不用高级优化,依然采用1级优化,编译结束后出现program will not fit it available!的错误T_T
       原来写该程序的同事已经辞职离开单位了,求高手指点一下,应该怎么解决这个问题

      附上程序的CMD文件:
MEMORY
{
PAGE 0:    /* Program Memory */
ZONE0  : origin = 0x002000, length = 0x002000     /* XINTF zone 0 */
ZONE1  : origin = 0x004000, length = 0x002000     /* XINTF zone 1 */
ZONE2  : origin = 0x080000, length = 0x080000     /* XINTF zone 2 */
ZONE6  : origin = 0x100000, length = 0x080000     /* XINTF zone 6 */
OTP  : origin = 0x3D7800, length = 0x000800     /* on-chip OTP */
FLASHD  : origin = 0x3EC000, length = 0x004000     /* on-chip FLASH */
FLASHC  : origin = 0x3F0000, length = 0x004000     /* on-chip FLASH */
FLASHB  : origin = 0x3F4000, length = 0x002000     /* on-chip FLASH */
FLASHA  : origin = 0x3F6000, length = 0x001F80     /* on-chip FLASH */
CSM_RSVD : origin = 0x3F7F80, length = 0x000076     /* Part of FLASHA.  Program with all 0x0000 when CSM is in use. */
BEGIN  : origin = 0x3F7FF6, length = 0x000002     /* Part of FLASHA.  Used for "boot to Flash" bootloader mode. */
CSM_PWL  : origin = 0x3F7FF8, length = 0x000008     /* Part of FLASHA.  CSM password locations in FLASHA */
RAMH0  : origin = 0x3F8000, length = 0x002000     /* on-chip RAM block H0 */
RAML0  : origin = 0x008000, length = 0x001000     /* on-chip RAM block L1 */
/*ZONE7  : origin = 0x3FC000, length = 0x003FC0     // XINTF zone 7 available if MP/MCn=1*/
ROM  : origin = 0x3FF000, length = 0x000FC0     /* Boot ROM available if MP/MCn=0 */
RESET  : origin = 0x3FFFC0, length = 0x000002     /* part of boot ROM (MP/MCn=0) or XINTF zone 7 (MP/MCn=1) */
VECTORS  : origin = 0x3FFFC2, length = 0x00003E     /* part of boot ROM (MP/MCn=0) or XINTF zone 7 (MP/MCn=1) */
PAGE 1 :   /* Data Memory */
BOOT_RSVD : origin = 0x000000, length = 0x000080     /* Part of M0, BOOT rom will use this for stack */
RAMM0  : origin = 0x000080, length = 0x000380     /* on-chip RAM block M0 */
RAMM1  : origin = 0x000400, length = 0x000400     /* on-chip RAM block M1 */
RAML1  : origin = 0x009000, length = 0x001000     /* on-chip RAM block L1 */
FLASHJ  : origin = 0x3D8000, length = 0x002000     /* on-chip FLASH */
FLASHI  : origin = 0x3DA000, length = 0x002000     /* on-chip FLASH */
FLASHH  : origin = 0x3DC000, length = 0x004000     /* on-chip FLASH */
FLASHG  : origin = 0x3E0000, length = 0x004000     /* on-chip FLASH */
FLASHF  : origin = 0x3E4000, length = 0x004000     /* on-chip FLASH */
FLASHE  : origin = 0x3E8000, length = 0x004000     /* on-chip FLASH */
}

SECTIONS
{
/*** Code Security Password Locations ***/
csmpasswds : > CSM_PWL      PAGE = 0  /* Used by file CSMPasswords.asm */
csm_rsvd : > CSM_RSVD     PAGE = 0  /* Used by file CSMPasswords.asm */
/*** User Defined Sections ***/
    codestart : > BEGIN,  PAGE = 0        /* Used by file CodeStartBranch.asm */
    wddisable : > FLASHA,  PAGE = 0  /* Used by file CodeStartBranch.asm */
   copysections : > FLASHA,  PAGE = 0  /* Used by file SectionCopy.asm */
.reset  : > RESET,       PAGE = 0, TYPE = DSECT
vectors  : > VECTORS      PAGE = 0, TYPE = DSECT
/*** Uninitialized Sections ***/
    .stack  : > RAMM1        PAGE = 1
    .ebss  : > RAML1        PAGE = 1
    .esysmem : > RAML1        PAGE = 1
.sysmem  : > RAML1        PAGE = 1
/*** Initialized Sections ***/
ramfuncs : LOAD = FLASHC,
     RUN = RAML0,
     LOAD_START(_RamfuncsLoadStart),
     LOAD_END(_RamfuncsLoadEnd),
     RUN_START(_RamfuncsRunStart),
     PAGE = 0
.text  : LOAD = FLASHC, PAGE = 0
     RUN = RAMH0, PAGE = 0
     LOAD_START(_text_loadstart),
     RUN_START(_text_runstart),
     SIZE(_text_size)
.cinit  : LOAD = FLASHC, PAGE = 0
     RUN = RAMH0, PAGE = 0
     LOAD_START(_cinit_loadstart),
     RUN_START(_cinit_runstart),
     SIZE(_cinit_size)
.pinit  : LOAD = FLASHC, PAGE = 0
     RUN = RAMH0, PAGE = 0
     LOAD_START(_pinit_loadstart),
     RUN_START(_pinit_runstart),
     SIZE(_pinit_size)
.switch   :   LOAD = FLASHC, PAGE = 0
                  RUN = RAMH0, PAGE = 0
                  LOAD_START(_switch_loadstart),
                  RUN_START(_switch_runstart),
      SIZE(_switch_size)
/*.const   :   LOAD = FLASHJ, PAGE = 0
                  RUN = RAML0L1, PAGE = 0
                  LOAD_START(_const_loadstart),
                  RUN_START(_const_runstart),
      SIZE(_const_size)*/
.econst   :   LOAD = FLASHJ, PAGE = 1
                  RUN = RAML1, PAGE = 1
                  LOAD_START(_econst_loadstart),
                  RUN_START(_econst_runstart),
      SIZE(_econst_size)
/*** IQmath ***/
IQmath   :   LOAD = FLASHC, PAGE = 0
                  RUN = RAMH0, PAGE = 0
                  LOAD_START(_IQmath_loadstart),
                  RUN_START(_IQmath_runstart),
      SIZE(_IQmath_size)
IQmathTables : > ROM    PAGE = 0, TYPE = NOLOAD   /* Math Tables In ROM */
IQmathTablesRam :   LOAD = FLASHJ, PAGE = 1
                  RUN = RAML1, PAGE = 1
                  LOAD_START(_IQmathTablesRam_loadstart),
                  RUN_START(_IQmathTablesRam_runstart),
      SIZE(_IQmathTablesRam_size)
.cio    : > FLASHA,  PAGE = 0
}

相关帖子

沙发
airwill| | 2013-7-17 09:11 | 只看该作者
个人比较喜欢高优先级的优化.
但是使用更高级别的优化时,串口中断就出现错误
这是因为代码优化会打乱指令执行顺序, 优化存储器访问等.
如果有时间的话, 楼主可以迎难而上, 通过编译指令处理不该优化的地方. 比如使用 volitale 强制不要优化.

使用特权

评论回复
板凳
zhangmangui| | 2013-7-17 10:45 | 只看该作者
O3是最大的优化级别,特别对循环试图进行软件流水。优化后一些不常用的中间变量将被释放掉,优化前中间变量被定义在L2缓存里,优化后直接分配在了CPU内部寄存器里,所以这些变量将不能被看到。建议买一本DSP优化方面的书,一般讲得很清楚

很正常,采用O3优化后,少些代码会不正常,我也遇见过好几次,把C代码的方法改一下,再采用FULLL-DEBUG模式回过去看看(MIX模式)汇编确认一下。

我跑的是一个视频采集和压缩的程序,压缩用的是JPEG压缩算法, 程序在 不选-O2
或者-o3选项优化的时候,可以正常工作,而且比较稳定,但使用-o2或者-o3选项后,程序工作不稳定,会出错。而且程序在使用-o2或者-o3选项后,很多变量被优化掉了,有些语句的顺序也被调整了,调试起来也不是很方便,还需要继续研究。

程序中还使用了CSL支持库中
DAT_COPY,用于从外部SRAM中搬移数据到内部L2RAM中,没有使用-o2或者-o3选项时,DAT_COPY工作正常,
在使用-o2或者-o3选项后,DAT_COPY函数工作不正常了, 还得继续整。

肯定要使用-O3,不然全用手工优化,得把人累死。
至于错误的原因,不能怪-O3,只能说程序不严谨!
03出错,有时是用指针读写内存的错误,可以把程序分成比较小的文件,一个文件一个文件的O3,每次-O3一个文件,缩小错误的范围。
不会使用-O3的工程师,不算合格的DSP工程师。(来自博客园 )

使用特权

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

本版积分规则

1

主题

1

帖子

0

粉丝