Frage

* UPDATE *

Hier ist, was ich gefunden habe. Jedes Mal, wenn ich diese Funktion dort hätte es eigentlich nicht den Code machen perren. Es wäre tatsächlich machen die RTC I²C-Funktion lesen sehr langsam auszuführen, aber der Code würde immer noch richtig laufen, aber ich hatte eine wirklich lange Zeit zu warten, bekommen ich Vergangenheit jedes Mal die RTC lesen.

Es gibt also ein Alarm-Interrupt für die RTC und dies war Auslösung andere I²C-Wechselwirkungen innerhalb des ISR, so dass es aussieht wie es versucht, die gleichzeitig zwei I²C-Kommunikation zu tun, damit den Prozess zu verlangsamen. Ich entfernte die Funktionen in der ISR und es funktioniert jetzt. Ich werde weiter zu untersuchen.


Ich habe dieses Problem, wenn eine STM32F103 Mikrocontroller-Programmierung 5.40 mit IAR. Ich habe diese Funktion, dass, wenn ich versuche, eine lokale Variable printf den Code verursacht an anderer Stelle Weise einzufrieren, bevor es sogar für diese Funktion in Frage kommt.

Was möglicherweise die Ursache sein könnte?

Dies ist die Funktion:

u8 GSM_Telit_ReadSms(u8 bSmsIndex)
{
  char bTmpSms[3] = {0};

  itoa(bSmsIndex, bTmpSms, 10); // Converts the smsindex into a string

  printf("index = %s\n", bTmpSms); // This printf caused the code to get stuck in the RTC // byte read function!

  GSM_Telit_RequestModem("AT+CMGR=""1", 10, "CMGR", 5, 0);
  return 1;
}

Ich habe versucht, das so gut und dies nicht dazu führt, das Schloss erleben ich:

u8 GSM_Telit_ReadSms(u8 bSmsIndex)
{
  char bTmpSms[3] = {0};

  itoa(bSmsIndex, bTmpSms, 10);
  printf("index = 2\n");


  GSM_Telit_RequestModem("AT+CMGR=""1", 10, "CMGR", 5, 0);
  return 1;
}

Es ist aktiviert keine Optimierung überhaupt und der Code stecken bleibt, wenn ein Byte aus meinem I²C RTC zu lesen versucht, aber sobald ich diesen printf("index = %s\n", bTmpSms); entfernen oder diese stattdessen printf("index = 2\n"); dann ist alles glücklich. Irgendwelche Ideen?

Die bSmsIndex wird nie mehr als 30 tatsächlich und selbst dann die Sperr geschieht wayyyy bevor diese Funktion aufgerufen wird.

War es hilfreich?

Lösung 4

Es scheint, dass, wenn ich nicht die Variable bTmpSms etwas initialisieren das Problem auftritt.

Ich erkannte auch, dass es nicht die printf ist, dass das Problem ist. Es ist die itoa Funktion. Es hat mich, dass auch zu überprüfen, obwohl ich nicht glaube, das war das Problem, als ich bemerkte die itoa funktionieren dann der gesamte Code gearbeitet.

Also habe ich am Ende tun dies:

u8 GSM_Telit_ReadSms(u8 bSmsIndex)
{
  char bTmpSms[4] = "aaa";    // I still need to find out why this is !!!

  itoa(bSmsIndex, bTmpSms, 10); // Converts the smsindex into a string

  printf("index = %s\n", bTmpSms); // This printf caused the code to get stuck in the RTC // byte read function!

  GSM_Telit_RequestModem("AT+CMGR=""1", 10, "CMGR", 5, 0);
  return 1;
}

Das ist das ist itoa Funktion Ich habe:

char itoa(int value, char* result, int base)
{
  // Check that the base if valid
  if (base < 2 || base > 36) {
      *result = '\0';
      return 0;
  }

  char* ptr = result, *ptr1 = result, tmp_char;
  int tmp_value;

  do
  {
    tmp_value = value;
    value /= base;
    *ptr++ = "zyxwvutsr

qponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz“[35 + (tmp_value - Wert * base)];       } While (Wert);

  // Apply negative sign
  if (tmp_value < 0)
      *ptr++ = '-';
  *ptr-- = '\0';
  while(ptr1 < ptr)
  {
    tmp_char = *ptr;
    *ptr--= *ptr1;
    *ptr1++ = tmp_char;
  }
  return 1;
}

Andere Tipps

char bTmpSms[3] hat nur Platz für "99". Wenn Ihr bSmsIndex 100 oder größer ist, werden Sie zu schreiben in den Speicher versuchen, die nicht gehören Ihnen der Fall ist.


Bearbeiten nach dem Update

Ich habe keinen Hinweis auf itoa auf meinem lokalen Rechner habe, aber ich fand diese ein ( http://www.cplusplus.com/reference/clibrary/cstdlib/itoa/ ). Nach dieser Referenz kann der Ziel-Array muss lang genug für jeden möglichen Wert . Überprüfen Sie die Dokumentation. Ihre spezifischen itoa könnte anders sein

oder benutzen sprintf, snprintf oder eine Funktion von der Norm beschriebenen.

Einige Ideen:

Wenn itoa() nicht richtig ist, die String-NUL beendet wird, dann wird der Anruf an printf in der Maschine führen kann immer für die NUL suchen.

PMG hat einen sehr guten Punkt.

Bedenken Sie auch, was das erste Argument eingeben, um itoa() ist. Wenn es unterzeichnet ist und du bist in einem unsigned integer vorbei, dann können Sie sein ein unerwartetes Minuszeichen in bTmpSms bekommen. Versuchen Sie es mit sprintf() statt.

Die Änderung des Code bewegt den Rest des Codes um im Speicher. Meine Vermutung ist, dass ein anderer Teil des Codes, die hier nicht aufgeführt, ist eine zufällige Position Bashing; im ersten Fall, dass Lage etwas kritisch, im zweiten Fall enthält es nicht.

Dies sind die schlimmsten Arten von Problemen * aufzuspüren. Viel Glück.

* Vielleicht nicht das Schlimmste - es könnte schlimmer sein, wenn es eine Race-Bedingung zwischen mehreren Threads ist, die sich nur einmal in der Woche zum Ausdruck. Immer noch nicht meine bevorzugte Art von Fehlern.

Was ist der Wert von bSmsIndex Sie versuchen zu drucken?

Wenn es mehr als 99 dann bist du das bTmpSms Array Überholkupplung.

Wenn das nicht hilft, dann ziemlich gut Debugger IAR - I in das Baugruppenfenster an der Stelle fallen würde, wo printf() genannt wird und einzelner Schritt, bis die Dinge in das Unkraut gingen. Das wird wohl deutlich machen, was das Problem ist.

oder als Schnell n-dirty zu beheben, versuchen, das Array zu etwas groß (vielleicht 8) Dimensionierung und sehen, was passiert.

Was ist der Wert von bSmsIndex?

Wenn mehr als 99 es drei Stellen sein wird, wenn in einen String umgewandelt. Wenn Null beendet, wird es vier Zeichen lang sein, aber Sie haben nur drei bis bTmpSms zugeordnet, so kann die Null erhalten überschrieben und die printf werden versuchen, was zu drucken, nachdem bTmpSms bis zum nächsten null ist. Das könnte alles zugreifen, wirklich.

Versuchen Sie, diesen Bereich mit dem Index zu zerlegen = 2 vs. index = %s.

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