4 Replies Latest reply on Apr 16, 2015 7:36 PM by userc_4697

    Port libfixmath to WICED Smart SDK

      1. Use of Pre-built libfixmath Lib


      Aims at offering useful math functions to WICED Smart developers, this library is implemented based on the open source fix-point math lib called ‘libfixmath’. In general, this lib supports at most 37 fix-point math functions. For a complete list of the math functions supported, please refer to the table in section 3.

      Goal of this section

      This section describes necessary steps to use the pre-built math functions lib in WICED Smart SDK. A test application is also included to demonstrate the use of this lib.

      Files required in this section

      libfixmath lib:

          Header files: libfixmath.h  fix16.h fract32.h int64.h uint32.h (5 in total)

          Static lib file: libfixmath.a

      libfixmath_test application:





      Following description assumes that you are using WICED Smart SDK 1.x.x. It will work for WICED Smart SDK 2.x.x after some minor changes.


      Step1: Copy files to specific directory.

      Copy the 5 header files to the directory below:


      Copy the static lib file “lib_fixmath.a” to the directory below:

      < WICED-Smart-SDK > /Wiced-Smart/spar


      Step2: Edit the makefile.

      Open the file “makefile” under the directory of < WICED-Smart-SDK > /Wiced-Smart/spar.

      At around line 150, there is a block of commands which made the elf file. You should add the name of the static lib file at the end of the line which starts with $(XLD).  An example is shown as below.


      Figure 1  Edit the makefile

      Step3: Verify your porting.

      Copy the directory of “libfixmath_test” to the path below:


      At the Make Target panel, add a new target. Edit its name to the one below:

      RAM.libfixmath_test-BCM920732TAG_Q32 download

      Double click on the new-added target. After the application is running on the WICED Smart platform, by pressing the user button on the BCM20732S EVB, we could verify the output of the test application via a serial terminal. If the application runs safely and the calculation results proved to be right, then you have verified your porting.


      An example of the output of the “libfixmath_test” application is as below:


      Figure 2 Output of test program

      From the test application we could found that, once we include the header file “fixmath.h” in our application, we are able to use the corresponding math functions freely as if they were originally part of the SDK.


      2. Build libfixmath for WICED Smart SDK

      Goals of this section

      In this section, you will learn about the way to build this math functions lib, and you may customize your own math function lib in the same way.

      Files required in this section:

      libfixmath source directory.

      Header files: libfixmath.h  fix16.h fract32.h int64.h uint32.h (5 in total)

            Source files: fix16.c fix16_exp.c fix16_sqrt.c fix16_str.c fix16_trig.c fract32.c uint32.c (totally 7)



      Step1: Source code customization

            Source code modification:

      The source code of the “libfixmath” lib is in the files of the “libfixmath source” directory mentioned above. However, sometimes we may need change the source code according our own requirement.

      For example, in “fix16_str.c”, the libc function “isspace” and “isdigit” is used in the function “fix16_from_str” but the WICED Smart platform does not include these functions. Then you have to implement them in your own method.

      Macros definition:

      The libfixmath lib uses some macros as interfaces for the developers to customize the implementation of the lib files. The 7 macros are listed below:

      #define FIXMATH_NO_CACHE

      #define FIXMATH_SIN_LUT

      #define FIXMATH_FAST_SIN



      #define FIXMATH_NO_64BIT



      Just as their name indicates, the macros are defined to enable or disable some properties of the math lib functions. For example, the definition of FIXMATH_NO_CACHE will lead to no cache used in the implementation of some complex math functions such as exp(x) or sin(x).

      The definition of the macros should be done in fixmath.h or fix16.h.


      Step2: Generate the math function lib file.

      Generate the .o object files:

      • Copy all the 5 header files and the 7 source files into an arbitrary application, “RAM.hello_sensor” for example. The path should be <WICED-Smart-SDK>/Apps/RAM/hello_sensor.
      • Open the “makefile.inc” in the application directory above and add the names of the 7 source files at the end of line 11 starting with “APP_SRC”. That means add the 7 .c files as source files of the application too. The modification should be similar to the shortcut below:


      Figure 3 Makefile to compile

      • Double click on the make target panel and make the hello_sensor application. You will find 7 .o files named after the 7 .c source files in the directory below:

      <WICED-Smart-SDK>/build/ libfixmath_test-BCM920732TAG_Q32-rom-ram-Wiced-release

                    Now you have the object files of your customized source code.

      Generate the .a static lib file:

      The process to generate the .a static lib file is actually to pack the 7 object files into a special one. Please follow the next steps to finish the lib file generation.

      • Backup the Makefile in the directory <WICED-Smart-SDK>. You should recover it later.
      • Copy the 7 object files and the “libfixmath source /Makefile” to the <WICED-Smart-SDK> and cover the original Makefile.
      • Open a command window and change the path to <WICED-Smart-SDK>. By enter the command “make”, “lib_fixmath.a” static lib file will be created at the same directory.  By enter the command “make lib_review”, you could see the content of “lib_fixmath.a”.

      test2.pngFigure 4 Compile output


      • After the static lib file is successfully created, the original Makefile and the “hello_sensor” application should be recovered. You could also modify the Makefile as you like.


      3. Functions Supported and Performance


      The table below lists all the math functions that are supported in the pre-built math lib. For some time-consuming math functions (trigonometric functions, for example), time performance is tested. The performance data in the last column shows how much resource it costs to run the corresponding math functions in WICED Smart BCM920732 platform.

      Function Name


      Time cost(us)

      fix16_to_int(fix16_t a)

      Format conversion

      fix16_from_int(int a)


      fix16_to_str(fix16_t value, char *buf, int decimals);



      fix16_from_str(const char *buf);



      fix16_abs(fix16_t x)

      Value adjust

      fix16_floor(fix16_t x)


      fix16_ceil(fix16_t x)


      fix16_min(fix16_t x, fix16_t y)


      fix16_max(fix16_t x, fix16_t y)


      fix16_clamp(fix16_t x, fix16_t lo, fix16_t hi)


      fix16_add(fix16_t a, fix16_t b)

      Basic calculation


      fix16_sadd(fix16_t a, fix16_t b)


      fix16_sub(fix16_t a, fix16_t b)


      fix16_ssub(fix16_t a, fix16_t b)


      fix16_mul(fix16_t inArg0, fix16_t inArg1)



      fix16_smul(fix16_t inArg0, fix16_t inArg1)



      fix16_div(fix16_t inArg0, fix16_t inArg1)



      fix16_sdiv(fix16_t inArg0, fix16_t inArg1)



      fix16_mod(fix16_t x, fix16_t y)


      fix16_lerp8(fix16_t inArg0, fix16_t inArg1, uint8_t inFract)


      fix16_lerp16(fix16_t inArg0, fix16_t inArg1, uint16_t inFract)


      fix16_sin_parabola(fix16_t inAngle)



      fix16_sin(fix16_t inAngle)



      fix16_cos(fix16_t inAngle)



      fix16_tan(fix16_t inAngle)



      fix16_asin(fix16_t inValue)



      fix16_acos(fix16_t inValue)



      fix16_atan(fix16_t inValue)



      fix16_atan2(fix16_t inY, fix16_t inX)



      fix16_rad_to_deg(fix16_t radians)

      R/d conversion


      fix16_deg_to_rad(fix16_t degrees)



      fix16_sqrt(fix16_t inValue)

      Sqrt & sq


      fix16_sq(fix16_t x)


      fix16_exp(fix16_t inValue)

      Exp & log


      fix16_log(fix16_t inValue)



      fix16_log2(fix16_t x)



      fix16_slog2(fix16_t x)