- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
In below discussion, i was informed that:
floating point arithmetic are not included within the ROM and SDK because they consume a lot of precious resources.
I made some simple tests best on hello sensor app on WICED 2.1.1
Test 1,
float a = 1.4;
float b = 2.9;
float c = a * b;
float d = b / a;
ble_trace2("c=%d, d=%d", c, d);
build passed and the output is c=4, d=2, which is a correct result.
However from the generated assembly(hello_sensor.s), i did not find any symbol like __aeabi_fmul or __aeabi_fdiv.
Test 2,
float my_fmul(float x, float y)
{
return x*y;
}
float my_fdiv(float x, float y)
{
return x/y;
}
float a = 1.4;
float b = 2.9;
float c = my_fmul(a, b);
float d = my_fdiv(b, a);
ble_trace2("c=%d, d=%d", c, d);
build passed and the result is "c=4, d=2" which is also a correct result.
From hello_sensor.s, i found below symbols:
.global | __aeabi_fmul |
bl | __aeabi_fmul |
.global | __aeabi_fdiv |
bl | __aeabi_fdiv |
I try to search which module did those two symbol reside in. Below is what i found in the generate list file:
_aeabi_cdrcmple ../tier2/brcm/mandatory/bld/20736/patch.elf
__aeabi_d2ulz ../tier2/brcm/mandatory/bld/20736/patch.elf
__aeabi_dadd ../tier2/brcm/mandatory/bld/20736/patch.elf
__aeabi_ddiv ../tier2/brcm/mandatory/bld/20736/patch.elf
__aeabi_dmul ../tier2/brcm/mandatory/bld/20736/patch.elf
__aeabi_drsub ../tier2/brcm/mandatory/bld/20736/patch.elf
__aeabi_dsub ../tier2/brcm/mandatory/bld/20736/patch.elf
__aeabi_fdiv ../../build/hello_sensor_tmp-BCM920736TAG_Q32-rom-ram-Wiced-release/hello_sensor.o
__aeabi_fmul ../../build/hello_sensor_tmp-BCM920736TAG_Q32-rom-ram-Wiced-release/hello_sensor.o
__aeabi_lasr ../tier2/brcm/mandatory/bld/20736/patch.elf
__aeabi_llsl ../tier2/brcm/mandatory/bld/20736/patch.elf
__aeabi_llsr ../tier2/brcm/mandatory/bld/20736/patch.elf
__aeabi_memclr ../tier2/brcm/mandatory/bld/20736/patch.elf
__aeabi_memclr4 ../tier2/brcm/mandatory/bld/20736/patch.elf
I still have no idea where did these symbol come from:-(
Test 3:
A little bit modification on below function:
float my_fmul(float x, float y)
{
x =x*y*x; // added
return x*y;
}
Build OK.
Test 4:
Added one more line:
float my_fmul(float x, float y)
{
x =x*y*x;
y = x*y*x; // added
return x*y;
}
Clean and build again, but this time i got many errors like:
C:\Data\Work\Broadcom\BLE\WICED_Smart_SDK\WICED-Smart-SDK-2.1.1\WICED-Smart-SDK_Test\Wiced-Smart\spar/../../Apps/hello_sensor_tmp/hello_sensor.c:398: undefined reference to `__aeabi_fmul'
I also check __aeabi_fmul and __aeabi_fdiv, they still appear in the hello_sensor.s and ***.list file.
why, why, why?
Any one can help me?
thanks
Solved! Go to Solution.
- Labels:
-
SDK 2.X
- Tags:
- wiced
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
This has been discussed over in this thread: Re: Floating-Point Arithmetic
Essentially, the recommendation was to use a fixed point math library like libfixmath.
With caching and the look-up-table disabled, this library compiles to under 2K. Unused function elimination is enabled by default for all applications in the SDK. So only functions that are accessed by the application will be included in the final image.