嵌入式开发经验案例

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.无符号数运算及与有符号数比较。

在开发流媒体客户端时,接收rtp报后需要比较其序号与期望得到序号相差是否超过范围:

nPackSeq - nNextWantedRTPSeq与 256 的大小。rtp包序号是一个2字节无符号证书,从0递增到65535,再递增时则变为0。

接收方期望得到的下一个包序号nNextWantedRTPSeq为65535时,发送方发送一个序号为65535的rtp 包然后包序号回卷到0开始,由于网络丢包,序号65535的rtp包以及接下来从0到256的rtp包都丢失了,于

是接收方收到了nPackSeq为257的包,按照上述nPackSeq - nNextWantedRTPSeq自动为无符号数的理论,(nPackSeq - nNextWantedRTPSeq>256 )的值应该是“true”,但在程序运行时发现并非如此,(nPackSeq - nNextWantedRTPSeq>256 )值为“false”。

*二、案例分析和解决

问题的根源在于rtp包序号是一个unsigned short int类型,导致案例描述中“nPackSeq - nNextWantedRTPSeq自动为无符号数”不成立。如果是两个unsigned int类型的变量作差,结果为unsigned int类型是成立的。在VC6.0中测试如下:

1. unsigned int变量作差

unsigned intnNext = 256;

unsigned intnNow = 1000;

std::cout<< ( nNext-nNow>0 ) <

2. unsigned short int变量作差

unsigned short intnNext = 256;

unsigned short intnNow = 1000;

std::cout<< ( nNext-nNow>0 ) <

解决问题的方式很简单,对两个unsigned short int变量的运算结果作强制转换即可,把nPackSeq - nNextWantedRTPSeq>256改为unsignedshortint(nPackSeq - nNextWantedRTPSeq) >256。

2.内存地址对齐对数据拷贝效率的影响

3.结构体字节对齐的问题

相关文档
最新文档