OpenEdv-开源电子网

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

单片机C语言易错

[复制链接]

39

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2016-3-30
在线时间
24 小时
发表于 2016-8-18 16:25:25 | 显示全部楼层 |阅读模式
单片机C语言易错知识点,记住它们会让你事半功倍!
在进行单片机开发时,经常都会出现一些很不起眼的问题,这些问题其实都是很基础的C语言知识点,是一些小细节。
但是正是因为很基础,又都是小细节,所以我们往往容易忽视它们。结果有时候我们会花很长的时间纠结一个问题,迟迟找不到问题的所在。
当发现原因竟然是这么的简单和不起眼时,我想不单是我,大家都会感到痛不欲生。这些问题要记录下来,时刻提醒自己!!
1 !和 ~ 不一样
! 是逻辑非符号,~ 是位取反符号。
对IO口某个引脚赋值时不要错用!如
2<<和>>的优先级低于+、-
比如要实现c=x*2+1,没有加括号会出错
3移位要防止溢出
其实用移位代替乘除法是个不错的方法,笔者很喜欢拿到一段代码后用移位代替乘除法来进行优化。不过有时候却会出现问题,比如溢出问题。当很明显可能溢出的话我们是会注意的,比如
但是有时候这个问题是不明显的,比如当移位出现在数组索引或函数参数时,有段用液晶显示字符的代码如下
我们可以用左移运算来代替乘法进行优化,如
这本是一个好方法,但是事实上上面的代码是错的。当执行c<<4时,因为没有明显的赋值过程,我们可能认为没问题,而事实上c的高位已经丢失了,所以得到错误的结果。一个可行的做法是先进行强制转换,如
4无符号数和有符号数混合运算都会被强制转换为无符号数运算
当一个有符号数和一个无符号数进行算术运算时,系统会自动将有符号数强制转换为无符号数再进行运算(即使你使用有符号数强制类型转换),如下面两种写法的运输结果是一样的
5局部变量要初始化局部变量没有初始化的话,因为单片机每次为他分配的是同一个内存区域,当你在函数中是这么使用局部变量时,就可能出问题:如果第一次调用fun时,a传递的值为0,那么flag = 0x01;执行if(flag&0x01)后面的代码。以后再调用fun时,即使a不为0,但flag依然使用之前的内存区域,所以其值一直为0x01,一直执行的是if后面的代码,而不是else后面的。
想学习更多嵌入式,单片机,ARMlinux,硬件设计,PCB可加群277686564  QQ2905283896
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

140

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
290
金钱
290
注册时间
2016-8-15
在线时间
20 小时
发表于 2016-8-19 12:37:46 | 显示全部楼层
回复 支持 反对

使用道具 举报

39

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2016-3-30
在线时间
24 小时
 楼主| 发表于 2016-8-20 15:48:37 | 显示全部楼层
哈哈,支持一下
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-28 03:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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