工作中发现一个偶发BUG,经过反复查找,发现是计时变量比较导致的。故写了一个测试程序(主体都是工具生成的)验证。
- #include "reg51.h"
- #include "intrins.h"
-
- sfr T2L = 0xd7;
- sfr T2H = 0xd6;
- sfr AUXR = 0x8e;
- sfr P_SW1 = 0xa2;
-
- sfr P0M1 = 0x93;
- sfr P0M0 = 0x94;
- sfr P1M1 = 0x91;
- sfr P1M0 = 0x92;
- sfr P2M1 = 0x95;
- sfr P2M0 = 0x96;
- sfr P3M1 = 0xb1;
- sfr P3M0 = 0xb2;
- sfr P4M1 = 0xb3;
- sfr P4M0 = 0xb4;
- sfr P5M1 = 0xc9;
- sfr P5M0 = 0xca;
-
- sbit P10 = P1^0;
- sbit P11 = P1^1;
- sbit P12 = P1^2;
-
- void UART1_Isr() interrupt 4
- {
- if (TI)
- {
- TI = 0; //清中断标志
- P10 = !P10; //测试端口
- }
- if (RI)
- {
- RI = 0; //清中断标志
- P11 = !P11; //测试端口
- }
- }
-
- unsigned long tick=0;
-
- void TM0_Isr() interrupt 1
- {
- tick++; //测试端口
- }
-
-
- void main()
- {
- unsigned long curTime=0;
- P0M0 = 0x00;
- P0M1 = 0x00;
- P1M0 = 0x00;
- P1M1 = 0x00;
- P2M0 = 0x00;
- P2M1 = 0x00;
- P3M0 = 0x00;
- P3M1 = 0x00;
- P4M0 = 0x00;
- P4M1 = 0x00;
- P5M0 = 0x00;
- P5M1 = 0x00;
-
- // 串口设置
- SCON = 0x50;
- P_SW1 &= 0x3F;// 使用P30 P31
- T2L = 0xe8; //65536-11059200/115200/4=0FFE8H
- T2H = 0xff;
- AUXR = 0x15; //启动定时器
- ES = 1; //使能串口中断
- EA = 1;
- SBUF = 0x5a; //发送测试数据
-
- // 定时器设置
- TL0 = 0x66; //65536-11.0592M/12/1000
- TH0 = 0xfc;
- TR0 = 1; //启动定时器
- ET0 = 1; //使能定时器中断
- EA = 1;
-
- while (1)
- {
- if((tick/500)%2) P12=0;
- else P12 = 1;
- curTime = tick+100;
- if(tick>curTime)
- {
- SBUF = 0xaa; //发送测试数据
- }
- }
- }
-
复制代码
上述单文件代码,会偶发出现 if(tick>curTime) 满足的情况,见下面截图:
以上记录。
1、方便其他人能够规避发现该问题,避免走弯路;
2、有没有好的解决方法?
|