0

我是 C 编程的新手,我正在为我的 MCU 开发固件应用程序。当我使用 KEIL 编译器(Big Endian)时,此方法工作正常,但当我切换到 SDCC 编译器(Little Endian)时,它无法正常工作。有人可以解释我做错了什么吗???

目标设备是基于 8051 架构的 Silicon Labs C8051F320。

unsigned **int** MotorSteps  = 0;     //"Global" variables
unsigned **int** MotorSpeed  = 0;
bit RampUp()
{
    float t = 0;
    t = MotorSteps;
    if ( t < 51 )
    {
        t = (1-((50 - t)/50))*15;   
        t = (t * t);        
        MotorSpeed = 100 + t;           
        return 0;
    }
    else return 1;
}

添加:首先,我现在将 MotorSteps 和 MotorSpeed 更改为无符号整数。 在我的调试器中,由于某种原因,如果我在 if 语句行设置断点,在此函数 MotorSteps = 00 的第一个入口处,因此 t 也应该分配为 0,但调试器显示 t=0.031497(十进制)。如果我将调试器切换为以十六进制显示,t = 0x3d010300。这就像 t 永远不会被分配......

4

3 回答 3

3

如果 MotorSteps = 49 那么

(50 - 49) / 50 = 0.02

下一个

(1 - 0.02) = 0.98

0.98 * 15 = 14.7

将此值平方将设置 t 为

t = 14.7 * 14.7 = 216.09

最后,从浮点数隐式转换回无符号字符会溢出 MotorSpeed 变量:

MotorSpeed = 100 + 216.09...// Implicitly converts the float t to an unsigned char of 216

当然,100 + 216 = 316 的总和会溢出一个无符号字符,最终得到 316-256 = 60。

无论编译器如何,这都可能是不受欢迎的行为。

于 2010-03-03T20:06:45.603 回答
2

这就像 t 永远不会被分配......

编译器没有理由在声明中为 t 赋值 0

float t = 0;

因为它立即被分配给下一行的 MotorSteps。我的猜测是优化器忽略了声明中对零的赋值,而调试器只是显示了 t 位于堆栈上的内存的未初始化值。

您可能要考虑完全摆脱公式并使用查找表来查找斜坡值。看起来只有 51 个值,所以表会相对较小。查找值的代码比在 8051 上使用浮点库要快得多

#define NUM_RAMP_STEPS 51
unsigned char MotorSteps = 0;     //"Global" variables
unsigned char MotorSpeed = 0;
const unsigned char RampTable[NUM_RAMP_STEPS] = {...appropriate values...};
bit RampUp()
{
    if ( MotorSteps < NUM_RAMP_STEPS )
    {
        MotorSpeed = RampTable[MotorSteps];           
        return 0;
    }
    else return 1;
}

至少你可以测试你的整数而不是浮点数以避免浮点库,除非你需要它们......

unsigned **int** MotorSteps  = 0;     //"Global" variables
unsigned **int** MotorSpeed  = 0;
bit RampUp()
{
    if ( MotorSteps < 51 )
    {
        float t = MotorSteps;
        t = (1-((50 - t)/50))*15;   
        t = (t * t);        
        MotorSpeed = 100 + t;           
        return 0;
    }
    else return 1;
}
于 2010-03-03T22:42:37.770 回答
0

你为什么从BE转到LE?目标设备的架构是什么?顺便说一句,它是什么?

无论如何,要质疑。我很确定发生转换时会出现问题。尝试使用计算器逐行跟踪您的代码,并尝试找出数字何时变得意外。

于 2010-03-03T19:51:39.940 回答