GCC优化导致的部分代码丢失

最近在学习搭建STM32的RTOS工程,对Makefile 和链接脚本不熟悉,所以就在网上找了样本参照,结果自己写的APP里面的延时函数总是不起作用。LED灯一直亮。

下面是APP里面的点灯代码:

#include "../../libs/inc/stm32f4xx_rcc.h"
#include "../../libs/inc/stm32f4xx_gpio.h"
#include "stm32f4xx.h"

void delay(void);

void main(void)
{
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
    GPIO_InitTypeDef MyGPIO;

    MyGPIO.GPIO_Pin = GPIO_Pin_5;
    MyGPIO.GPIO_Speed = GPIO_Speed_50MHz;
    MyGPIO.GPIO_Mode = GPIO_Mode_OUT;
    MyGPIO.GPIO_OType = GPIO_OType_PP;

    GPIO_Init(GPIOA, &MyGPIO);

    while(1){
    GPIO_ResetBits(GPIOA, GPIO_Pin_5);
    delay();
    GPIO_SetBits(GPIOA, GPIO_Pin_5);
    delay();
    }
}


void delay(void)
{
    int i,j;

    for( i = 0; i < 1000; i++ )
        for( j = 0; j < 1000; j++ );
}
后来把该部分代码编译成汇编文件,发现delay函数根本没有被调到。

:q
	.syntax unified
	.cpu cortex-m4
	.fpu softvfp
	.eabi_attribute 20, 1
	.eabi_attribute 21, 1
	.eabi_attribute 23, 3
	.eabi_attribute 24, 1
	.eabi_attribute 25, 1
	.eabi_attribute 26, 1
	.eabi_attribute 30, 2
	.eabi_attribute 34, 1
	.eabi_attribute 18, 4
	.thumb
	.syntax unified
	.file	"main.c"
	.text
.Ltext0:
	.cfi_sections	.debug_frame
	.section	.text.startup,"ax",%progbits
	.align	2
	.global	main
	.thumb
	.thumb_func
	.type	main, %function
main:
.LFB123:
	.file 1 "main.c"
	.loc 1 8 0
	.cfi_startproc
	@ args = 0, pretend = 0, frame = 8
	@ frame_needed = 0, uses_anonymous_args = 0
	push	{r4, r5, lr}
	.cfi_def_cfa_offset 12
	.cfi_offset 4, -12
	.cfi_offset 5, -8
	.cfi_offset 14, -4
	.loc 1 9 0
	movs	r1, #1
	.loc 1 8 0
	sub	sp, sp, #12
	.cfi_def_cfa_offset 24
	.loc 1 9 0
	mov	r0, r1
	bl	RCC_AHB1PeriphClockCmd
.LVL0:
	.loc 1 12 0
	movs	r5, #32
	.loc 1 13 0
	movs	r4, #2
	.loc 1 14 0
	movs	r2, #1
	.loc 1 15 0
	movs	r3, #0
	.loc 1 17 0
	mov	r1, sp
	ldr	r0, .L5
	.loc 1 12 0
	str	r5, [sp]
	.loc 1 13 0
	strb	r4, [sp, #5]
	.loc 1 14 0
	strb	r2, [sp, #4]
	.loc 1 15 0
	strb	r3, [sp, #6]
	.loc 1 17 0
	bl	GPIO_Init
.LVL1:
.L2:
	.loc 1 20 0 discriminator 1
	movs	r1, #32
	ldr	r0, .L5
	bl	GPIO_ResetBits
.LVL2:
	.loc 1 22 0 discriminator 1
	movs	r1, #32
	ldr	r0, .L5
	bl	GPIO_SetBits
.LVL3:
	b	.L2
.L6:
	.align	2
.L5:
	.word	1073872896
	.cfi_endproc
.LFE123:
	.size	main, .-main
	.text
	.align	2
	.global	delay
	.thumb
	.thumb_func
	.type	delay, %function
delay:
.LFB124:
	.loc 1 29 0
	.cfi_startproc
	@ args = 0, pretend = 0, frame = 0
	@ frame_needed = 0, uses_anonymous_args = 0
	@ link register save eliminated.
.LVL4:
	bx	lr
	.cfi_endproc
.LFE124:
	.size	delay, .-delay

我明明在while循环里面调用了延时函数,为什么编译出来的汇编文件中就给丢了那? 经过一番查找,发现竟然是因为GCC使用了最高级别优化,该部分延时函数尽然被干掉了我擦。

Makefile文件部分内容如下:

ifeq ($(OptSRC),0)
    COMMONFLAGS+=-O0
    InfoTextSrc=src (no optimize, -O0)
else ifeq ($(OptSRC),1)
    COMMONFLAGS+=-O1
    InfoTextSrc=src (optimize time+ size+, -O1)
else ifeq ($(OptSRC),2)
    COMMONFLAGS+=-O2
    InfoTextSrc=src (optimize time++ size+, -O2)
else ifeq ($(OptSRC),s)
    COMMONFLAGS+=-Os
    InfoTextSrc=src (optimize size++, -Os)
else
    COMMONFLAGS+=-O3
    InfoTextSrc=src (full optimize, -O3)
endif
因为我编译命令没有指定OptSRC,所以默认优化级别就是最高的O3!!!为了优化代码执行速度和代码大小,我的延时函数就被干掉了。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值