串口中断出现错误

[复制链接]
1199|19
 楼主| jiajs 发表于 2016-7-24 19:41 | 显示全部楼层 |阅读模式
在以前别人做的DSP程序上扩展功能,主要是串口中断和定时器中断,中断设置确定没有问题,由于功能需要,主程序中switch语句和if语句较多,功能没有全部实现时,使用编译器的1级优化,勾选优化代码大小,程序正常运行,但是使用更高级别的优化时,串口中断就出现错误
jlyuan 发表于 2016-7-24 19:42 | 显示全部楼层
不用高级优化呢
 楼主| jiajs 发表于 2016-7-24 19:44 | 显示全部楼层
依然采用1级优化,编译结束后出现program will not fit it available!的错误
dengdc 发表于 2016-7-24 19:45 | 显示全部楼层
CMD文件?
 楼主| jiajs 发表于 2016-7-24 19:45 | 显示全部楼层

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
}
wuhany 发表于 2016-7-24 19:46 | 显示全部楼层
个人比较喜欢高优先级的优化.
lizye 发表于 2016-7-24 19:47 | 显示全部楼层
但是使用更高级别的优化时,串口中断就出现错误
jiaxw 发表于 2016-7-24 19:48 | 显示全部楼层
这是因为代码优化会打乱指令执行顺序, 优化存储器访问等.
 楼主| jiajs 发表于 2016-7-24 19:49 | 显示全部楼层
啥意思?
spark周 发表于 2016-7-24 19:50 | 显示全部楼层
比如使用 volitale 强制不要优化
午夜粪车 发表于 2016-7-24 19:51 | 显示全部楼层
O3是最大的优化级别,特别对循环试图进行软件流水。优化后一些不常用的中间变量将被释放掉,优化前中间变量被定义在L2缓存里,优化后直接分配在了CPU内部寄存器里,所以这些变量将不能被看到。
zhanghqi 发表于 2016-7-24 19:56 | 显示全部楼层
建议买一本DSP优化方面的书,一般讲得很清楚
wyjie 发表于 2016-7-24 19:56 | 显示全部楼层
很正常,采用O3优化后,少些代码会不正常,我也遇见过好几次,把C代码的方法改一下,再采用FULLL-DEBUG模式回过去看看(MIX模式)汇编确认一下。
jlyuan 发表于 2016-7-24 19:58 | 显示全部楼层
我跑的是一个视频采集和压缩的程序,压缩用的是JPEG压缩算法, 程序在 不选-O2
或者-o3选项优化的时候,可以正常工作,而且比较稳定,但使用-o2或者-o3选项后,程序工作不稳定,会出错。而且程序在使用-o2或者-o3选项后,很多变量被优化掉了,有些语句的顺序也被调整了,调试起来也不是很方便,还需要继续研究。
jlyuan 发表于 2016-7-24 19:59 | 显示全部楼层

程序中还使用了CSL支持库中
DAT_COPY,用于从外部SRAM中搬移数据到内部L2RAM中,没有使用-o2或者-o3选项时,DAT_COPY工作正常,
在使用-o2或者-o3选项后,DAT_COPY函数工作不正常了, 还得继续整。
jlyuan 发表于 2016-7-24 19:59 | 显示全部楼层
肯定要使用-O3,不然全用手工优化,得把人累死。
至于错误的原因,不能怪-O3,只能说程序不严谨!
jlyuan 发表于 2016-7-24 20:00 | 显示全部楼层
03出错,有时是用指针读写内存的错误,可以把程序分成比较小的文件,一个文件一个文件的O3,每次-O3一个文件,缩小错误的范围。
 楼主| jiajs 发表于 2016-7-24 20:01 | 显示全部楼层
嗯,知道了,多谢大家
 楼主| jiajs 发表于 2016-7-24 20:02 | 显示全部楼层
结贴了,周末快乐哈
Sode 发表于 2016-7-25 09:59 | 显示全部楼层
我也遇到过相同的关于优化的问题,正好学习了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

940

主题

11975

帖子

6

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