Release模式下 不执行自定义函数 求助

[复制链接]
4657|6
 楼主| 黄jiajia 发表于 2011-3-19 21:51 | 显示全部楼层 |阅读模式
在CCS V4下的release模式下,自己定义的delay函数,但是调试发现总是不执行delay函数体,直接跳过了,就当没有delay();这跳语句一样。但是,在debug模式下则可以正常。请问有经验者指点一下,这是怎么回事?
aresc 发表于 2011-3-20 13:52 | 显示全部楼层
这个很可能是由于CCS的编译优化引起的.
可能1. 编译器觉得delay没用,直接优化没了,不过可能性不大.
可能2. 编译器优化了之后,程序的运行可能和原程序在时序上有些不同.
建议加一个全局计数器,在delay函数体里增加,在delay的调用后检查一下这个计数器有没有增加.看delay是否真的没执行?
 楼主| 黄jiajia 发表于 2011-3-22 16:50 | 显示全部楼层
2楼朋友,谢谢你指点。 发现是这样一个问题,delay函数的里面定义的局部变量CCS不执行,我把局部变量都改成全局变量之后,就会进入delay函数里。可是我那些变量局部定义就够了,不知道怎么回事?  谢谢你的指点  很高兴和你交流。
aresc 发表于 2011-3-22 23:05 | 显示全部楼层
确实是被CCS优化了,编译器觉得没有用处,自己给你删除了.

DEBUG模式默认是不带任何优化的,所有没有问题. 但RELEASE模式默认是-O2的优化,编译器会去掉它觉得没用的代码(PAGE54 - spru187n.pdf). 可以打开.map文件搜索delay函数名, 你会发现这个函数只有一个
BNOP.X  B3,5之类的指令, 这条指令应该只是一个类似于RTS的指令(函数调用返回), 你可以把断点设在这条指令对应的地址上,程序根本不会停在这儿. 也就是说CCS把DELAY函数体优化得只剩一个RTS指令,而且根本不会去调用它. 我用C6747的DSP, 可能不同DSP, 那个BNOP指令不同.
aresc 发表于 2011-3-22 23:10 | 显示全部楼层
有一个办法可以解决这个问题, 在你的DELAY函数体定义的局部变量前面加上volatile关键字,那样编译器就不会优化与这个变量有关的代码.
 楼主| 黄jiajia 发表于 2011-3-25 22:22 | 显示全部楼层
:)谢谢高手,加上volatile关键字问题解决了!!有什么问题再向您请教!
WGCH19890113 发表于 2012-7-31 10:50 | 显示全部楼层
您好,请问如何进入release 模式,谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

154

帖子

1

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