写在前面:
问题1:
1、如下图1。遇到的问题:if中的判断明明是正确的,但是单步调试的时候就是不执行if下面的代码。
调试分析:等于符号”==”左边的表达式没有加括号,又因为”==”比”&”的优先级高,所以程序先判断等于,再执行”&”,偏离了作者本来的想法,于是便出错了。
解决方法:给等于符号”==”左边的表达式加上括号()。
思维扩展:注意用其他运算符时加上括号,防止优先级问题带来不必要的困扰。不要吝啬小括号。
图1
问题2:
2、如下图2。遇到的问题:err的返回码总是错误,即使发送信号量的代码放到等待接收信号量的代码前面,返回的错误码也总不为OS_NO_ERR。
调试分析:查看信号量相关的宏定义发现value是uint16型的,而定义的信号量TCP_STATUS_OK却是uint32型的,会不会是所占空间大小不同判定信号量时诗句溢出了呢。
解决方法:将定义信号量宽度的代码#define OS_FLAGS_NBITS 16u改为#define OS_FLAGS_NBITS 32u。即将信号量的value值改为uint32型的,再去测试,程序顺利通过。
思维扩展:注意有关联的数据类型的匹配,防止数据溢出。
图2
问题3:
3、如下图3。遇到的问题:程序的意思是给数组time的第四个元素time[3]赋一个值,然后把数组time中的数据copy到另一个数组中,用的是一个CpyDataToArray()的一个函数,这个函数是先用strlen函数得到time的长度,然后依次把time中的元素copy过去。调试的时候发现copy后的值后面总会多一个退格符‘/b‘或者别的符号。
调试分析:strlen()是检测‘/0‘来确定数组长度的,time数组开了四个元素的空间,赋了四个值,结束符’/0‘没地方存放了 导致strlen()函数贩毒案数组长度的时候出错。
解决办法:给数组time多开辟一个字节的空间,即将time[4]改成time[5],问题解决。
思维拓展:在开辟数组存储数据的时候,记得多开辟几个字节的空间,内存溢出的错误很蹊跷的!!!
图3
问题4:
4.如图4所示。关于这个描述起来很混乱。我只想说:注意优先级的问题啊,括号的优先级大于成员选择“.”的优先级,血淋淋的教训啊!!!!!!
图4
问题5:
5.如图5所示。再碰见类似的问题的时候,就想想是不是忘了对调用的外部函数进行声明吧。。。
图5
问题6:
6.问题描述:最近遇到一个问题,同样的一段代码,在我自己用的板子上可以,烧录到别的板子上就不行,运行不了几行就直接进入的hard_fault异常。于是怀疑硬件,但是硬件运行别的程序就没有问题。于是乎,陷入了不知从何处下手的纠结。
问题分析:此次问题的排查归功于我的领导周庆民先生。如图6:因为自己用版本控制工具隔段时间就保存一次代码,通过各个版本的代码对比,将可能会产生错误的代码定位到下面几行。这是一个对串口2进行初始化的函数,函数中通过判断串口波特率标志位来给串口初始化为不同的波特率。由于串口波特率的标志位是在程序运行之处从存储器中拿的数据,而这个数据在参数初始化的时候又初始化成了零,所以在调用Rs485Init()初始化串口2的时候由于相应的标志位并不==2或者==3,所以程序并没有调用Uart2Init()去初始化串口2,于是在后面紧接着调用串口2收发数据的时候出现了问题,抛出了硬异常。
解决方法:将代码else{;}改为else{ Uart2Init(…);},这样无论串口初始化的标志位为多少,串口2总能得到初始化,不会在调用串口2收发数据的时候出现异常。
问题反思:写代码的时候考虑问题一定要周全,考虑当条件不满足是需要做怎样的处理。
图6
问题7
#include<stdio.h>
void main()
{
int cmp1 = -1;
unsigned int cmp2 = 100;
if(cmp1 > cmp2){
printf("true.\n");}
else{
printf("false.\n");}
}
程序输出“false”,因为C语言的隐式类型转换为int 转换为unsigned int,cmp = -1的在unsigned int类型下用补码表示,大于100.
解决方式:
比较的时候对cmp2强转为(int)
问题8
写一个用于U盘升级的代码,其中一个函数如下图。函数中数组readbuf的大小为1024字节,当把这个数组声明放在函数内部的时候,代码出现莫名其妙的问题,放在函数外部声明为全局变量的时候就正常
问题分析:在函数内部声明的变量是在栈中分配空间,查询代码工程的启动文件发现整个代码工程分配的栈空间共1024字节,函数中申请大于1024字节的变量造成了栈溢出。如下图:
解决方法:将较大的数组声明为全局变量,或者把启动文件中申请的栈空间改为较大的一个数值。
问题反思:尽可能的不要在函数局部变量中申请较大的空间。