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.

[参考译文] CCS/TM4C123GH6PM:浮点单元不工作

Guru**** 2318830 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/585062/ccs-tm4c123gh6pm-floating-point-unit-is-not-working

器件型号:TM4C123GH6PM
主题中讨论的其他器件:CODECOMPOSER

工具/软件:Code Composer Studio

如何使用 FPU 单元。我按照示例操作并运行它。它正常、但当我尝试 使用 FPUEnable 和 FPUlazystacking 运行代码时 、它不起作用。

请指导我如何在 tm4c 的解压缩器中使用 FPU 单元

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    "不工作"是什么意思?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    启动文件默认启用 FPU。 因此、如果您尝试调用 FPUEnable、您可能看不到任何差异、因为它已启用。 如果您使用 FPUDisable、则应得到故障异常、因为代码被编译为使用 FPU 指令。 如果要比较 FPU 和非 FPU 之间的性能,则可以转到项目属性->处理器选项,选择 vfplib 而不是 FPvSPD16。 这将指示编译器使用软件库来实现浮点运算、该运算所需的周期比 FPU 所需的周期要多得多。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    #include
    #include
    #include
    #include
    #include "inc/hw_memmap.h"
    #include "inc/hw_types.h"
    #include "driverlib/fpu.h"
    #include "driverlib/fpu.c"
    #include "driverlib/sysctl.h"



    void 逆向(float[6]、int、float[6]);
    浮点决定因素(float[6][6]、int);
    空系数(float[6][6]、int、float[6]);
    void 转置(float[6][6]、float[6][6]、int、float[6]);



    int main (空)


    inti[4]={2,3,5,4}; //定义关键电源系统到节点
    intj[4]={1、2、2};
    floatz[4]={0.003113、015709、6.951e-3、9.029e-3}; //定义关键电源系统的起始节点
    floatv[5]={0.962、0.952、0.963、0.946、0.937}; //定义从主电源流代码获得的关键电源系统节点电压


    浮点Q=1.739; //定义从主电源流代码获得的代理无功功率
    floatP=1.449; //定义从主电源流代码获取的业务代表活动电源
    floatS=3.0; //定义代理的最大生成能力
    float Q1=9.0;
    //AQ=S*S;
    浮点 Q2;
    Q2=(P*P);
    浮点 Q3;
    Q3=(Q1-Q2);
    floatSF=7.0/93; //代理节点的灵敏度因子
    floatnqj=0.1/3; //麻醉剂下降系数
    floatQmax=powf (q3、0.5); //找到最大可用的无功功率生成
    floatxo[6]={0}; //初始化未知
    //初始化字段如果存在,则指示字段
    intpriority = 0; //初始化业务代表优先级
    intDQ[4]={6,6,6,0,0}; //表示 j (1)和 i (1)之间的无功功率流变化等于 x (6)、
    //或 i (3)和 j (3)之间的变化不等于零
    浮点A[6];
    float VIO[5]={0};
    floatx[6]={0};
    内部分配;
    int n、c;


    FPUEnable();
    FPULazyStackingEnable();


    SysCtlClockSet (SYSCTL_SYSDIV_4|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHz|SYSCTL_OSC_MAIN);








    ///-------------------- 检查是否有违规
    for (n=0;n<5;n++)

    如果(v[n]<0.95)

    VIO[n]=0.96-v[n];
    flag=1;

    否则、如果(v[n]>1.05)

    VIO[n]=1.04-v[n];
    flag=1;



    if (flag==1) //如果为 True,则存在违规

    priority=priority+1;
    //选择最大违规的总线
    INT maximum = VIO[0];
    对于(c = 1;c < 5;c++)

    如果(VIO[c]>最大值)

    最大值= VIO[c];
    LOC = c;


    x[loc+1]=VIO[loc];//指示最大违规节点所需的解决方案


    int act、k、l、m、q;
    float b[6]={0、0、0、0、0、 VIO[loc]};
    float B1[6]={xo[5]、0、0、0、0、VIO[loc]};
    float ff[6]={{1、0、0、0、-SF}、
    {v[0]/v[1]、-1、0、0、-z[0]/v[1]}、
    {0、v[1]/v[2]、-1、0、-z[1]/v[2]}、
    {0、v[1]/v[4]、0、-1、0}、
    {0、v[1]/v[3]、0、-1、0}、
    {0、0、0、1、0}};
    float FF1[6][6]={{1、0、0、0、-nqj}、
    {v[0]/v[1]、-1、0、0、-z[0]/v[1]}、
    {0、v[1]/v[2]、-1、0、-z[1]/v[2]}、
    {0、v[1]/v[4]、0、-1、0}、
    {0、v[1]/v[3]、0、-1、0}、
    {0、0、0、1、0}};
    float FF2[6][6]={{0、0、0、0、0、1}、
    {v[0]/v[1]、-1、0、0、-z[0]/v[1]}、
    {0、v[1]/v[2]、-1、0、-z[1]/v[2]}、
    {0、v[1]/v[4]、0、-1、0}、
    {0、v[1]/v[3]、0、-1、0}、
    {0、0、0、1、0}};


    float bt[6];
    float b1t[6];

    for (act=0;act<3;act++)

    float m_invers[6][6];

    if (act=0)

    反向(ff、6、m_invers);
    for (k=0;k < 6;k++)

    x[k]=0;
    for (l=0;l<6;l++)

    x[k]=x[k]+(m_逆向[k][l]*bt[l][0]);



    if (act=1)

    逆向(ff1、6、m_invers);
    for (k=0;k < 6;k++)

    x[k]=0;
    for (l=0;l<6;l++)

    x[k]=x[k]+(m_逆向[k][l]*bt[l][0]);



    if (act==2)

    逆向(ff2、6、m_invers);
    for (k=0;k < 6;k++)

    x[k]=0;
    for (l=0;l<6;l++)

    x[k]=x[k]+(m_逆向[k][l]*b1t[l][0]);




    for (m=0;m<=5;m++)

    a[m][2*act]=x[m];//将某个操作的 x 值存储在矩阵 A 中
    //检查每个操作的基础解决方案的特性---

    for (q=0;q<5;q++)

    if ((v[q]+x[q])<0.95)

    a[q][2*act+1]=v[q]+x[q]-0.95;


    其他

    if ((v[q]+x[q])>1.05)

    a[q][2*act+1]=v[q]+x[q]-1.05;



    if (((Q+x[5])>Qmax)

    A[5][2*act]=(Q+x[5])-Qmax;




    浮点 VSTAR;
    float sum1=0;
    float sum2=0;
    float sum3=0;
    int s;

    对于(s=0;s<6;s++)

    sum1=sum1+a[s][1];
    sum2=sum2+a[s][3];
    sum3=sum3+a[s][5];


    //启用 SSI 模块。
    //


    if (sum1 <fabsf(0.001))

    //发送消息


    VSTAR=A[0][0]*(1+(nqj*a[5][0])/a[0]);

    否则为 if (sum2 <fabsf(0.001))

    //发送消息


    VSTAR=a[0][2]*(1+(nqj*a[5][2])/a[0][2]);


    否则、IF (sum3 <fabsf(0.001))

    //发送消息

    VSTAR=a[0][4]*(1+(nqj*a[5][4])/a[0][4]);








    void 逆向(float matrix [6]、int size、float m_invers[6][6])

    浮点数 d;
    int i、j;
    float matrial_codfact[6][6];
    float m_TRAN置[6][6];

    d=决定因素(矩阵、大小);

    协因子(矩阵、大小、矩阵协因子);


    转置(矩阵、矩阵协因子、大小、m_TRAN置);

    对于(i=0 <size;i++)

    对于(j=0;<size;j++)

    m_invers[i][j]=m_TRAN置 e[i][j]/ d;




    /*用于计算矩阵的决定因素。 此函数为递归*/
    浮点决定因素(浮点矩阵[6][6]、int 大小)

    float s=1、det=0、m_MINOR [6];
    int i、j、m、n、c;
    如果(size=1)

    返回(矩阵[0][0]);

    其他

    DET=0;
    对于(c=0;<size;c++)

    M=0;
    N=0;
    对于(i=0 <size;i++)

    对于(j=0;<size;j++)

    m_MINOR [i][j]=0;
    if (i!= 0 && j!= c)

    m_MINOR [m][n]=matrix [i][j];
    如果(n<(size-2))
    N++;
    其他

    N=0;
    M++;




    DET=det + s *(matrix [0][c]* det뚨 因素(m_minor、size-1));
    S=-1 * s;



    返回(坐浴盆);


    /*计算矩阵的系数*/
    空协因子(float matries[6][6]、int size、float matries_cofacter[6][6])

    float m_codum[6][6];
    int p、q、m、n、i、j;
    对于(q=0;<size;q++)

    对于(p=0;pg <size;p++)

    M=0;
    N=0;
    对于(i=0 <size;i++)

    对于(j=0;<size;j++)

    if (i!= q & j!= p)

    m_cofaction[m][n]=matrix [i][j];
    如果(n<(size-2))
    N++;
    其他

    N=0;
    M++;




    materize_codum[q][p]=pow (-1、q + p)* dutterm_codfactor、size-1);





    /*查找矩阵系数转置*/
    void 转置(float matries[6][6]、float matries_cofacter[6][6]、int size、float m_transfose [6])

    int i、j;


    对于(i=0 <size;i++)

    对于(j=0;<size;j++)

    m_TRANSPUSE[i][j]=matri_cofaction[j][i];












    这是我的 code.it 不是很简单、multiplication.it 给出了错误。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

     问题是什么? 您遇到了什么错误? 您在编译期间还是在运行时遇到错误?

     如果没有缩进、您的代码很难读取。 请通过单击编辑器窗口右下角的"使用富格式"粘贴您的代码、然后选择"使用 SyntaxHighighter 插入代码"选项卡。

     我快速浏览您的代码、并使用未声明的变量'flag'。 如果有问题、它将不会编译。 请参阅以下代码片段。 变量标志在何处声明?

    如果(v[n]<0.95)
    {
    VIO[n]=0.96-v[n];
    flag=1;
    }
    否则(v[n]>1.05)
    {
    VIO[n]=1.04-v[n];
    flag=1;
    }
    }
    
    如果(flag=1)//如果存在违反
    {真} 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    海报报告:"不做简单的乘法。" (在他的帖子(非常)底部报告! 不是最好的位置来确保注意。)

    如果问题确实是"简单乘法"、那么说明失败的代码列表是否会更加简短? (即、保存海报、您的和我阅读/查看这一栏的时间...)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    与您的代码相关的几个观察结果:

    1) 1)您需要创建一个项目、并将文件 startup_ccs.c 添加到该项目中。 在您的评论中没有明确说明这一点。

    2) 2)您需要生成列表文件和映射文件;从列表文件中、您应提取有关堆栈使用情况的信息并为其设置正确的维度。 我怀疑您有堆栈使用问题。

    3) 3)不要试图重塑车轮-在网上或一些书籍中发布了 C 语言的矩阵操作程序-请查找" C 语言数字插值"第二版。 使用它们、它们已经由其他人测试。 (请记住 CMSIS 软件包是否包含某些软件包、请无论如何检查)

    4) 4)在 PC 上测试您的例程、如果满意、则在 CCS 上移动源代码。

    5) 5)在您的评论"有错误"中不要太短-什么错误? 我们不能猜到、只需复制/粘贴第一个并发布它们。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Rabia、
    我修复了由于未声明变量而导致的一些编译错误、并尝试运行您的代码。 由于堆栈溢出、它正处于异常状态。 默认的堆栈大小仅为512字节。 在增加到2048字节后、我能够运行大部分代码、但再次运行为异常。 我将堆栈大小更改为3072、代码运行。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    虽然供应商的 Charles 和 Friend Petrei 的诊断工作是正确和令人印象深刻的、但我想指出、"海报展示了展示其问题或问题的"最低代码块"(包括定义和配置)、将会大大受益。"

    外科医生"将"兴趣领域"(即"紧密关注")"缩小/防止分心、这会减慢并使他们的任务/目标复杂化。

    我们的编程领域从类似的"锁定"目标中受益匪浅。  回顾数百(或数千)行代码是"过度"-将任务大幅减少到其本质、"速度、简化和增强"问题解决!   这种"追求精髓"的效果是能够带来比(著名的-努力之光)"不起作用!"更好的问题描述。

    这种严格的方法提供的额外关注-最好能快速、更可控和更高效地解决问题。   (在需要"外部援助"时尤其证明...)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好,查尔斯

     我现在运行代码没有错误、但有与依赖关系相关的警告、如

    gmake:循环./tm4c123ghp6.cmd.out <-./tm4c123ghp6.cmd 相关性已删除。
    gmake:循环 C:/ti/TivaWare_C_Series-2.1.2.111/driverlib/ccs/Debug/driverlib.lib.out <- C:/ti/TivaWare_C_Series-2.1.2.111/driverlib/ccs/Debug/driverlib.lib 相关性已删除。

    请告诉我 您声明要编译代码的变量。

    以及如何删除这些依赖项警告。我将再次向您发送代码。  

    #include
    #include
    #include
    #include
    #include "inc/hw_memmap.h"
    #include "inc/hw_types.h"
    #include "driverlib/fpu.h"
    #include "driverlib/sysctl.h"

    void 逆向(float[6]、int、float[6]);
    浮点决定因素(float[6][6]、int);
    空系数(float[6][6]、int、float[6]);
    void 转置(float[6][6]、float[6][6]、int、float[6]);


    int main (空)

    FPULazyStackingEnable();
    FPUEnable();
    SysCtlClockSet (SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHz | SYSCTL_OSC_MAIN);

    //int i[4]={2、3、5、4};//定义关键电源系统到节点
    //int j[4]={1、2、2};
    float z[4]={0.003113、01570、6.951e-3、9.029e-3};//定义关键电源系统 float 节点
    float v[5]={0.962,0.952,0.963,0.946,0.937};//定义从主电源流代码获取的关键电源系统节点电压


    float Q=1.739;//定义从主电源流代码获得的代理无功功率
    float P=1.449;//定义从主电源流代码获取的代理活动电源
    float S=3.0;//定义代理的最大生成能力
    //int unknownsQ=1;//如果下游的另一个代理将影响此区域,则无知情的无功功率变化数
    double AQ=powf (S、2);
    double bq=powf (P、2);
    双 ABQ=AQ-bq;
    float SF=7.0/93;//代理节点灵敏度因子
    float nqj=0.1/3;//麻醉剂压降系数
    double Qmax=sqrtf (ABQ);
    //float Qmax=powf (ABQ、0.5);//找到可提供的最大无功功率生成
    //printf ("Qmax=%f\n"、Qmax);
    float xo[6]={0};//初始化未知
    int flag=0;//初始化表示版本的字段(如果存在)=1
    int priority=0;//初始化代理优先级
    //int DQ[4]={6、6、0、0};//表示 j (1)和 i (1)之间的无功功率流变化等于 x (6)、
    //或 i (3)和 j (3)之间的变化不等于零
    float A[6]={0};
    float VIO[5]={0};
    float x[6]={0};
    内部分配;
    int n、c;


    ///-------------------- 检查是否有违规
    for (n=0;n<5;n++)

    如果(v[n]<0.95)

    VIO[n]=0.96-v[n];
    flag=1;

    否则、如果(v[n]>1.05)

    VIO[n]=1.04-v[n];
    flag=1;

    if (flag==1)//如果为 True,则存在违规

    priority=priority+1;
    //选择最大违规的总线
    INT maximum = VIO[0];

    对于(c = 1;c < 5;c++)

    如果(VIO[c]>最大值)

    最大值= VIO[c];
    LOC = c;

    x[loc+1]=VIO[loc];//指示最大违规节点所需的解决方案


    int act、k、l、m、q、s;
    float b[6]={0、0、0、0、0、 VIO[loc]};
    float B1[6]={xo[5]、0、0、0、0、VIO[loc]};
    float ff[6]={{1、0、0、0、-SF}、
    {v[0]/v[1]、-1、0、0、-z[0]/v[1]}、
    {0、v[1]/v[2]、-1、0、-z[1]/v[2]}、
    {0、v[1]/v[4]、0、-1、0}、
    {0、v[1]/v[3]、0、-1、0}、
    {0、0、0、1、0}};
    float FF1[6][6]={{1、0、0、0、-nqj}、
    {v[0]/v[1]、-1、0、0、-z[0]/v[1]}、
    {0、v[1]/v[2]、-1、0、-z[1]/v[2]}、
    {0、v[1]/v[4]、0、-1、0}、
    {0、v[1]/v[3]、0、-1、0}、
    {0、0、0、1、0}};

    float FF2[6][6]={{0、0、0、0、0、1}、
    {v[0]/v[1]、-1、0、0、-z[0]/v[1]}、
    {0、v[1]/v[2]、-1、0、-z[1]/v[2]}、
    {0、v[1]/v[4]、0、-1、0}、
    {0、v[1]/v[3]、0、-1、0}、
    {0、0、0、1、0}};


    float bt[6];
    float b1t[6];
    对于(n=0;n<6;n++)

    BT[n][0]=b[n];
    b1t[n][0]=b1[n];


    for (act=0;act<3;act++)

    float m_invers[6][6];

    if (act=0)

    反向(ff、6、m_invers);


    for (k=0;k < 6;k++)

    x[k]=0;
    for (l=0;l<6;l++)

    x[k]=x[k]+(m_逆向[k][l]*bt[l][0]);



    if (act=1)

    逆向(ff1、6、m_invers);
    for (k=0;k < 6;k++)

    x[k]=0;
    for (l=0;l<6;l++)

    x[k]=x[k]+(m_逆向[k][l]*bt[l][0]);



    if (act==2)

    逆向(ff2、6、m_invers);
    for (k=0;k < 6;k++)

    x[k]=0;
    for (l=0;l<6;l++)

    x[k]=x[k]+(m_逆向[k][l]*b1t[l][0]);


    for (m=0;m<=5;m++)

    a[m][2*act]=x[m];//将某个操作的 x 值存储在矩阵 A 中
    //检查每个操作的基础解决方案的特性---


    for (q=0;q<5;q++)

    if ((v[q]+x[q])<0.95)

    a[q][2*act+1]=v[q]+x[q]-0.95;


    其他

    if ((v[q]+x[q])>1.05)

    a[q][2*act+1]=v[q]+x[q]-1.05;

    if (((Q+x[5])>Qmax)

    A[5][2*act]=(Q+x[5])-Qmax;

    float sum1=0;
    float sum2=0;
    float sum3=0;
    for (s=0;s<6;s++)

    sum1=sum1+a[s][1];
    sum2=sum2+a[s][3];
    sum3=sum3+a[s][5];

    浮点 VSTAR;
    if (sum1 <fabsf(0.001))

    //发送消息

    VSTAR=A[0][0]*(1+(nqj*a[5][0])/a[0]);



    否则为 if (sum2 <fabsf(0.001))

    //发送消息
    VSTAR=a[0][2]*(1+(nqj*a[5][2])/a[0][2]);

    否则、IF (sum3 <fabsf(0.001))

    //发送消息
    VSTAR=a[0][4]*(1+(nqj*a[5][4])/a[0][4]);


    void 逆向(float matrix [6]、int size、float m_invers[6][6])

    浮点数 d;
    int i、j;
    float matrial_codfact[6][6];
    float m_TRAN置[6][6];

    d=决定因素(矩阵、大小);

    协因子(矩阵、大小、矩阵协因子);


    转置(矩阵、矩阵协因子、大小、m_TRAN置);

    对于(i=0 <size;i++)

    对于(j=0;<size;j++)

    m_invers[i][j]=m_TRAN置 e[i][j]/ d;


    /*用于计算矩阵的决定因素。 此函数为递归*/
    浮点决定因素(浮点矩阵[6][6]、int 大小)

    float s=1、det=0、m_MINOR [6];
    int i、j、m、n、c;
    如果(size=1)

    返回(矩阵[0][0]);

    其他


    DET=0;
    对于(c=0;<size;c++)

    M=0;
    N=0;
    对于(i=0 <size;i++)

    对于(j=0;<size;j++)

    m_MINOR [i][j]=0;
    if (i!= 0 && j!= c)

    m_MINOR [m][n]=matrix [i][j];

    如果(n<(size-2))
    N++;
    其他

    N=0;
    M++;





    DET=det + s *(matrix [0][c]* det뚨 因素(m_minor、size-1));
    S=-1 * s;


    返回(坐浴盆);

    /*计算矩阵的系数*/
    空协因子(float matries[6][6]、int size、float matries_cofacter[6][6])

    float m_codum[6][6];
    int p、q、m、n、i、j;
    对于(q=0;<size;q++)

    对于(p=0;pg <size;p++)

    M=0;
    N=0;
    对于(i=0 <size;i++)

    对于(j=0;<size;j++)

    if (i!= q & j!= p)

    m_cofaction[m][n]=matrix [i][j];
    如果(n<(size-2))
    N++;
    其他

    N=0;
    M++;




    materize_codum[q][p]=pow (-1、q + p)* dutterm_codfactor、size-1);

    /*查找矩阵系数转置*/
    void 转置(float matries[6][6]、float matries_cofacter[6][6]、int size、float m_transfose [6])

    int i、j;


    对于(i=0 <size;i++)

    对于(j=0;<size;j++)

    m_TRANSPUSE[i][j]=matri_cofaction[j][i];

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

     您的项目文件夹中是否也有 driverlib? 如果您从 TivaWare 链接 driverlib、请确保不要在工程文件夹中复制它。 请参阅此类似文章、了解您是否遇到相同的问题。