在調試STM32時,單步打斷點運作時,沒有問題,但是全速運作時,偶爾會跳過錯誤,偶爾也會跳轉hardfault;
問題實在難找。。。
最後定位在發送資料的緩存上, 發現發送緩存部分除了應該有的資料之外, 還有好多不 為0的值;
也就是說,在棧上申請的記憶體,沒有經過初始化,就使用strcat來追加字元串了;
詳細查了一下strcat的用法,發現strcat需要先找到dest的結尾,才能夠繼續追加;
如果申請的記憶體沒有初始化, 可能就會導緻追加的字元串的位置不正确;進而可能導緻了記憶體溢出(覆寫);
是以 程式就崩了。。。
貼上glibc的strcat的源碼
char *
strcat (dest, src)
char *dest;
const char *src;
{
char *s1 = dest;
const char *s2 = src;
reg_char c;
do
c = *s1++;
while (c != '\0');
s1 -= 2;
do
{
c = *s2++;
*++s1 = c;
}
while (c != '\0');
return dest;
}