单片机C语言易错知识点经验笔记
来源:互联网 发布:2015网络新词新语精选 编辑:程序博客网 时间:2024/05/16 11:05
今天写这一篇文章并不是因为已经想好了一篇文章才写下来,而是我要将这一篇文章作为一个长期的笔记来写,我会一直更新。在进行单片机开发时,经常都会出现一些很不起眼的问题,这些问题其实都是很基础的c语言知识点,是一些小细节。但是正是因为很基础,又都是小细节,所以我们往往容易忽视它们。结果有时候我们会花很长的时间纠结一个问题,迟迟找不到问题的所在。当发现原因竟然是这么的简单和不起眼时,我想不单是我,大家都会感到痛不欲生。笔者今天又碰到了这样的问题,实在忍不住了。因为这些问题都是小的知识点,考虑到之前也遇到好多这种问题,于是决定每次遇到问题就记录下来,时刻提醒自己。
1. !和 ~ 不一样
! 是逻辑非符号,~ 是位取反符号。
对IO口某个管脚赋值时不要错用 !,如
LCD_CS_n_DR &= !LCD_CD_n_MASK;//错误LCD_CS_n_DR &= ~LCD_CD_n_MASK;//正确
2.<<和>>的优先级低于+、-
比如要实现c=x*2+1,没有加括号会出错
c = x<<1+ 1; //错误,c=x*(1+1)c = (x<<1) + 1; //正确,c=x*2+1
3.移位要防止溢出
其实用移位代替乘除法是个不错的方法,笔者很喜欢拿到一段代码后用移位代替乘除法来进行优化。不过有时候却会出现问题,比如溢出问题。当很明显可能溢出的话我们是会注意的,比如
char m = c<<4;//c为char型,可能溢出
但是有时候这个问题是不明显的,比如当移位出现在数组索引或函数参数时,有段用液晶显示字符的代码如下
char m = Font8x16[c*16+1]; //c为字符,寻找c的点阵字库
我们可以用左移运算来代替乘法进行优化,如
char m = Font8x16[(c<<4)+1];//c为字符,寻找c的点阵字库
这本是一个好方法,但是事实上上面的代码是错的。当执行c<<4时,因为没有明显的赋值过程,我们可能认为没问题,而事实上c的高位已经丢失了,所以得到错误的结果。一个可行的做法是先进行强制转换,如
char m = Font8x16[(uint16)c<<4)+1];//c为字符,寻找c的点阵字库
4.无符号数和有符号数混合运算都会被强制转换为无符号数运算
当一个有符号数和一个无符号数进行算术运算时,系统会自动将有符号数强制转换为无符号数再进行运算(即使你使用有符号数强制类型转换),如下面两种写法的运输结果是一样的
char a = (unsigned char)b / (signed char)c;
char a = (unsigned char)b / (unsigned char)c;
如果a=
5.局部变量要初始化
局部变量没有初始化的话,因为单片机每次为他分配的是同一个内存区域,当你在函数中是这么使用局部变量时,就可能出问题:
void fun(char a){ if(a==0) flag |= 1; ... if(flag & 0x01) ...; else ...;}
如果第一次调用fun时,a传递的值为0,那么flag = 0x01;执行if(flag&0x01)后面的代码。以后再调用fun时,即使a不为0,但flag依然使用之前的内存区域,所以其值一直为0x01,一直执行的是if后面的代码,而不是else后面的。
如果要避免这个错误,平时要养成对局部变量初始化的习惯。
- 单片机C语言易错知识点经验笔记
- 单片机C语言易错知识点经验笔记
- 很多知识点c语言(单片机)
- 笔记:C语言知识点恢复
- 《32位单片机c语言编程》笔记
- C语言易错知识点整理
- C语言小知识点的笔记
- 笔记 C语言零碎知识点记录
- 单片机C语言学习
- 单片机C语言下载
- 单片机C语言编程
- 单片机的c语言
- 单片机C语言程序结构
- 单片机C语言
- 单片机C语言
- 单片机C语言模板
- C语言单片机!
- C语言语法&单片机
- LINQ TO SQL语句
- ios视图缩放动画
- 二维数组作为函数参数(C语言)
- Spring MVC Controller重定向到jsp
- 点基础知识——OpenGL ES Common/Common-Lite 规范(版本 1.1.12)
- 单片机C语言易错知识点经验笔记
- 坐标变换——OpenGL ES Common/Common-Lite 规范(版本 1.1.12)
- win7下eclipse3.9中文字体太小的修改(转)
- ubuntu 安装软件 更新出现错误:Requires Installation of Untrusted Packages
- 使用JSON进行数据传输
- 缓存对象——OpenGL ES Common/Common-Lite 规范(版本 1.1.12)
- 当前顶点状态和顶点数组——OpenGL ES Common/Common-Lite 规范(版本 1.1.12)
- 光栅化基础知识——OpenGL ES Common/Common-Lite 规范(版本 1.1.12)
- 使用json-lib.jar包创建JsonObject