|
rdRead()函数中的代码
- if (rb->rbHead < rb->rbTail)
- {
- copySz = min(count, rbCanRead(rb));
- memcpy(data, rb->rbHead, copySz);
- rb->rbHead += copySz;
- return copySz;
- }
复制代码 其中copySz=min...编译后汇编如下:
- 121: copySz = min(count, rbCanRead(rb));
- 0x080054FA 4620 MOV r0,r4
- 0x080054FC F7FFFFB4 BL.W rbCanRead (0x08005468)
- 0x08005500 42B0 CMP r0,r6
- 0x08005502 D901 BLS 0x08005508
- 0x08005504 4630 MOV r0,r6
- 0x08005506 E002 B 0x0800550E
- 0x08005508 4620 MOV r0,r4
- 0x0800550A F7FFFFAD BL.W rbCanRead (0x08005468)
- 0x0800550E 4605 MOV r5,r0
复制代码 此语句在下面这种情况时会出现漏读一个数据。
执行此条C语句之前,count=1,rbCanRead(rb)返回为1。
然后PC指针会执行到0x0800550A,如果此时又有一个数据接收到(通过rbWrite()填充到循环缓冲区)。
这时0x0800550A语句执行会返回为2,导致送给copySz的值为2。
复制了两个数据至data指针。
而在gizProtocolGetOnePacket()中调用传递的是读1个数据。这样就丢了一个数据了。
而且会影响&tmpData的下一个地址的数据。
|
|