Question

* MISE À JOUR *

Voici ce que je trouve. Chaque fois que j'avais cette fonction là-bas il ne serait pas réellement verrouiller le code vers le haut. Il serait en fait faire la lecture RTC fonction I²C très lent à exécuter, mais le code serait encore courir correctement, mais je devais attendre très longtemps pour dépasser chaque fois que je lis le RTC.

Donc, il y a une interruption d'alarme pour le CCF et cela a été le déclenchement d'autres interactions I²C dans le ISR, il semble comme si elle essayait de faire deux communications I²C en même temps, ce qui ralentirait le processus. J'ai supprimé les fonctions dans la région désignée et il travaille maintenant. Je vais continuer à enquêter.


J'ai ce problème lors de la programmation d'un microcontrôleur STM32F103 utilisant IAR 5,40. J'ai cette fonction que si je tente de printf une variable locale, il provoque le code de geler à une autre façon point avant qu'il ne soit même à cette fonction en question.

Que pourrait-il être la cause?

Ceci est la fonction:

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

J'ai essayé aussi bien et cela ne cause le verrou que j'ai vécu:

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

Il n'y a pas d'optimisation a permis que ce soit et le code est bloqué lorsque vous essayez de lire un octet de mon I²C RTC, mais dès que je retire ce printf("index = %s\n", bTmpSms); ou utiliser celui-ci printf("index = 2\n"); plutôt, tout est heureux. Toutes les idées?

Le bSmsIndex ne sera jamais plus de 30 fait et même alors le verrou jusqu'à se wayyyy avant que cette fonction est appelée.

Était-ce utile?

La solution 4

Il semble que si je n'initialise pas la variable bTmpSms à quelque chose que le problème se produit.

J'ai aussi rendu compte que ce n'est pas printf qui est le problème. Il est la fonction itoa. Cela m'a fait vérifier que même si je ne pensais pas que le problème était, quand je commentais la fonction itoa alors l'ensemble du code de travail.

Je fini par faire ceci:

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

Ceci est la fonction que je suis itoa:

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 - * valeur de base)];       } While (valeur);

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

Autres conseils

char bTmpSms[3] ne dispose que d'un espace pour "99". Si votre bSmsIndex est 100 ou plus, vous allez essayer d'écrire à la mémoire qui ne vous appartient pas.


Modifier après la mise à jour

Je n'ai pas une référence à itoa sur ma machine locale, mais je trouve celui-ci ( http://www.cplusplus.com/reference/clibrary/cstdlib/itoa/ ). Selon cette référence, le tableau de destination DOIT ÊTRE SUFFISAMMENT POUR TOUTE LA VALEUR POSSIBLE . Consultez la documentation:. Votre itoa spécifique peut être différent

Ou utilisez sprintf, snprintf, ou une fonction décrite par la norme.

Quelques idées:

Si itoa() est pas correctement NUL de terminaison de la chaîne, l'appel à printf peut entraîner la machine à la recherche du NUL pour toujours.

PMG a un très bon point.

, Voir également quel type le premier argument de itoa() est. Si elle est signée et vous passez dans un entier non signé, alors vous pouvez être obtenir un signe moins inattendu bTmpSms. Essayez d'utiliser à la place sprintf().

Le changement de code déplace le reste de votre code en mémoire autour. Je pense que d'une autre partie du code, ne figure pas ici, est dénigrement un emplacement aléatoire; dans le premier cas que l'emplacement contient quelque chose de critique, dans le second cas, il ne fonctionne pas.

Ce sont les pires sortes de problèmes pour traquer *. Bonne chance.

* Peut-être pas le pire - ça pourrait être pire si elle était une condition de course entre plusieurs threads qui se manifeste seulement une fois par semaine. Pas encore mon genre de bug favori.

Quelle est la valeur de bSmsIndex que vous essayez d'imprimer?

Si elle est supérieure à 99, alors vous êtes le tableau de dépassement bTmpSms.

Si cela ne veut pas de l'aide, puis utiliser assez bon débogueur IAR - je laisse tomber dans la fenêtre de montage au point où printf() est appelé et seule étape jusqu'à ce que les choses allaient dans les mauvaises herbes. Cela fera sans doute clair quel est le problème.

Ou comme Dépanner rapide n-sale, essayez dimensionner le tableau à quelque chose de grand (peut-être 8) et de voir ce qui se passe.

Quelle est la valeur de bSmsIndex?

Si plus de 99, il sera trois chiffres lorsqu'il est converti en une chaîne. Lorsque le zéro terminé, il sera quatre personnages, mais vous avez alloué seulement trois à bTmpSms de sorte que le nul peut obtenir écrasée et le printf essaiera d'imprimer tout ce qui est après bTmpSms jusqu'à la prochaine nulle. Cela pourrait accéder à quoi que ce soit, vraiment.

Essayez de démonter cette zone avec l'index = 2 par rapport à l'indice = %s.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top