This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

STM32F1 compiler issues

Hello,

I am trying to compile a project for STM32F103CB, but it doesn't seem to work properly.
First of all, this project compiles and runs on IAR SDK.
I ported it on uVision 5 SDK, and, after quite some pain, I made it compile.
The problem is, I am still getting this warning:

Libraries\X_Lib\src\X_Configuration.c(438): warning:  #223-D: function "roundf" declared implicitly
        GAverage[0] = (u32)(roundf((float)GAverage[0]/(float)(GSampleCount)));

although I am including the math.h file in X_Configuration.c:

#include <math.h>

in math.h, roundf is defined as

extern _ARMABI_FPEXCEPT double round(double /*x*/);
extern _ARMABI_FPEXCEPT float roundf(float /*x*/);
_ARMDEFLD1(round);

...what am I doing wrong?
Is there some precise setting I overlooked?

Thanks a lot for your time!

Parents
  • so I just had to add

    #define __USE_C99_MATH

    to my X_configuration.c file

    I have to advise caution and some further checking before you consider that your final solution. Macros like that (in implementation name space, as per the two leading '_') shouldn't really be set by application code unless the tool's or library's documentation explicitly says that's what you should do. In short, they're not yours to #define. There's probably some global compiler switch you're supposed to use instead, which will set this switch in turn.

Reply
  • so I just had to add

    #define __USE_C99_MATH

    to my X_configuration.c file

    I have to advise caution and some further checking before you consider that your final solution. Macros like that (in implementation name space, as per the two leading '_') shouldn't really be set by application code unless the tool's or library's documentation explicitly says that's what you should do. In short, they're not yours to #define. There's probably some global compiler switch you're supposed to use instead, which will set this switch in turn.

Children
  • Hans,


    so I just had to add

    #define __USE_C99_MATH

    to my X_configuration.c file

    I have to advise caution and some further checking before you consider that your final solution. Macros like that (in implementation name space, as per the two leading '_') shouldn't really be set by application code unless the tool's or library's documentation explicitly says that's what you should do. In short, they're not yours to #define. There's probably some global compiler switch you're supposed to use instead, which will set this switch in turn.

    indeed. In fact, there is an option in
    Project -> Options for target ... -> C/C++ tab to define/undefine Preprocessor Symbols.
    It's in the same tab in which you add the include paths for your project.

    Thank you again for this detail. :)

  • indeed. In fact, there is an option in
    Project -> Options for target ... -> C/C++ tab to define/undefine Preprocessor Symbols.

    I'm afraid you missed my point. The problem is not about where you make that #define, whether in source or in the compiler flags. It's about whether you're allowed to #define that macro at all. If you're not, you might break a lot more than you fixed.

    Now, the official definition of the C programming language says you're not allowed to do this, because names starting on a double underscore are reserved to the language's implementors (e.g.: Keil or IAR). So you would need some other instance to give you this permission, thus overriding the language standard. The only applicable candidate to be that instance is the documentation of the compiler or library you found this in. So please: look it up.