Проблем:
Изображението на фърмуера, генерирано при свързване със статична библиотека, е различно от изображението на фърмуера, генерирано при свързване с обектите, директно извлечени от статичната библиотека.
И двете изображения на фърмуера се свързват без грешка и се зареждат успешно в микроконтролера.
Последният двоичен файл (свързан с обекти) се изпълнява успешно и според очакванията, докато първият (свързан със статичната библиотека) не.
Единствените предупреждения по време на компилация са unused-but-set-variable
в доставения от производителя HAL, които поради различни дефиниции на макроси не са необходими за компилираното изпълнение; и unused-parameter
в различни слаби функции, също в рамките на предоставения от производителя HAL.
Описание:
Разработвам вградено приложение за STM32F407. Досега работех с една кодова база, включваща HAL и кода за настройка на микропроцесора, драйвер за конкретна периферия и приложение, използващо първите две.
Тъй като искам да разработя множество приложения, използвайки един и същ драйвер и HAL (и двата са завършени и тествани, така че няма да се променят често), искам да компилирам и разпространявам HAL и драйвера като статична библиотека, която след това може да бъде свързана с източник на приложение.
Проблемът е, че при свързване на приложението и статичната библиотека, изображението на фърмуера не се изпълнява правилно на микропроцесора. При свързване на приложението и обектните файлове, директно извлечени от статичната библиотека, изображението на фърмуера се изпълнява според очакванията.
По-конкретно:
Създаденият двоичен файл не работи при свързване със статична библиотека с помощта на:
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(APPOBJECTS) Library/libtest.a
Създаденият двоичен файл работи при свързване с обекти, извлечени от статична библиотека с помощта на:
@cd Library && $(AR) x libtest.a && cd ..
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(APPOBJECTS) Library/*.o
И в двата случая:
CFLAGS = $(INCLUDES) $(DEFS) -ggdb3 -O0 -std=c99 -Wall -specs=nano.specs -nodefaultlibs
CFLAGS+= -fdata-sections -ffunction-sections -mcpu=cortex-m4 -march=armv7e-m -mthumb
CFLAGS+= -mfloat-abi=hard -mfpu=fpv4-sp-d16 -MD -MP -MF [email protected]
LDFLAGS = -T$(LDSCRIPT) -Wl,-static -Wl,-Map=$(@:.elf=.map),--cref -Wl,--gc-sections
Сравних резултатите от -Wl,--print-gc-sections
, както и от app.map
файла, но има достатъчно различни различия между двете компилации, така че нито едно нещо не изскача като грешно. Опитах и без -Wl,--gc-sections
, без резултат.
Резултатът от arm-none-eabi-size
от двете изображения на фърмуера е:
text data bss dec hex filename
43464 76 8568 52108 cb8c workingapp.elf
text data bss dec hex filename
17716 44 8568 26328 66d8 brokenapp.elf
Подобно несъответствие в размера може да се види при компилиране без -Wl,--gc-sections
Използвайки arm-none-eabi-gdb
за отстраняване на грешки в изпълнението на микроконтролера, дефектното изображение на фърмуера влиза в безкраен цикъл, когато възникне прекъсване на WWDG. Това прекъсване не е разрешено във фърмуера и следователно манипулаторът на прекъсванията по подразбиране е Default_Handler
(безкраен цикъл). Това прекъсване не възниква при стартиране на работещия образ на фърмуера.
Възникващото WWDG прекъсване всъщност е червена херинга, както е описано в приетия отговор
--Майк