是否需开启浮点运算功能

发布于 2020-11-25 22:03:56

您好,我用的是STM32F407ZGT6,在程序中会用到单精度浮点数运算,我看cpuport.c文件中的如下代码:

struct exception_stack_frame_fpu
{
    rt_uint32_t r0;
    rt_uint32_t r1;
    rt_uint32_t r2;
    rt_uint32_t r3;
    rt_uint32_t r12;
    rt_uint32_t lr;
    rt_uint32_t pc;
    rt_uint32_t psr;

#if USE_FPU
    /* FPU register */
    rt_uint32_t S0;
    rt_uint32_t S1;
    rt_uint32_t S2;
    rt_uint32_t S3;
    rt_uint32_t S4;
    rt_uint32_t S5;
    rt_uint32_t S6;
    rt_uint32_t S7;
    rt_uint32_t S8;
    rt_uint32_t S9;
    rt_uint32_t S10;
    rt_uint32_t S11;
    rt_uint32_t S12;
    rt_uint32_t S13;
    rt_uint32_t S14;
    rt_uint32_t S15;
    rt_uint32_t FPSCR;
    rt_uint32_t NO_NAME;
#endif
};

代码中的“USE_FPU”是没有开启的,请问,如果我要用到浮点运算的话,要不要把“USE_FPU”开启?

查看更多

关注者
1
被浏览
386
我夏了夏天
我夏了夏天 认证专家 2020-11-26

如果想在宏内核版本的 RT-Thread 中进行浮点运算,就需要在移植时支持浮点,并且在编译和链接的时候开启浮点支持选项。

移植时处理浮点的问题,至少要处理两种情况:

  1. 只是发生中断,而不进行线程切换时,只需要在发生中断时,将所有的寄存器(包括浮点寄存器) push 到中断栈中,在中断退出时,从中断栈中恢复先前线程上下文的寄存器组。
  2. 如果是需要进行线程切换的情况,发生中断的时候,需要将所有的寄存器(包括浮点寄存器) push 到中断栈中,然后进行中断处理,最后在切换到新线程之前,将保存在中断栈中的当前线程的 context 拷贝到线程的栈的对应位置中。

这两者的区别是,第一种情况将中断栈里保存的上下文直接恢复到寄存器组里,第二种情况是将在中断栈里保存的上下文再次保存到当前线程栈中对应的位置上。

如果上述说明在移植时都没有处理的话,那么一旦出现线程切换,浮点寄存器组中的数据将被破坏,也就是说,你的硬件浮点运算结果将会无效。你给出的代码只是浮点支持的一部分,表示线程的栈帧中是否保存浮点相关寄存器,答案是必须的,只有对浮点寄存器进行很好的保存和恢复,才能保证计算任务结果正确。

如果认为该答案解决了你的问题,请选为最佳答案呦!

2 个回答
dgchinky
dgchinky 2020-12-29

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览