* ОБНОВЛЕНИЕ *
Вот что я нашел. Всякий раз, когда у меня была эта функция, код не блокировался. Это на самом деле сделало бы функцию чтения 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;
}
Оптимизация вообще не включена, и код застревает при попытке прочитать байт из моего ITC-RTC, но как только я удаляю этот printf("index = %s\n", bTmpSms);
или использую этот вместо printf("index = 2\n");
, тогда все устраивает. Есть идеи?
bSmsIndex никогда не будет больше 30 на самом деле, и даже в этом случае блокировка происходит до того, как эта функция будет вызвана.