首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >avr32-gcc:未用函数输出初始化的全局变量

avr32-gcc:未用函数输出初始化的全局变量
EN

Stack Overflow用户
提问于 2015-10-16 13:06:21
回答 1查看 252关注 0票数 0

我尝试用函数的输出初始化一个全局变量。对于gnu-gcc,它的工作原理是一样的,但是当用avr32-gcc编译时,变量被初始化为0。我希望变量由一个函数初始化,因为在实际场景中,它是一个引用(MyClass& myclass = MyClass::getInstance() )。

以下是代码:

代码语言:javascript
复制
extern "C"
{
    #include "led.h"
}

int getInteger() 
{
    return 10;
}

int my_int = getInteger();

int main (void)
{
    LED_On(LED2);

    //my_int = getInteger();    //* This line really sets my_int = 10;

    if(my_int == 10)
    {
        LED_On(LED1);
    }

    while(1){
        __asm__ ("nop");            
    }

    return 0;
}

这是我的Makefile:

代码语言:javascript
复制
PROJ_NAME=TEST

# Include paths for project folder
SRCS_INC += -I. -I./preprocessor

# Sources files for project folder (*.c and *.cpp)
SRCS += main.cpp exception_noNMI.S startup_uc3.S trampoline_uc3.S intc.c led.c

AS = avr32-gcc
ASFLAGS = -x assembler-with-cpp -c -mpart=uc3c1512c -mrelax 
ASFLAGS += ${SRCS_INC}

CC = avr32-gcc 
CFLAGS += -mpart=uc3c1512c
CFLAGS += ${SRCS_INC}

CXX = avr32-g++

LINKER = avr32-g++
OBJCOPY = avr32-objcopy

LDFLAGS  = -nostartfiles -mpart=uc3c1512c
LDFLAGS += ${SRCS_INC}

OBJS += $(addsuffix .o, $(basename $(SRCS)))

# Main rule
all: $(PROJ_NAME).elf

# Linking
${PROJ_NAME}.elf: ${OBJS}
    @echo Linking...
    @$(CXX) $(LDFLAGS) $^ -o $@  
    @$(OBJCOPY) -O ihex ${OBJCOPYFLAGS} $(PROJ_NAME).elf $(PROJ_NAME).hex
    @$(OBJCOPY) -O binary $(PROJ_NAME).elf $(PROJ_NAME).bin

# Assembly files in source folder
%.o: ./%.S
    @mkdir -p $(dir $@)
    @$(AS) $(ASFLAGS) -c $< -o $@

# C files in source folder
%.o: ./%.c
    @mkdir -p $(dir $@)
    @$(CC) -c $< -o $@ $(CFLAGS)

# CPP files in SRC folder
%.o: ./%.cpp
    @mkdir -p $(dir $@)
    @$(CXX) -c $< -o $@ $(CFLAGS)

.PHONY: clean
clean:
    @rm -f $(OBJS) $(PROJ_NAME).elf $(PROJ_NAME).hex $(PROJ_NAME).bin

我还尝试使用__attribute(constructor)创建init函数,如this answer中所解释的那样。尽管如此,它仍然没有被击倒。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-16 17:29:41

据我所见,您还没有启用优化。因此,编译器实际上可能在启动时调用getInteger。现在,您要将默认启动替换为没有显示的内容。也许你只是需要确保这是在启动过程中完成的?此外,您还可以尝试启用优化,并查看是否解析了调用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33171290

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档