Frage

Ich bin sehr neu in C-Programmierung und ich arbeite an einer Firmware-Anwendung für meine MCU. Diese Methode funktioniert gut, als ich die KEIL-Compiler (Big Endian) verwenden, aber wenn ich an die SDCC-Compiler (Little Endian) geschaltet ist es nicht richtig funktioniert. Kann jemand bitte erklären, was ich falsch mache ???

Das Zielgerät ist ein Silicon Labs C8051F320, die auf der 8051-Architektur basieren.

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;
}

ADDED: Zuerst habe ich verändert nun die Motorschritte und Motorgeschwindigkeit auf unsigned ints. In meinem Debugger, aus irgendeinem Grunde gesetzt, wenn ich einen Haltepunkt an der if-Anweisung Linie am ersten Eingang dieser Funktion Motorschritte = 00, so t 0 auch zugewiesen bekommen sollte, aber der Debugger zeigt, dass t = 0,031497 (dezimal ). Wenn ich schalte den Debugger-Anzeige in Hex, t = 0x3d010300. Es ist wie t wird nie zugewiesen bekommen ...

War es hilfreich?

Lösung

Wenn Motorschritte = 49 dann

(50 - 49) / 50 = 0.02

weiter

(1 - 0.02) = 0.98

und

0.98 * 15 = 14.7

diesen Wert quadrieren würde eingestellt t als

t = 14.7 * 14.7 = 216.09

Schließlich ist die implizite Konvertierung von dem Schwimmer zurück zum unsigned char überläuft die Motorgeschwindigkeit variabel:

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

Die Summe von 100 + 216 = 316, natürlich, überläuft einen unsigned char und Sie mit 316-256 = 60 enden.

Dies ist wahrscheinlich unerwünschtes Verhalten unabhängig vom Compiler.

Andere Tipps

  

Es ist wie t nie wird immer   zugewiesen ...

Es gibt keinen Grund für den Compiler einen Wert von 0 bis t in der Erklärung

zuweisen
float t = 0;

, da es unmittelbar an Motorschritte in der nächsten Zeile zugewiesen wird. Meine Vermutung ist, das Optimierungsprogramm die Zuordnung zu Null in der Deklaration wird ignoriert und der Debugger einfach ist die Anzeige des nicht initialisierten Wert für den Speicher, in dem t auf dem Stapel befindet.

Sie können ganz loszuwerden der Formel betrachten wollen und eine Nachschlagtabelle für die Rampenwerte. Es sieht aus wie es nur 51 Werte, so dass die Tabelle relativ klein sein würde. Der Code zu sehen ein Wert wäre viel schneller als mit den Floating-Point-Bibliotheken auf einer 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;
}

Mindestens Sie Ihre ganze Zahl eher als der Schwimmer testen konnte die Floating-Point-Bibliotheken zu vermeiden, wenn Sie sie benötigen ...

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;
}

warum wechseln Sie von BE zu LE? Was ist Architektur des Zielgerätes? Und übrigens, was es ist?

Wie auch immer, zu Frage. Ich bin mir ziemlich sicher, dass Problem kommt, wenn die Konvertierung stattfindet. Versuchen Sie, verfolgen Sie den Code Zeile für Zeile mit Rechner und versuchen zu finden, wenn die Zahlen werden unerwartet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top