关于MDK(Keil5)优化的相关内容

在使用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_completelyUnroll 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值