2017-02-08 17 views
1

ATMEL Studio 6.2와 해당 툴체인을 avr-gcc (avr8-gnu-toolchain)와 함께 사용하고 있습니다. 나는 플래시 (PROGMEM)에 배치 될 필요가있는 변수를 가지고 있고 글로벌로 선언 :PROGMEM 변수가 (중고)로 선언 된 경우라도 버려졌습니다.

static const uint16_t gPrgLen PROGMEM __attribute__((used)) = 0; 

이 컴파일러는 불평하지 않고 링커는 불평하지 않습니다,하지만 난 .lss를 열 때 파일에는 찾을 수있는 gPrgLen이 없습니다. .MAP 파일에서 우리가 "폐기 입력 섹션"

Discarded input sections 
.progmem.data.gPrgLen 0x00000000 0x2 Boot.o 

그것은 릴리스로 내장되어 아래에 나열 된 것을 볼 수 있지만, 디버그 빌드는 동일한 결과를 제공합니다. *(.progmem*) 섹션에 링커가이 변수를 포함하도록하려면 어떻게해야합니까?

편집
static을 추가했지만 여전히 동일한 결과입니다. 작동하지 않는

# All Target 
all: $(OUTPUT_FILE_PATH) $(ADDITIONAL_DEPENDENCIES) 

$(OUTPUT_FILE_PATH): $(OBJS) $(USER_OBJS) $(OUTPUT_FILE_DEP) $(LIB_DEP) 
@echo Building target: [email protected] 
@echo Invoking: AVR/GNU Linker : 4.8.1 
$(QUOTE)C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1056\avr8-gnu-toolchain\bin\avr-gcc.exe$(QUOTE) -o$(OUTPUT_FILE_PATH_AS_ARGS) $(OBJS_AS_ARGS) $(USER_OBJS) $(LIBS) -Wl,-Map="Boot.map" -Wl,--start-group -Wl,-lm -Wl,--end-group -Wl,--gc-sections -Wl,-section-start=.text=0xf800 -mmcu=at90usb647 
@echo Finished building target: [email protected] 
"C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1056\avr8-gnu-toolchain\bin\avr-objcopy.exe" -O ihex -R .eeprom -R .fuse -R .lock -R .signature -R .user_signatures "Boot.elf" "Boot.hex" 
"C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1056\avr8-gnu-toolchain\bin\avr-objcopy.exe" -j .eeprom --set-section-flags=.eeprom=alloc,load --change-section-lma .eeprom=0 --no-change-warnings -O ihex "Boot.elf" "Boot.eep" || exit 0 
"C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1056\avr8-gnu-toolchain\bin\avr-objdump.exe" -h -S "Boot.elf" > "Boot.lss" 
"C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1056\avr8-gnu-toolchain\bin\avr-objcopy.exe" -O srec -R .eeprom -R .fuse -R .lock -R .signature -R .user_signatures "Boot.elf" "Boot.srec" 
"C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1056\avr8-gnu-toolchain\bin\avr-size.exe" "Boot.elf" 
+0

변수''(void) PROGMEM;'을 코드의 어딘가에 사용 해봤습니까? 작동하지 않으면 링커 파일에 강요해야합니다 (링커 ​​파일이 있습니까?) –

+0

프로그램에서 변수를 사용하려고 시도했지만 여전히 링크되어 있지 않습니다. ATMEL Studio가 make 파일을 생성하고 있지만 프로젝트 속성에 "자유"옵션을 설정할 수 있습니다. –

+0

메이크 파일의 링커 부분을 게시 할 수 있습니까? –

답변

0

홀수 __attribute__((used)) 있음 : 여기

링커 부분이다. 시도 할 두 가지 제안.

먼저 변수를 static에서 volatile으로 변경하거나 volatile을 추가하십시오. 그 멀리 최적화되지 않도록 할 수 있습니다.

문제가 해결되지 않으면, 대신 당신은 그것을 확인하기 위해 링커에 한 줄을 추가 할 수 있습니다 "[P]는 기호를 retend 기호 그것을 정의하는 라이브러리 모듈의 연결을 강제로 정의되어 있지 않습니다"(GCC Link Options). 이는 -u symbol 또는 --undefined=symbol을 통해 이루어집니다.

Atmel Studio 프로젝트 파일에 추가하려면 툴체인 -> AVR/GNU 링커 -> 기타로 이동하십시오. 그런 다음 다른 링커 플래그에서 --undefined=gPrgLen을 추가하십시오.

필자는 수정/컴파일 타임 정보를 다른 방법으로 사용되지 않은 16 진수 파일에 포함시키는 데이 방법을 사용했습니다. 그렇게하면 장치에서 메모리를 검색하고 프로토 타입 및 초기 펌웨어 디버깅 중 변경 사항을 추적하기 위해 어떤 조건에서 빌드되었는지 알 수 있습니다. 내 main.c 파일에는 const char codeCompileDetails[] PROGMEM = "company_name-" __DATE__ "-" __TIME__;과 비슷한 모양의 전역 문자 배열이 있습니다. --undefined=codeCompileDetails과 결합하면 해당 데이터 (여기에는 코드가 컴파일 된 날짜와 시간 포함)가 항상 실행 파일에 포함됩니다.