打印

串口中断出现错误

[复制链接]
867|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文件?

使用特权

评论回复
5
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
}

使用特权

评论回复
6
wuhany| | 2016-7-24 19:46 | 只看该作者
个人比较喜欢高优先级的优化.

使用特权

评论回复
7
lizye| | 2016-7-24 19:47 | 只看该作者
但是使用更高级别的优化时,串口中断就出现错误

使用特权

评论回复
8
jiaxw| | 2016-7-24 19:48 | 只看该作者
这是因为代码优化会打乱指令执行顺序, 优化存储器访问等.

使用特权

评论回复
9
jiajs|  楼主 | 2016-7-24 19:49 | 只看该作者
啥意思?

使用特权

评论回复
10
spark周| | 2016-7-24 19:50 | 只看该作者
比如使用 volitale 强制不要优化

使用特权

评论回复
11
午夜粪车| | 2016-7-24 19:51 | 只看该作者
O3是最大的优化级别,特别对循环试图进行软件流水。优化后一些不常用的中间变量将被释放掉,优化前中间变量被定义在L2缓存里,优化后直接分配在了CPU内部寄存器里,所以这些变量将不能被看到。

使用特权

评论回复
12
zhanghqi| | 2016-7-24 19:56 | 只看该作者
建议买一本DSP优化方面的书,一般讲得很清楚

使用特权

评论回复
13
wyjie| | 2016-7-24 19:56 | 只看该作者
很正常,采用O3优化后,少些代码会不正常,我也遇见过好几次,把C代码的方法改一下,再采用FULLL-DEBUG模式回过去看看(MIX模式)汇编确认一下。

使用特权

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

使用特权

评论回复
15
jlyuan| | 2016-7-24 19:59 | 只看该作者

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

使用特权

评论回复
16
jlyuan| | 2016-7-24 19:59 | 只看该作者
肯定要使用-O3,不然全用手工优化,得把人累死。
至于错误的原因,不能怪-O3,只能说程序不严谨!

使用特权

评论回复
17
jlyuan| | 2016-7-24 20:00 | 只看该作者
03出错,有时是用指针读写内存的错误,可以把程序分成比较小的文件,一个文件一个文件的O3,每次-O3一个文件,缩小错误的范围。

使用特权

评论回复
18
jiajs|  楼主 | 2016-7-24 20:01 | 只看该作者
嗯,知道了,多谢大家

使用特权

评论回复
19
jiajs|  楼主 | 2016-7-24 20:02 | 只看该作者
结贴了,周末快乐哈

使用特权

评论回复
20
Sode| | 2016-7-25 09:59 | 只看该作者
我也遇到过相同的关于优化的问题,正好学习了

使用特权

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

本版积分规则

940

主题

11975

帖子

6

粉丝