Pregunta

* ACTUALIZACIÓN *

Esto es lo que encontré. Cada vez que tenía esa función en la que no existe en realidad lo haría bloquear el código de arriba. Sería realmente hacer la función de RTC I²C lectura muy lento para ejecutar, pero el código todavía funcionar correctamente, pero tenía que esperar un tiempo muy largo para conseguir más allá cada vez que leo el RTC.

Así que hay una interrupción de alarma para el RTC y esto era desencadenar otras interacciones I²C en el interior del ISR, por lo que parece que estaba tratando de hacer dos comunicaciones I²C, al mismo tiempo, por lo tanto, ralentizar el proceso. Quité las funciones en el ISR y está funcionando ahora. Voy a seguir investigando.


Estoy teniendo este problema al programar un microcontrolador STM32F103 usando IAR 5.40. Tengo esta función que si trato de printf una variable local que hace que el código para congelar a punto de otra manera antes de que incluso llega a esa función en cuestión.

¿Qué podría estar causando esto?

Esta es la función:

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

He intentado esto también y esto no causa el bloqueo he experimentado:

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

No hay optimización habilitada en absoluto y el código se atasca al intentar leer un byte de mi I²C RTC, pero tan pronto como se quita esta printf("index = %s\n", bTmpSms); o utilizar éste en lugar printf("index = 2\n"); entonces todo es feliz. Algunas ideas?

El bSmsIndex nunca será en realidad más de un 30 e incluso entonces el bloqueo hasta que ocurre wayyyy antes de que esta función se llama.

¿Fue útil?

Solución 4

Parece que si no inicializar las variables bTmpSms a algo ocurre el problema.

También se dio cuenta de que no es el printf que es el problema. Es la función itoa. Me tiene que comprobar que a pesar de que no creía que ese era el problema, cuando me comentó la itoa funcionan a continuación, todo el código funcionó.

Así que terminé haciendo esto:

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

Este es el itoa funcionan llegué:

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

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

Otros consejos

char bTmpSms[3] sólo se dispone de espacio para "99". Si su bSmsIndex es 100 o mayor, se le tratando de escribir a la memoria que no le pertenece.


Edición después de la actualización

No tengo una referencia a itoa en mi máquina local, pero he encontrado este ( http://www.cplusplus.com/reference/clibrary/cstdlib/itoa/ ). De acuerdo con esa referencia, la matriz de destino debe ser suficiente para que cualquier posible VALOR . Compruebe la documentación:. itoa su específica podría ser diferente

O uso sprintf, snprintf, o alguna función descrita en la norma.

Algunas ideas:

Si no es propiamente itoa() NUL de terminación de la cadena, entonces la llamada a printf puede dar lugar a la máquina en busca de la NUL para siempre.

PMG tiene un muy buen punto.

Además, considerar qué tipo que el primer argumento es itoa(). Si está firmado y que está pasando en un entero sin signo, entonces usted podría estar recibiendo un signo menos inesperado en bTmpSms. Trate de usar sprintf() lugar.

El cambio de código se está moviendo el resto de su código por todas partes en la memoria. Mi conjetura es que alguna otra parte del código, no está aquí, está golpeando algún lugar al azar; en el primer caso que la ubicación contiene algo crítico, en el segundo caso no es así.

Estos son los peores tipos de problemas para localizar a *. Buena suerte.

* Quizás no es el peor de los casos - podría ser peor si se tratara de una condición de carrera entre varios subprocesos que sólo se manifestaba una vez a la semana. Todavía no es mi tipo favorito de error.

¿Cuál es el valor de bSmsIndex que está tratando de imprimir?

Si es mayor de 99, entonces estamos invadiendo la matriz bTmpSms.

Si eso no ayuda, a continuación, utilizar depurador bastante bueno de IAR - Me deje caer en la ventana del conjunto en el punto donde printf() se está llamando y solo paso hasta que las cosas fueron a las malas hierbas. Eso probablemente va a hacer claro cuál es el problema.

O como solucionar problemas sucia rápida-n-, intente dimensionar la matriz a algo grande (quizás 8) y ver qué pasa.

¿Cuál es el valor de bSmsIndex?

Si hay más de 99 que será de tres dígitos cuando se convierte en una cadena. Cuando terminado en cero, será cuatro personajes, sino que ha asignado a sólo tres bTmpSms por lo que la nula puede obtener sobrescribe y el printf tratará de imprimir lo es después de bTmpSms hasta la próxima nula. Eso podría acceder a cualquier cosa, de verdad.

Trate de desmontar esta área con index = índice de 2 vs = %s.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top