砍竹的人 发表于 2017-4-5 11:47:25

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的下一个地址的数据。

砍竹的人 发表于 2017-4-5 11:50:23

我的解决方法:
修改gizwits_protocol.h中的min宏定义
#define min(a, b) (a)<(b)?(a):(b)                   ///< 获取最小值改为
#define min(a, b) (a)<=(b)?(a):(b)                   ///< 获取最小值

郭庆帅 发表于 2017-4-5 14:04:54

板凳

MCU记忆 发表于 2017-4-5 14:57:25

哇! C语言转化汇编 YYY
页: [1]
查看完整版本: rbRead()中的一个BUG,大家注意