在调试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;
/* Find the end of the string. */
do
c = *s1++;
while (c != '\0');
/* Make S1 point before the next character, so we can increment
it while memory is read (wins on pipelined cpus). */
s1 -= 2;
do
{
c = *s2++;
*++s1 = c;
}
while (c != '\0');
return dest;
}