|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
今天写这一篇文章并不是因为已经想好了一篇文章才写下来,而是我要将这一篇文章作为一个长期的笔记来写,我会一直更新。在进行单片机开发时,经常都会出现一些很不起眼的问题,这些问题其实都是很基础的c语言知识点,是一些小细节。但是正是因为很基础,又都是小细节,所以我们往往容易忽视它们。结果有时候我们会花很长的时间纠结一个问题,迟迟找不到问题的所在。当发现原因竟然是这么的简单和不起眼时,我想不单是我,大家都会感到痛不欲生。笔者今天又碰到了这样的问题,实在忍不住了。因为这些问题都是小的知识点,考虑到之前也遇到好多这种问题,于是决定每次遇到问题就记录下来,时刻提醒自己。 ~! B$ R g- J; } ~; e
7 o; f$ s. N b6 M; b- d z: q3 b
8 h9 E B3 r! p4 Q$ d1. !和 ~ 不一样
- s g: y4 r/ m; t/ G* y d9 Q/ C4 ^3 {3 ~! E
# y Z) b- C; z. j) C# W& P: r
! 是逻辑非符号,~ 是位取反符号。
" J8 H, S1 q5 w. l5 s" R% u对IO口某个管脚赋值时不要错用 !,如
; Y# D2 W3 o# t- p * l( a6 N$ }, j: @
% y& }3 p9 m; a; |
' Y" Z2 ?( P9 C: ]7 D! v2.<<和>>的优先级低于+、-/ ~; q) d. G3 T& B0 `
: J3 @6 y( k6 B# Z& C
) Z2 E; i1 N, X0 P& o! A7 u
+ A% Q* g/ a: V& Z0 N, O比如要实现c=x*2+1,没有加括号会出错/ c4 Q; X) s5 E; z
![]()
8 w. Z" x+ l. [6 X. R* a
+ O1 w8 Q6 o; H
h3 D: l. {0 U* k) H% Z1 D3.移位要防止溢出
( ^, ~2 {, e2 z& {) V* j( X& U& U4 t0 V* d: e
5 N8 y3 \. m+ |7 f其实用移位代替乘除法是个不错的方法,笔者很喜欢拿到一段代码后用移位代替乘除法来进行优化。不过有时候却会出现问题,比如溢出问题。当很明显可能溢出的话我们是会注意的,比如
. {: |# ]( v* J E1 v: P9 ?![]()
0 } h5 r" b( c6 `/ ^5 I( V但是有时候这个问题是不明显的,比如当移位出现在数组索引或函数参数时,有段用液晶显示字符的代码如下
9 v6 |5 t# h L$ `' x# | 0 B" @6 K: ?9 K
我们可以用左移运算来代替乘法进行优化,如
. e) H% ~4 L) r8 z: M7 B$ Q![]()
7 |% @! _/ I9 l这本是一个好方法,但是事实上上面的代码是错的。当执行c<<4时,因为没有明显的赋值过程,我们可能认为没问题,而事实上c的高位已经丢失了,所以得到错误的结果。一个可行的做法是先进行强制转换,如8 k% N6 s; l( D+ t1 o
![]()
/ \: c3 u, K7 p0 p' U8 Z% o: X3 H% S8 [- d4 f2 A
4 i3 ]3 i# [* x8 S' R% [& e" j6 ^2 B
4.无符号数和有符号数混合运算都会被强制转换为无符号数运算
: U8 C+ B- O" z, A/ {8 w& @& q! \2 e3 B% a4 m( u- H( b# s
, q4 e. {4 t. j. A, |0 W. \当一个有符号数和一个无符号数进行算术运算时,系统会自动将有符号数强制转换为无符号数再进行运算(即使你使用有符号数强制类型转换),如下面两种写法的运输结果是一样的
, s' C0 [% O, o2 U0 H" s / V4 o& l q' K% \
; o d2 Z( n4 S: q3 ?( x0 j; ]& m& |
- q8 c( g) D) ?9 O
! `, F8 \8 M! C. R8 N% G0 n5.局部变量要初始化, Y$ \4 `2 P l8 R# r* }
. K& U! a) Z- o6 s4 j$ A# a p* l7 Q! }
局部变量没有初始化的话,因为单片机每次为他分配的是同一个内存区域,当你在函数中是这么使用局部变量时,就可能出问题:2 M, c" w0 ?% A, Q3 W
5 ^% N- \7 N4 u* u
如果第一次调用fun时,a传递的值为0,那么flag = 0x01;执行if(flag&0x01)后面的代码。以后再调用fun时,即使a不为0,但flag依然使用之前的内存区域,所以其值一直为0x01,一直执行的是if后面的代码,而不是else后面的。+ y9 R$ ^, _( T
' K% A. D5 r7 z; f) q0 u6 K
# p! w" w! G& n! j3 c3 a
如果要避免这个错误,平时要养成对局部变量初始化的习惯。 |
|