我有一个简单的FreeRTOS应用程序,只需切换主循环中的LED。
当我用-Os
编译它时,生成的二进制文件的大小为0.没有-Os
一切都按预期工作。这里发生了什么?
我的CFLAGS
是:
CPUFLAG = -mthumb -mcpu=cortex-m4
FPUFLAG = -mfpu=fpv4-sp-d16 -mfloat-abi=hard
WFLAG = -Wall -Wextra -Werror -Wstrict-prototypes
CFLAGS += -std=gnu99 $(WFLAG) $(CPUFLAG) $(FPUFLAG) -mlittle-endian -mthumb -nostartfiles
CFLAGS += -ffunction-sections -fdata-sections -fno-builtin
LDFLAGS += -nostdlib --gc-sections -static
主要是TI的眨眼演示:
int main(void)
{
volatile uint32_t ui32Loop;
//
// Enable the GPIO port that is used for the on-board LED.
//
SYSCTL_RCGC2_R = SYSCTL_RCGC2_GPIOF;
//
// Do a dummy read to insert a few cycles after enabling the peripheral.
//
ui32Loop = SYSCTL_RCGC2_R;
//
// Enable the GPIO pin for the LED (PF3). Set the direction as output, and
// enable the GPIO pin for digital function.
//
GPIO_PORTF_DIR_R = 0x08;
GPIO_PORTF_DEN_R = 0x08;
//
// Loop forever.
//
while(1)
{
//
// Turn on the LED.
//
GPIO_PORTF_DATA_R |= 0x08;
//
// Delay for a bit.
//
for(ui32Loop = 0; ui32Loop < 200000; ui32Loop++)
{
}
//
// Turn off the LED.
//
GPIO_PORTF_DATA_R &= ~(0x08);
//
// Delay for a bit.
//
for(ui32Loop = 0; ui32Loop < 200000; ui32Loop++)
{
}
}
return 0;
}
使用-Os
生成
text data bss dec hex filename
0 0 0 0 0 image.elf
,否则
text data bss dec hex filename
2012 4 728 2744 ab8 image.elf
答案 0 :(得分:4)
由于您指定了-nostartfiles
,因此未使用标准启动及其入口点,因此没有对main
函数的引用,--gc-sections
会将整个部分丢弃为未使用。< / p>
要修复此问题,请尝试为您的函数start
命名,或将-e _main
添加到ld
标记。