* アップデート *
これが私が見つけたものです。その関数がそこにあるときはいつでも、実際にコードがロックされることはありません。実際には、RTC I²C 関数の読み取りが非常に遅くなりますが、コードは適切に実行されますが、RTC を読み取るたびに、通過するまで非常に長い時間待たなければなりませんでした。
そのため、RTC のアラーム割り込みがあり、これが ISR 内の他の I²C 相互作用をトリガーしていたため、2 つの I²C 通信を同時に実行しようとしていたようで、プロセスが遅くなりました。ISR の機能を削除しましたが、現在は機能しています。引き続き調査していきます。
IAR 5.40 を使用して STM32F103 マイクロコントローラをプログラミングしているときに、この問題が発生しています。ローカル変数を printf しようとすると、問題の関数に到達する前に別の時点でコードがフリーズするというこの関数があります。
これを引き起こしている可能性があるのは何ですか?
これは機能です:
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 を超えることはありません。その場合でも、この関数が呼び出される前にロックが発生します。