Servus allerseits
Mein Problem: das von der StdPerLib benutzte assert_param führt beim
Build zu Errors.
Arbeitsumgebung:
Em::Blocks vers 2.0
GCC vers. 4.7.3 20130226
STM32F407
StdPerLibF4: vers 1.3.0
Compiler Defines:
1 | STM32F40_41xxx
|
2 | USE_FULL_ASSERT
|
3 | USE_STDPERIPH_DRIVER
|
4 | HSE_VALUE=8000000
|
5 | VECT_TAB_SRAM
|
6 | DEBUG
|
stm32f4xx_conf.h:
1 | #ifdef USE_FULL_ASSERT
|
2 | #define assert_param(expr) ((expr) ? ((void)0) : assert_failed((uint8_t *)__FILE__, (uint32_t) __LINE__))
|
3 | void assert_failed(uint8_t *file, uint32_t line);
|
4 | #else
|
5 | #define assert_param(expr) ((void)0)
|
6 | #endif
|
main.cpp:
1 | #ifdef USE_FULL_ASSERT
|
2 | void assert_failed(uint8_t *file, uint32_t line)
|
3 | {
|
4 | debug_print( "assert_failed in file: %s, line: %ld\n", file, line );
|
5 | while (1);
|
6 | }
|
7 | #endif
|
Solange ich keine Dateien der StdPerLib einbinde und nur mit den eigenen
arbeite, kann ich in irgendeiner Datei die Zeile
einfügen und ich kriege prompt per Semihost die korrekte Fehlermeldung.
Sobald ich aber auf irgendeine Datei der StdPerLib zugreife, kriege ich
ein Stakkato der Fehlermeldung wie z.Bsp.
1 | E:\...\stm32f4xx_gpio.c|175|undefined reference to `assert_failed'
|
D.h., der Praeprozessor löst assert_param korrekt nach assert_failed
auf, aber der Linker kann damit nichts anfangen.
Aber wie gesagt: nur bei den StdPerLib-Dateien. Bei meinen eigenen hat
der Linker damit kein Problem.
Wenn ich dasselbe Szenario mit dem EWARM-Kickstart von IAR durchspiele,
funktioniert alles ohne irgendwelche Fehler.
Hat irgendwer 'ne Idee, woran das liegen könnte?