This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

对F2809 IQmath cmd文件的一些疑惑

IQmath : > FLASHCD, PAGE = 0     /* Math Code */


IQmathTables : > BOOTROM, PAGE = 0, TYPE = NOLOAD    /* Math Tables In BOOTROM */


IQmathTablesRam : LOAD = FLASHGH, PAGE = 1
                                      RUN = RAML1H0, PAGE = 1
                                     LOAD_START(_IQmathTablesRamLoadStart),
                                     LOAD_END(_IQmathTablesRamLoadEnd),
                                     RUN_START(_IQmathTablesRamRunStart)

请问:

1.

IQmath 、IQmathTables和  IQmathTablesRam三个段是在哪里定义的?是C自带段吗?

2.

IQmathTablesRam : LOAD = FLASHGH, PAGE = 1
                                      RUN = RAML1H0, PAGE = 1
                                     LOAD_START(_IQmathTablesRamLoadStart),
                                     LOAD_END(_IQmathTablesRamLoadEnd),
                                     RUN_START(_IQmathTablesRamRunStart)

其中:我在DSP280x_GlobalPrototypes.h中定义了

extern Uint16 RamfuncsLoadStart;
extern Uint16 RamfuncsLoadEnd;
extern Uint16 RamfuncsRunStart;
extern Uint16 IQmathTablesRamLoadStart;
extern Uint16 IQmathTablesRamLoadEnd;
extern Uint16 IQmathTablesRamRunStart;

正确否?

3.

在IQmath_Quickstart.pdf文档中有说:

Add the boot ROM symbol library (for example: 2802x_IQmath_BootROMSymbols.lib)  and the standard IQmath.lib library to the project using Project->Add Files to Project.

请问2802x_IQmath_BootROMSymbols.lib是做什么的?我的是2809.我在工程的library里面只添加了 IQmath.lib和rts2800_ml.lib,正确否?

4.

在IQmathLib.h里面有下面定义:

typedef   long    _iq;

为什么用_iq定义一个IQ格式的变量,会默认为GLOBAL_Q的IQ格式?_iq与GLOBAL_Q是怎样衔接的?

5.

IQ小数提取函数:

_iqN _IQNfrac( _iqN A) ,它在IQmathLib.h中声明的时候用的是extern    long _IQNint(long A); 为什么不用_iqN?

或者说它在定义时 long _IQNint(long A);为什么不用long?

  • Haypin,

    1. IQmath 、IQmathTables和  IQmathTablesRam就是在cmd中定义的。定义了三个段,一些给编译器编译库的时候用,一些给你工程上用,比如IQmathTableRam.

    2. 正确,其实可以理解为,这些变量在cmd中定义了,哪里要用到它,哪里就要加外部变量声明,一般在main.c中加这些声明,因为用在memcpy中。

    3. 对,你应该要添加IQmath.lib实体库,对于F2802x, 是因为在这些芯片的ROM中就已经有了一些IQmath的函数,所以只要加载符号symbol,让编译器知道就行了。而280x 的ROM中没有IQmath函数,所以所有的函数都要从IQmath.lib中获得。

    4. 至于_iq,你可以看到_iqxx的定义都是一样的,都是一个long型,所以我觉得这里没有什么关系。

    比如doc中就有例子:

    _iq input, sin_out;  //其实这里只是定义了long的两个变量

    input=_IQ29(0.25*PI); //关键是这里,这才是决定input到底是IQ24,还是IQ29

    sin_out =_IQ29sin(input);

     

    Eric

  • Eric老师:

    我说错了一个问题,是 IQmath 、IQmathTables和  IQmathTablesRam是怎么使用的,而不是怎样定义的(其实我对在cmd文件中“定义”这个概念的理解也不清晰,从cmd文件中看出,这个定义的作用其实就是把段分配到某一段空间,而这些段真正是在哪里定义的?我却很疑惑.如在cmd中,.text的.text               : > FLASHAB,      PAGE = 0并不是对.text的定义,而是分配段空间.而.text段是c的自带段,是已经在内部定义好的.而ramfuncs)。

    如我在cmd中定义了如codestart和ramfuncs两个段:

    codestart           : >BEGIN,       PAGE = 0

    ramfuncs           : >FLASHD,     PAGE = 0

    在使用时利用

    .sect "codestart"

    .sect "ramfuncs"就可以实现

    如在cmd中定义了

    ramvars             : > RAML0L1H0,   PAGE = 1

    在使用时利用#pragma DATA_SECTION(pid, "ramvars");

  • Eric老师,

    还有一个问题

    5.

    IQ小数提取函数:

    _IQNfrac( _iqN A)函数 ,它在IQmathLib.h中声明的时候用的是extern    long _IQNint(long A); 

    我想知道_IQNfrac( _iqN A)函数在定义的时候是返回_iqN还是long还是_iq.

    因为我看到IQmath_Quickstart.pdf写是_IQNfrac( _iqN A)函数在定义的时候返回的是_iqN.

    因为返回_iqN和long区别很大.而返回long和_iq是一样的.

  • Haypin,

    其实有些段你并不需要用到它,有些是被编译器用的,编译器在编译的时候会把相应内容归到某些段中,然后映射到对应的memory中。如.text段,所有的代码默认编译到该段中,然后映射到.text指向的memory。

    但某些段是定义了,让我们在程序中可以灵活使用的,像codestart其实比灵活,应为是固定死的,ramfunc好点。

    这些段就是在cmd文件定义的。编译器会识别。你可以用变量来理解它(我一直是这么理解,我认为这样的理解也是对的)。

    而IQmath,IQmathTable这些段也是不用用户用到的,这些应该是IQmath.lib中某些函数会用到这些表格,编译器在编译IQmath.lib的时候,自然要找到IQmathTalbe到底在哪里,就从这里找到。

    Eric

  • Haypin,

    返回的是_iqN类型的数据,其实它也是long型的,只不过该数据我们在程序中应该知道,需要移N位才能够转换成真正的小数。

    如果返回的是_iq,那么它也是long型,但是表示的意思是,需要移位global个位,才能转换成真正的小数。

    所以说所有的_iq数据都是long型的,只不过代表的意思不一样,表示移位数据不一样而已,如果要还原需要移位不同的位数而已。

    Eric