2010-03-24 12:39 PM
Problem with assert_param
2011-05-17 04:44 AM
What error, precisely, is that?
2011-05-17 04:44 AM
Oh! Sorry, I would mean this line:
#error ------------------------------ assert full def.
2011-05-17 04:44 AM
Sorry - what was your objective in doing that?
2011-05-17 04:44 AM
The fact that you're getting neither the ''full'' definition nor the ''null'' definition suggests that you are not actually including this at all...
My aim was to know if the macro was defined or not, and which one.
In fact, now, what I did to temporary solve the problem was comment ALL the
assert_param
lines. As it's not a strictly necessary part of the library I just skipped it... I know that this is not the point, but it works now. Have you any other idea?2011-05-17 04:44 AM
You shouldn't need to do that - so it's an indication that there is something fundamentally wrong with the way you've goy your project set up.
You might be lucky, and this might be the only thing that's affected - but I think it would be better for you to understand what's actually going on, and to fix it properly. As already noted, this is a standard 'C' programming technique - if you try to skimp understanding it now, it will just come back to bite you again later!2011-05-17 04:44 AM
It's highly unlikely to be a compiler bug - far more likely a project set-up issue.
I don't know IAR, so can't comment specifically on that - but this really is basic stuff, so someone would certainly have noticed by now if there were a bug! The symptoms sound like the definition is not visible at the point where the macro is used - which most likely means that you have forgotten to include a header, or include the wrong header somewhere... Can you get any of the sample projects to work unmodified ''straight out of the box''?2011-05-17 04:44 AM
You are completely right, but neither me nor the people I asked are able to understand what the hell is happening here... I will try to ask to IAR support because perhaps it's a compiler bug. I don't know, do you?
Greetings,
Carles Araguz
2011-05-17 04:44 AM
Hi,
I'm seeing the same (or similar) problem.
Adding #error to a header file proves nothing unless you look close enough. ;) Sure it may show that header file is being included, but not necessarily as part of the compilation unit that complains about assert_param. The macro assert_param() is defined in stm32f10x_conf.h (comments snipped for brevity): #ifdef USE_FULL_ASSERT #define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__)) void assert_failed(uint8_t* file, uint32_t line); #else #define assert_param(expr) ((void)0) #endif These are the compile errors:stm32f10x_rcc.c: In function 'RCC_HSEConfig': stm32f10x_rcc.c:282: warning: implicit declaration of function 'assert_param' stm32f10x_gpio.c: In function 'GPIO_DeInit': stm32f10x_gpio.c:110: warning: implicit declaration of function 'assert_param' It is clear that assert_param is not defined, and therefore stm32f10x_conf.h could not have been #included for these compilation units. This suggests that no amount of tweaking the preprocessor macro definitions is ever going to fix this - although I may stand to be corrected. Afaict, stm32f10x_conf.h is intended to be copied into the user application where it may be customised, whereas stm32f10x_ppp.c (21 files in total) are the 'library' modules (albeit individually linked). I've grepped the library tree and the *only* place I can find #define assert_param is in the template stm32f10x_conf.h file, but assert_param() is used throughout the library modules. Further investigation suggests that there might be some mechanism in the #include nesting that allows for stm32f10x_conf.h to be included by each stm32f10x_ppp.c file, but I haven't managed to get to the bottom of it yet. I'm new to STM32 (but not C :-p) and I just don't see how this framework is supposed to work - any insight to this would be much appreciated. The library files and demo examples are taken from here - http://www.st.com/stonline/products/support/micro/files/stm32f10x_stdperiph_lib.zip ps. sorry if the formatting is off, or if it's already been answered elsewhere. I was googling for an answer and found this recent thread, hence the rapid sign up and post.2011-05-17 04:44 AM
Ok, I think I've found the solution to this.
Define USE_STDPERIPH_DRIVER in the pre-processor macro definitions, and it causes the necessary header file nesting to pull in the assert_param() macro definition. Can anyone can point me to the RTFM where is says to do this? There's probably more to know that isn't obvious. The project compiles without warnings now at least, although not tested yet. :)2011-05-17 04:44 AM
Yes! You found the solution!!! Thanks a lot!
Unfortunately the reference manual doesn't say anything about it... The only doc we have is the help file manual and that sucks... Well, at least I think that this is not explained anywhere. Maybe it is but is impossible to find it...
Again thanks x.x.001!