|
8 Y: {; d% d5 r如果你了解汇编语句,会对你的理解有帮助。所以不懂汇编是不能称为精通单片机的。/ W W+ R) `+ E
C语言t=1000中的t,在CPU中必须用两个字节来表示,不妨起个名子叫NH和NL。t=NH,NL
0 Q% H2 U( {* l3 U) u你的主程序一直在等t=1000,也就等(NH,NL,16进制)=03E8H,但是CPU指令只能一个一个的判断,假设先判断NH=03,而后再判断NL=E8,逻辑上是没有毛病的。
- h0 w* d) h5 f! i" g3 H) b' v你的中断是每1ms一次,中断发生时,你的程序运行到什么地方了呢?不太好确定吧,你的程序一直在等t=1000,估计多半会在此处中断。
2 Q$ V9 q: V0 u/ E h$ v/ n! Y+ X注意,有个关键的特殊事件发生了,而且发生的概率还不了(程序不长)。
5 E( z1 X; n) A: T! b' c- T1 `中断发生在CPU已判断了NH,还未判定NL。而中断服务程序会做t++,也即(NH,NL)+1,这就修改NL的值,问题来了。
( i0 n1 D1 _7 v- s. ]例如:原先(NH,NL)=1000 = 03E8H,程序已确定NH=03,如果NL=E8,就反转LED灯。
2 T/ S& W8 @/ H+ G p7 d但是中断发生在NH=03判断之后,而NL还未判定,中断时你将t++,也即(NH,NL)++,变成了 03E9H,中断返回后,再判断NL却不是E8,而是E9了。
: x) L$ ~2 f- k$ x( W. F如此,程序不会再做LED反转了。t将=1001,此后被加到65535,再回0,下次再加到1000。6 U6 P" h) g7 K' D4 ^ u f" G
也即,只要t=1000时发生中断,如果中断发生在主程序判断:NH=03与NL=E8之间。则本次LED的显示,就会超出你的预期!而且t会走向65535,再回0。 |
|