rbRead()中的一个BUG,大家注意
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 F7FFFFB4BL.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 F7FFFFADBL.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的下一个地址的数据。
我的解决方法:
修改gizwits_protocol.h中的min宏定义
#define min(a, b) (a)<(b)?(a):(b) ///< 获取最小值改为
#define min(a, b) (a)<=(b)?(a):(b) ///< 获取最小值
板凳 哇! C语言转化汇编 YYY
页:
[1]