avr-gcc: глобальная переменная не инициализирована с выходом функции

Я пытаюсь инициализировать глобальную переменную с выводом функции. Это работает, как и ожидалось, для gnu-gcc, но при компиляции с avr-gcc переменная инициализируется с 0. Я хочу, чтобы переменная была инициализирована функцией, так как в реальном сценарии это ссылка (MyClass& myclass = MyClass::getInstance(),

Вот код:

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:

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 как объяснено в этот ответ.
Тем не менее это не оправдано.

0

Решение

Насколько я вижу, у вас не включена оптимизация. Таким образом, компилятор может фактически вызвать getInteger во время запуска. Теперь вы заменяете запуск по умолчанию чем-то, что вы не показываете. Может быть, вам просто нужно убедиться, что это делается во время запуска? Кроме того, вы можете попытаться включить оптимизацию и посмотреть, разрешен ли вызов.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector