在使用MDK开发STM32F407的过程中,发现本来定义好的软件延时时间不太正确。后来得知是开软件优化后的原因(此处的软件优化是指Project ->Options for target "" ->C/C++ ->Optimization level -3),level 3 是最高级优化,优化力度最大,所以将软件延时时间优化变短,违背当初软件设计的初衷。
解决方法是:使用MDK提供的预编译指令 #pragma O0 来解决。其中O0是指优化等级为0 ,不优化。将此预编译指令放在需要禁止优化的程序前面即可。
#pragma O0 //此句后面的程序均不优化!保障延时正确
void delay_us(u16 time)
{
u16 i=0;
while(time--)
{
i=10; //自己定义
while(i--) ;
}
}
另外还有循环展开的优化(MDK帮助文档搜索 Optimizing loops)
#pragma unroll (n ) | Unroll n iterations of the loop.(展开循环的n个迭代) |
#pragma unroll_completely | Unroll all the iterations of the loop.(展开所有的迭代) |
不展开的循环 | 展开四次迭代的循环 |
---|---|
int countSetBits1(unsigned int n) { int bits = 0; while (n != 0) { if (n & 1) bits++; n >>= 1; } return bits; } | int countSetBits2(unsigned int n) { int bits = 0; #pragma unroll (4) while (n != 0) { if (n & 1) bits++; n >>= 1; } return bits; } |
不展开的循环 | 展开四次迭代的循环 |
---|---|
countSetBits1: mov r1, r0 mov r0, #0 cmp r1, #0 bxeq lr mov r2, #0 mov r0, #0 .LBB0_1: and r3, r1, #1 cmp r2, r1, asr #1 add r0, r0, r3 lsr r3, r1, #1 mov r1, r3 bne .LBB0_1 bx lr | countSetBits2: mov r1, r0 mov r0, #0 cmp r1, #0 bxeq lr mov r2, #0 mov r0, #0 LBB0_1: and r3, r1, #1 cmp r2, r1, asr #1 add r0, r0, r3 beq .LBB0_4 @ BB#2: asr r3, r1, #1 cmp r2, r1, asr #2 and r3, r3, #1 add r0, r0, r3 asrne r3, r1, #2 andne r3, r3, #1 addne r0, r0, r3 cmpne r2, r1, asr #3 beq .LBB0_4 @ BB#3: asr r3, r1, #3 cmp r2, r1, asr #4 and r3, r3, #1 add r0, r0, r3 asr r3, r1, #4 mov r1, r3 bne .LBB0_1 .LBB0_4: bx lr |