mikrocontroller.net

Forum: Compiler & IDEs Probleme mit Stringlänge


Autor: Ingo Less (corrtexx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe folgende Funktion:
void EA_DOGM163_String( const char *Data )
{
    while( *Data != '\0' ){
      EA_DOGM163_Write_Data ( *Data++ , DATA );
    }
}
Folgendes geht und geht nicht, ich lande im Reset_Handler meines 
STM32F030 in Coocox wenn es nicht geht:
EA_DOGM163_String( "1" ); // geht
EA_DOGM163_String( "12" ); // geht nicht
EA_DOGM163_String( "123" ); // geht nicht
EA_DOGM163_String( "1234" ); // geht nicht
EA_DOGM163_String( "12345" ); // geht
...6 // geht nicht
...7 // geht nicht
...8 // geht nicht
...9 // geht

Es scheint irgendwas mit der Pointergröße zu tun zu haben? kann mir 
jemand helfen, komme absolut nicht weiter...

Viele Grüße,
Ingo

Autor: Ingo Less (corrtexx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier noch:
void EA_DOGM163_Write_Data ( uint8_t Data, int RS )
{
  if ( RS ) {
     GPIOB->ODR |= GPIO_Pin_0;
  }else {
    GPIOB->ODR &= ~GPIO_Pin_0;
  }
  /* ChipSelect low */
  GPIOA->ODR &= ~ GPIO_Pin_6;
  SPI_SendData8( SPI1 , Data );
  MyDelayUS( LCD_WRITEDATA_US );
  /* ChipSelect high */
  GPIOA->ODR |= GPIO_Pin_6;
}

Autor: Walter Tarpan (nicolas)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ingo L. schrieb:
> SPI_SendData8( SPI1 , Data );

Das prüft selbstständig, ob der vorhergehende Transfer abgeschlossen 
ist?

Autor: Mitlesa (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Walter T. schrieb:
> Das prüft selbstständig, ob der vorhergehende Transfer abgeschlossen
> ist?

Das wird nicht reichen.

Die selbstgebaute MyDelayUS ist ein protentieller Fehlerbringer.

Ausserdem wird bei zwei aufeinanderfolgenden Zeichen der
Chipselect so schnell wieder betätigt dass ein Display
eventuell noch zu beschäftigt ist.

CS:   ~~~~~~\__________/~\__________/~~~~
(hier ------------------^----------------

Autor: Ingo Less (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich die Funktion ...WriteData händisch aufrufen und mit einem 
Zeichen versehe und das ganze n mal, gibts keine Probleme. Das MyDelayUS 
hatte ich garnicht auf dem Schirm, die dürfte aber tendenziell viel zu 
lange dauern, da sie 1:1 von einem 168MHz F4 übernommen wurde und noch 
nicht angepasst wurde (schäm). Wenn das natürlich nicht passt oder es 
sogar weg optimiert wird, wäre ein ResetHandler nur logisch. An der 
Funktion an sich kann es nicht liegen? Ich kann es leider erst morgen 
früh wieder an der Hardware testen...

Autor: Ingo Less (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was jedoch etwas unlogisch ist, ist das 1,5,9 usw. Zeichen im String 
funktionieren. Das spricht gegen die These eines zu knappen Delays oder?

Autor: Ingo Less (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Keiner weitere Ideen?

Autor: eagle user (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1, 5, 9 spricht für ein Alignment-Problem. Der M0 ist dabei 
anspruchsvoller als der M4.

Autor: Ingo Less (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kannst du das näher ausführen?

Autor: eagle user (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Cortex-M haben 32 Bit breite Register. Wenn man eine möglichst 
einfache CPU bauen will, kann die nur 32 Bit am Stück verarbeiten und 
speichern. Um ein einzelnes Zeichen (char, uint8_t, 8 Bit) aus dem 
Speicher in ein Register zu laden, sind zusätzliche Befehle und 
Multiplexer nötig. Die hat der M0 zwar auch, aber Flash, RAM und 
Peripherie-Register müssen das auch unterstützen.

Der Compiler muss für jede Zeile C wissen, ob da ein 32-Bit Befehl 
funktioniert oder ob er vier 8-Bit Befehle einbauen muss. Optimal wäre 
natürlich ein einzelner Befehl, aber das geht eben nicht immer mit jeder 
CPU.

Soviel zur Theorie. Praktisch habe ich nur eine doofe Idee, was bei dir 
faul sein könnte: du übersetzt das Programm für einen F4 (=M4) statt für 
deinen F030 (=M0).

Autor: Ingo Less (corrtexx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe einfach mal die 4.8 Toolchain benutzt und dann ging es. 
Komischerweise, als ich dann wieder auf die 6.2017.q1 zurück bin, ging 
es dann auch dort. Jetzt bin ich zwar glücklich das es geht, aber es ist 
unbefriedigend nicht zu wissen warum.

Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ingo L. schrieb:
> EA_DOGM163_Write_Data ( *Data++ , DATA );

Wenn EA_DOGM163_Write_Data() ein Makro ist, welches den ersten Parameter 
mehrfach verwendet, geht das in die Hose. Dann wird nämlich der 
Inkrement, den Du da eingebaut hast, mehrfach ausgeführt. Das hätte dann 
zur Folge, dass gar nichts oder nur ein Teil des Strings ausgegeben 
wird.

Bevor man da als Programmierer in den include-Dateien stundenlang 
rumsucht, ob das denn nun ein Macro oder eine richtige Funktion ist, 
kann ich Dir nur den Tipp geben: Lass das mit dem Increment von 
Makro-/Funktionsparametern. Vor 30 Jahren war das vielleicht noch ein 
Hinweis an den Compiler, dass er hier irgendein Register optimieren 
kann, heutzutage ist das komplett irrelevant.

Schreibe also:
  EA_DOGM163_Write_Data ( *Data , DATA );
  Data++;

und Du lebst wesentlich stressfreier.

Autor: Dirk B. (dirkb2)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Frank M. schrieb:
> Wenn EA_DOGM163_Write_Data() ein Makro ist,

Im zweiten Post steht doch die gesamte Funktion.

Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dirk B. schrieb:
> Im zweiten Post steht doch die gesamte Funktion.

Upps, das habe ich tatsächlich übersehen. :-)

Autor: Ingo Less (corrtexx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also den konkreten Fehler konnte ich nicht finden. Wie gesagt: einmal 
mit einer anderen Toolchain "gebuildet" und es lief und dann auch mit 
der, die vorher nutzte. Ich bin jetzt aber insgesamt auf EmBitz 
umgestiegen, nur Theater mit Atollic gehabt:
Beitrag "Re: SPL und Atollic"

Coocox ist auch cool, aber leider wird es nicht mehr gepflegt und neue 
Controller nicht eingebaut.

Autor: Markus F. (mfro)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist einigermassen unwahrscheinlich; meine Compiler machen mit den 
gleichen Quellen immer dasselbe, egal wie oft ich es probiere (auch wenn 
ich bei manchen Problemen gern was anderes glauben möchte).

Du hast (wahrscheinlich unbeabsichtigt) was anderes verändert. Aber das 
wird man jetzt wohl nicht mehr nachvollziehen können.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.