CCS5.5
C6657
关于程序优化问题,程序的功能模块都调试好(包括硬件初始化,中断初始化……),由于程序需要满足实时性问题,故需要使用-O3编译优化,可是选择了-O3编译后出来的效果和我调试时不一样了,连中断都进不了了,是不是-O3把我程序初始化的代码优化了后一些必要的硬件时序满足不了了?所以硬件功能模块都起不来了?我想达到的效果是程序初始化不做优化,后面的数据处理才做优化,有这样做的吗?有人做过吗?
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
用volatile关键字解决了问题
volatile的作用: 作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值.
简单地说就是防止编译器对代码进行优化.比如如下程序:
XBYTE[2]=0x55;
XBYTE[2]=0x56;
XBYTE[2]=0x57;
XBYTE[2]=0x58;
如果对外部硬件上述四条语句分别表示不同的操作,会产生四种不同的动作,那么编译器就不能像对待纯粹的程序那样对上述四条语句进行优化只认为XBYTE[2]=0x58;而忽略前三条语句(即只产生一条机器代码),此时编译器会逐一的进行编译并产生相应的机器代码(四条).
一般说来,volatile用在如下的几个地方:
1、中断服务程序中修改的供其它程序检测的变量需要加volatile;
2、多任务环境下各任务间共享的标志应该加volatile;
3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;
另外,以上这几种情况经常还要同时考虑数据的完整性(相互关联的几个标志读了一半被打断了重写),在1中可以通过关中断来实
现,2中可以禁止任务调度,3中则只能依靠硬件的良好设计了。
正常的O3优化是不会改变程序运行的行为的,只会减少函数运行的cycle数。极个别情况下O3优化因为使用了一些比较激进的优化措施,会导致运行结果不对。但是你说的中断进不了的问题应该不是O3优化导致的。从时序角度来说,优化只会减少一个模块的运行时间,不会导致时延满足不了的要求的。一般我们对整个工程都采用O3优化,这样效果最好。