最近在学习搭建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!!!为了优化代码执行速度和代码大小,我的延时函数就被干掉了。