Вопрос

* ОБНОВИТЬ *

Вот что я нашел. Всякий раз, когда у меня была эта функция там, на самом деле не сделает блокировку кода. Это действительно медленно сделает функцию Read RTC I²C, но код все равно будет работать должным образом, но мне пришлось ждать очень долгое время, чтобы пройти время, когда я прочитал RTC.

Таким образом, есть прерывание тревоги для RTC, и это вызвало другие взаимодействия I²C внутри ISR, поэтому он выглядит так, как будто он пытался сделать два коммуникация I²C одновременно, поэтому замедляя процесс. Я удалил функции в ISR и сейчас работает. Я буду продолжать расследовать.


У меня есть эта проблема при программировании микроконтроллера STM32F103 с использованием IAR 5.40. У меня есть эта функция, что если я попытаюсь распечатать локальную переменную, она заставляет код замораживаться в другой момент, прежде чем он даже доберется к этой функции.

Что может вызвать это?

Это функция:

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

Я тоже попробовал, и это не вызывает замка, которую я испытывал:

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

Там нет оптимизации не включена, и код застрял при попытке прочитать байт из моего I²C RTC, но как только я удалю это printf("index = %s\n", bTmpSms); или используйте это вместо этого printf("index = 2\n"); Тогда все счастливо. Любые идеи?

BSMSINDEX никогда не будет более 30 на самом деле и даже тогда замок происходит Wayyyy, прежде чем эта функция будет вызвать.

Это было полезно?

Решение 4

Похоже, что если я не инициализирую переменную BTMPSM к чему-то, что возникает проблема.

Я также понял, что это не тот, который является проблемой. Это функция ITOA. Это заставило меня проверить, что даже не думал, что это проблема, когда я прокомментировал функцию ITOA, то весь код работал.

Поэтому я закончил делать это:

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

Это функция 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 - значение * BASE)];} пока (значение);

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

Другие советы

char bTmpSms[3] имеет место только для «99». Если ваш BSMSINDEX - 100 или выше, вы будете пытаться написать на память, которая не принадлежит вам.


Редактировать после обновления

У меня нет ссылки на itoa на моей местной машине, но я нашел этот ( http://www.cplusplus.com/Reeference/Clibrary/CStdlib/itoa/ ). Согласно этой ссылке, массив назначения Должен быть достаточно долго для любой возможной ценности. Отказ Проверьте свою документацию: ваш конкретный itoa может быть разным.

Или использовать sprintf, snprintf, или некоторая функция, описанная стандартом.

Некоторые идеи:

Если itoa() Не является должным образом Nul-завершением строки, а затем вызов на printf может привести к машине в поисках Nul навсегда.

У PMG очень хорошая точка.

Также рассмотрим, какой тип первого аргумента itoa() является. Если он подписан, и вы проходите в целое число без знака, то вы можете получить неожиданный знак минус в BTMPSM. Попробуйте использовать sprintf() вместо.

Изменение кода перемещает остальную часть вашего кода вокруг памяти. Я предполагаю, что какая-то другая часть кода, не указана здесь, разбивает какое-то случайное местоположение; В первом случае, что местоположение содержит что-то критическое, во втором случае это не так.

Это худшие виды проблем, чтобы отслеживать *. Удачи.

* Может быть, не худшее - это может быть хуже, если бы это было состояние гонки между несколькими нитями, которые проявляются только один раз в неделю. Все еще не мой любимый вид ошибки.

Какова ценность bSmsIndex Вы пытаетесь распечатать?

Если это больше 99, то вы превышаете bTmpSms множество.

Если это не поможет, то используйте довольно хороший отладчик IAR - я упал в окно сборки в точке, где printf() называется и один шаг, пока вещи не вошли в сорняки. Это, вероятно, сделает ясно, в чем проблема.

Или как быстрое устранение неполадок в Quick-N-N-г-то, попробуйте разместить массив на что-то большое (может быть, 8) и посмотрите, что происходит.

Какова ценность BSMSINDEX?

Если более 99 это будет три цифры при преобразовании в строку. Когда ноль завершится, это будет четыре символа, но вы выделили только три до BTMPSM, поэтому нуль может быть перезаписан, и Printf будет пытаться распечатать все, что после BTMPSM до следующего нуля. Это может получить доступ к чему-либо, правда.

Попробуйте разобрать эту область с помощью индекса = 2 против индекса = %s.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top