本帖最后由 renpeng009672 于 2019-10-6 22:13 编辑
我知道哪儿错了。。。。。。。。。拿无符号数和有符号数进行比较了。。。。。。。
编译器没错
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
简单描述如下:
代码用了一个小OS,串口中断里发送信号给串口接收任务,接收任务里从SBUF取数据,一帧数据以 0x55 0xAA 作为开头,接收任务需要判断发来的数据的前两个字节是不是0x55和0xAA
- while (1)
- {
- OSWait(K_SIG,0);//等待串口中断发来信号
- temp1=SBUF0;
- if (temp==0x55)
- {
- if (temp1==0xaa)
- {
- break;
- }
-
- }
- temp=temp1;
- }
- for (ii=0;ii<NBYTE-2;ii++)
- {..............
复制代码
按理来说,前两个字节是 0x55 0xAA 的话,会运行到break语句,然后执行for (ii=0;ii<NBYTE-2;ii++)....
但是实践表明,完全不是这样。然后我看了一下反汇编代码:
- 48: while (1)
- 49: {
- 50: OSWait(K_SIG,0);
- C:0x0592 E4 CLR A
- C:0x0593 FD MOV R5,A
- C:0x0594 7F01 MOV R7,#0x01
- C:0x0596 12086D LCALL _OSWait(C:086D)
- 51: temp1=SBUF0;
- C:0x0599 85991B MOV temp1(0x1B),SBUF0(0x99)
- 52: if (temp==0x55)
- C:0x059C AF08 MOV R7,temp(0x08)
- C:0x059E EF MOV A,R7
- C:0x059F 33 RLC A
- C:0x05A0 95E0 SUBB A,ACC(0xE0)
- C:0x05A2 FE MOV R6,A
- C:0x05A3 EF MOV A,R7
- C:0x05A4 6455 XRL A,#0x55
- C:0x05A6 4E ORL A,R6
- C:0x05A7 700D JNZ C:05B6 /////////////看这里
- 53: {
- 54: if (temp1==0xaa)
- C:0x05A9 AF1B MOV R7,temp1(0x1B)
- C:0x05AB EF MOV A,R7
- C:0x05AC 33 RLC A
- C:0x05AD 95E0 SUBB A,ACC(0xE0)
- C:0x05AF FE MOV R6,A
- C:0x05B0 EF MOV A,R7
- C:0x05B1 64AA XRL A,#0xAA
- C:0x05B3 4E ORL A,R6
- C:0x05B4 6005 JZ C:05BB ////////////////////还有这里
- 55: {
- 56: break;
- 57: }
- 58:
- 59: }
- 60: temp=temp1;
- C:0x05B6 851B08 MOV temp(0x08),temp1(0x1B)
- 61: }
- C:0x05B9 80D7 SJMP Uart0(C:0592)
- 62: for (ii=0;ii<NBYTE-2;ii++)
- C:0x05BB E4 CLR A
复制代码
为啥标记的两行不一样捏?然后我改成这样:
- while (1)
- {
- OSWait(K_SIG,0);
- temp1=SBUF0;
- if (temp==0x55)
- {
- if (temp1!=0xaa) //////////改成了这样
- {
- break;
- }
-
- }
- temp=temp1;
- }
- for (ii=0;ii<NBYTE-2;ii++)
- {..............
复制代码
发送给单片机 0x55 0xAA ........时就可以正常运行到break。但是,这不是正确的逻辑啊。。。。
- 48: while (1)
- 49: {
- 50: OSWait(K_SIG,0);
- C:0x0592 E4 CLR A
- C:0x0593 FD MOV R5,A
- C:0x0594 7F01 MOV R7,#0x01
- C:0x0596 12086D LCALL _OSWait(C:086D)
- 51: temp1=SBUF0;
- C:0x0599 85991B MOV temp1(0x1B),SBUF0(0x99)
- 52: if (temp==0x55)
- C:0x059C AF08 MOV R7,temp(0x08)
- C:0x059E EF MOV A,R7
- C:0x059F 33 RLC A
- C:0x05A0 95E0 SUBB A,ACC(0xE0)
- C:0x05A2 FE MOV R6,A
- C:0x05A3 EF MOV A,R7
- C:0x05A4 6455 XRL A,#0x55
- C:0x05A6 4E ORL A,R6
- C:0x05A7 700D JNZ C:05B6 /////////////////看这里
- 53: {
- 54: if (temp1!=0xaa)
- C:0x05A9 AF1B MOV R7,temp1(0x1B)
- C:0x05AB EF MOV A,R7
- C:0x05AC 33 RLC A
- C:0x05AD 95E0 SUBB A,ACC(0xE0)
- C:0x05AF FE MOV R6,A
- C:0x05B0 EF MOV A,R7
- C:0x05B1 64AA XRL A,#0xAA
- C:0x05B3 4E ORL A,R6
- C:0x05B4 7005 JNZ C:05BB /////////////还有这里
- 55: {
- 56: break;
- 57: }
- 58:
- 59: }
- 60: temp=temp1;
- C:0x05B6 851B08 MOV temp(0x08),temp1(0x1B)
- 61: }
- C:0x05B9 80D7 SJMP Uart0(C:0592)
- 62: for (ii=0;ii<NBYTE-2;ii++)
- C:0x05BB E4 CLR A
复制代码
求大神解惑
备注:win7 x86系统 Keil V5.25
说实话,字节型的数据我之前在keil arm编译器里从来都是不加区分的,因为是串口数据处理校验,所以基本上都是判断是否相等,并不判断大小,所以有符号和无符号我始终认为是相等的,因为在存储器里的二进制是一模一样的,也没出过问题,直到移植到51上才发现这个问题。
一周热门 更多>