发 帖  
原厂入驻New
[问答] 请问为何TM4C123 launchpad 一运行浮点计算就死机?
2020-8-26 15:11:40  38 TM4C123
分享
平台:TM4C123 launchpad
编译工具: IAR7.1
在starpup .c 启动文件里程序段如下
static void App_Reset_ISR (void)
[

//
// Enable the floating-point unit. This must be done here to handle the
// case where main() uses floating-point and the function prologue saves
// floating-point registers (which will fault IF floating-point is not
// enabLED). Any configuration of the floating-point unit using DriverLib
// APIs must be done here prior to the floating-point unit being enabled.
//
// Note that this does not use DriverLib since it might not be included in
// this project.
//
HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) &
~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) |
NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL);

__iar_program_start();
]

在主程序段里
void main(void)
[
  
    FPUEnable();
    FPULazyStackingEnable();

   SysCtlclockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ |
                                SYSCTL_OSC_MAIN);

   ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
  add_float();
  
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);

GPIOPinConfigure(GPIO_PA0_U0RX);
GPIOPinConfigure(GPIO_PA1_U0TX);
GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC);
UARTStdioConfig(0, 115200, 16000000);

UARTprintf("test ");
]
void add_float(void)
[
   
  float a = 4.47;
    float b = 3.21;
float c;
c = a + b;
]
程序运行结果如下:
1. 如果把浮点运算函数 add_float() 注释掉 程序可以顺利运行打印出 test
2. 如果把浮点运算函数 add_float() 也运行, 程序就死在这个函数里 无法运行下去

请求达人指点一下, TM4C123不是支持浮点运算的吗?难道是编译器或者还有哪里没设置对?
不胜感激!
0
2020-8-26 15:11:40   评论 分享淘帖
3 个讨论
试试这样的配置顺序
    ROM_FPULazyStackingEnable();    ROM_FPUEnable();给你个例程看看
#include <stdint.h>#include <stdbool.h>#include <math.h>#include "inc/hw_memmap.h"#include "inc/hw_types.h"#include "driverlib/fpu.h"#include "driverlib/sysctl.h"#include "driverlib/rom.h"#ifndef M_PI#define M_PI                    3.14159265358979323846#endif#define SERIES_LENGTH 100float gSeriesData[SERIES_LENGTH];int32_t i32DataCount = 0;int main(void)[    float fRadians;    ROM_FPULazyStackingEnable();    ROM_FPUEnable();    ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ | SYSCTL_OSC_MAIN);    fRadians = ((2 * M_PI) / SERIES_LENGTH);    while(i32DataCount < SERIES_LENGTH)    [            gSeriesData[i32DataCount] = sinf(fRadians * i32DataCount);            i32DataCount++;    ]    while(1)    [    ]]
2020-8-26 15:24:02 评论

举报

ljmlvmd 发表于 2020-8-26 15:24
试试这样的配置顺序
    ROM_FPULazyStackingEnable();    ROM_FPUEnable();给你个例程看看
#include &amp;lt;stdint.h&amp;gt;#include &amp;lt;stdbool.h&amp;gt;#include &amp;lt;math.h&amp;gt;#include &amp;quot;inc/hw_memmap.h&amp;quot;#include &amp;quot;inc/hw_types.h&amp;quot;#include &amp;quot;driverlib/fpu.h&amp;quot;#include &amp;quot;driverlib/sysctl.h&amp;quot;#include &amp;quot;driverlib/rom.h&amp;quot;#ifndef M_PI#define M_PI   ...

很感谢你的回复。
1) 我用的iar编译器 我发现如果要使用浮点的话必须 在IAR编译设置里 FPU 选项 设置为 NONE 才行,如果设置为默认的 vfpv4的话就不能进行浮点计算
2) 我发现我的浮点程序如果是单程序的话照以上设置可以正常运行,但是如果和UC/OS2一起编译的话,就无法正常计算浮点,我估计可能是UC/OS2
       不支持TM4C123的浮点寄存器。
如果你有在OS系统下使用浮点的经验麻烦提供一下,非常感谢!
2020-8-26 15:30:07 评论

举报

wenminglang 发表于 2020-8-26 15:30
很感谢你的回复。
1) 我用的iar编译器 我发现如果要使用浮点的话必须 在IAR编译设置里 FPU 选项 设置为 NONE 才行,如果设置为默认的 vfpv4的话就不能进行浮点计算
2) 我发现我的浮点程序如果是单程序的话照以上设置可以正常运行,但是如果和UC/OS2一起编译的话,就无法正常计算浮点,我估计可能是UC/OS2

你好。。设置为none时应该是编译器没有 用FPU。。RTthred支持FPU .以前有听说过UCOS以前不支持,,后来好像更新后可以。你可以尝试换新版本的ucos
2020-8-26 15:39:18 评论

举报

只有小组成员才能发言,加入小组>>

1428个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /8 下一条

快速回复 返回顶部 返回列表