Math functions for c28_float target [message #720576] |
Tue, 30 August 2011 17:14  |
Eclipse User |
|
|
|
Hi everyone.
I am trying to develop packages for c28_float targets which will do mathematical intensive computations. The modules therein will need to use functions like sin() and sqrt(). Before working with RTSC, I had been using the c28 FPU fastRTS library (http://read.pudn.com/downloads136/doc/582720/C28x_FPU_FastRTS_v10.pdf) and I would like to keep using it as a provider of these functions, which will now be used inside a RTSC Module. How do I build a Module so it uses this library?
Thanks for your advice.
|
|
|
Re: Math functions for c28_float target [message #720672 is a reply to message #720576] |
Wed, 31 August 2011 00:06   |
Eclipse User |
|
|
|
First, you'll need a config parameter in your module that can be used in a config script to specify the path to the FPU fastRTS library. Let's call the parameter fastRtsPath. A config script would set it as follows:
var Mod = xdc.useModule('pkg.YourMod');
Mod.fastRtsPath = "c:\tidcs\c28\C28x_FPU_fastRTS\v100";
Then, you can add the function getSects() to the file package.xs, which is located in your package that contains the module. The function getSects() returns the name of the template file, which will be evaluated and the result of the evaluation will be added to the generated linker command file. The generated linker command line comes before the standard runtime library, so by adding the fast RTS library to the linker command file, you'll achieve the required effect.
Since package.xs is a package level file, its functions will be invoked whenever the package is loaded. Therefore, you need to invoke the template only if the module that needs fast RTS is actually used:
function getSects()
{
if (this.YourMod.$used) {
return ("link.xdt");
}
return (null);
}
The next step is to add the actual template file file link.xdt to the package (you can choose some other name, but it's important that the name of the file and the reference to it in getSects() match). The content of link.xdt is:
%var lib = xdc.module("pkg.YourMod").fastRtsPath + "/<library name>";
-l"`lib`"
Notice backquotes on the second line.
There are some other ways to include fastRTS, so if there are some issues with this approach, please let me know, and depending on these issues, we can come up with a different solution.
|
|
|
|
|
|
|
Re: Math functions for c28_float target [message #721438 is a reply to message #721114] |
Thu, 01 September 2011 14:57   |
Eclipse User |
|
|
|
I have been digging some more into the problem.
If I use the following client application:
#include <xdc/std.h>
#include <xdc/runtime/Types.h>
#include <sch/math/Math.h>
#include <math.h>
#define mf_abs(x) (x>0?x:-x)
float fast_sqrt(float number)
{
return sqrt(number);
}
// ======== main ========
Void main()
{
int i;
float x_abs=-2.75;
float y_abs_mf, y_abs_Math;
float x_sqrt=0.5;
float y_sqrt_fast, y_sqrt_Math;
y_abs_mf=mf_abs(x_abs);
y_abs_Math=Math_abs(x_abs);
y_sqrt_fast=fast_sqrt(x_sqrt);
y_sqrt_Math=Math_mySqrt(x_sqrt);
return 0;
}
I get y_sqrt_fast=0.707107 as expected but y_sqrt_Math=0. If I use the assembly step into feature of ccsv4, I see that fast_sqrt is compiled into:
.text, __text, fast_sqrt:
0x009000: FE02 ADDB SP, #2
0x009001: E2030042 MOV32 *-SP[2], R0H
0x009003: 7640BF5E LCR $C:/ti/controlSUITE/libs/math/FPUfastRTS/V100/source/sqrt_f32.asm:47:68$
0x009005: FE82 SUBB SP, #2
0x009006: 0006 LRETR
whereas Math_mySqrt is compiled into:
sch_math_Math_mySqrt, sch_math_Math_mySqrt__F:
0x00C389: 7640BF5E LCR $C:/ti/controlSUITE/libs/math/FPUfastRTS/V100/source/sqrt_f32.asm:47:68$
0x00C38B: 3B01 SETC SXM
0x00C38C: 85A9 MOV ACC, @AL
0x00C38D: BDA90F12 MOV32 *(0:0x0f12), @ACC
0x00C38F: 7700 NOP
0x00C390: 7700 NOP
0x00C391: 7700 NOP
0x00C392: 7700 NOP
0x00C393: E689 .word 0xe689
0x00C394: 0000 ITRAP0
0x00C395: 0006 LRETR
which is a significantly longer code. Despite the fact that both call the same optimized sqrt function, it seems that line 0x00C38D clears the content of register R0H which is supposed to hold the result. I do not know much about C28's assembly so I cannot really tell what is going on, except for some basic stuff.
Also, I found that the "function declared implicitly" warning means that a function doesn't have a prototype and the compiler has to make some assumptions about the values that are being passed/returned. Isn't math.h supposed to define a prototype for sqrt()? I found that if I remove #include <math.h> from Math.c the result is exactly the same.
Any help would be appreciated. Thanks.
[Updated on: Thu, 01 September 2011 18:42] by Moderator
|
|
|
|
|
Re: Math functions for c28_float target [message #741927 is a reply to message #721495] |
Wed, 19 October 2011 22:51  |
Eclipse User |
|
|
|
I can't tell why the prototype cannot be found. Can you build your sch.math package with the verbose output turned on:
I would like to see '-I' options added to the command line. If math.h wasn't on the include path, you would get an error, but if there is some invalid math.h somewhere, which doesn't define everything it should, you would have the problem exactly as yours.
|
|
|
Powered by
FUDForum. Page generated in 0.04487 seconds