OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6459|回复: 4

记录一下曾经遇到的BUG......

[复制链接]

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8204
金钱
8204
注册时间
2020-5-11
在线时间
3697 小时
发表于 2021-3-6 10:37:51 | 显示全部楼层 |阅读模式
本帖最后由 LcwSwust 于 2021-3-6 10:37 编辑

曾经遇到很多BUG,有些已想不起了,此处记录一下,想起了再补充。
1.char buf[10]=0;
  应改为
  char buf[10]={0};
2.循环执行一块语句:
while(n--);
{...}
应去掉分号
3.if(a=b)
应改为
if(a==b)
4.两个不同类型的变量作比较时,可能会出错。
5.a=b<<8+c;
  应改为
  a=(b<<8)+c;
  注意运算符的优先级,搞不清楚就多加括号
6.switch语句里case 要有 break ;
7.char i;buf[i++]=d;if(i>10)i=0;
  应对i赋初值,否则buf[i++]可能导致数组越界,
  数组越界后果很严重。
8.函数中局部变量定义很大的数组,可能导致堆栈溢出。
9.除法运算要注意避免除数为0,否则死机。
10.循环n次: do{...}while(n--);
  应改为 do{...}while(--n); (注意n不能为0)
  或 while(n--){...}
  或 for(i=0;i<n;i++){...}
  注意循环次数。
11.LCD操作函数有等待忙标志,主循环与中断同时调用LCD操作,同于中断改变了引脚,导致主循环中死循环等待忙标志,
  应避免同时调用。
12.同上一条类似,中断与主循环要避免同时操作同一个变量,(例如循环队列程序)
可采用类似于 OS_ENTER_CRITICAL() OS_EXIT_CRITICAL() 的操作来保护代码不被打断。



专治疑难杂症
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

28

主题

360

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1027
金钱
1027
注册时间
2021-2-4
在线时间
146 小时
发表于 2021-3-12 10:11:30 | 显示全部楼层
回复 支持 反对

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8204
金钱
8204
注册时间
2020-5-11
在线时间
3697 小时
 楼主| 发表于 2021-3-12 10:26:08 | 显示全部楼层
本帖最后由 LcwSwust 于 2021-3-12 10:29 编辑
电子控2021 发表于 2021-3-12 10:11
1 和 2都是会报错的吧

工程在此,不妨验证一下:
STC15测温 - 副本.rar (9.05 KB, 下载次数: 4)
专治疑难杂症
回复 支持 反对

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8204
金钱
8204
注册时间
2020-5-11
在线时间
3697 小时
 楼主| 发表于 2021-3-19 10:26:18 | 显示全部楼层
本帖最后由 LcwSwust 于 2024-7-19 11:09 编辑

13. int *p; *p=
  指针未初始化就对指向的地址赋值,不知赋到哪去了。
14.使能了中断,却未写中断服务函数,可能出现死机、复位等现象。
15.有些中断是需要清标志的,若不清标志则会一直中断,主循环卡死。
16.八进制了解一下:010=8,数字前加个0就成8进制了,要小心。
17.编译器本身有BUG,如显示汉字字符串时,需打补丁,未破解的编译器还会有代码量限制。
18.处理串口数据帧时,串口中断里判断一帧完成后置标志,主循环检查到标志置位后清标志并处理数据,
  但是在主循环处理数据前又来了新的数据,造成数据错乱。建议利用循环队列或乒乓操作防止当前数据被更新。

19.if(a<b<c) 应写成 if((a<b)&&(b<c))
20.main()最后不加while(1) ;
21.        char* p1,p2;//想定义两个指针
        p2=p1;//但实际上p2不是指针而是char
22. 函数入口参数的计算顺序不同:
  1. char test1(void)
  2. {
  3. uart_sendbyte(USART0,1);
  4. return 1;
  5. }
  6. char test2(void)
  7. {
  8. uart_sendbyte(USART0,2);
  9. return 2;
  10. }

  11. void test(char v1,char v2)
  12. {
  13. uart_sendbyte(USART0,v1*10+v2);
  14. }
复制代码
调用test(test1(),test2());时,51单片机会先发1再发2,STM32单片机则是先发2后发1.

23.单片机本身原因引起的BUG:在STC8A8K48单片机中,访问XDATA中的寄存器时,如果EAXFR未置位,将变成访问外部扩展RAM,影响P0、P2、WR、RD、ALE脚;
手册中未详细说明外部扩展RAM的开启条件。
傲游截图20230904122155.jpg



专治疑难杂症
回复 支持 反对

使用道具 举报

1

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
370
金钱
370
注册时间
2020-1-19
在线时间
51 小时
发表于 2022-4-18 10:03:50 | 显示全部楼层
感谢分享,获益匪浅!顶帖
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 16:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表