经过较长时间的分析与验证,找到了问题所在:PC机中运行的Windows操作系统是一个多任务的操作系统,同时运行着多个进程,系统在给每个进程分配时间片时也是有一定的优先级的,优先级高的进程占用时间片较多,如果PC机在执行某些其他进程时占用时间超过了一定的限度,就可能导致该读出的数据没有及时读出,而下一帧数据又已送到缓冲区,覆盖前一帧数据,从而造成丢帧。
解决丢帧的办法是在DSP的内存中设置一个圆形缓冲区,如果发现IN型端点的FIFO已满(说明PC机未及时读走FIFO中数据),则将本帧数据存入圆形缓冲区里,直到FIFO完全为空。
圆形缓冲区的结构如图4所示。

在图4中,sptr为写入数据指针,dptr为发送数据指针。整个圆形缓冲区的大小设置为256 K字(32位)。若按8 K的数据存入速率,可以保存8 s数据。在PC机不能及时读取IN端点FIFO数据的情况下,这个圆形缓冲区可以起到很好的缓冲作用。
在程序执行的初始时刻,设置指针sptr等于dptr。当IN端点FIFO满时,DSP将数据按指针sptr存入圆形缓冲区,sptr随之递增,而dptr保持不变。当IN端点FIFO空时,DSP仍将数据按指针sptr存入圆形缓冲区,sptr随之加1。但此时将从dptr指针处发送两帧数据到FIFO中,这种dptr追赶sptr的机制,将保证圆形缓冲区不出现溢出现象:即不会出现sptr超过dptr一圈以上的情况。
1.4 通讯系统软件整体设计
遵循软件设计中尽量较少使用中断的原则,这里只使用1个4 K中断,其他三路信号都采用查询方式,中断分配如图5所示。

图6为主程序流程。USB从管道0接收PC机发来的命令,命令写入EP2端点中,此时在INT7管脚上产生USB中断。DSP通过查询INT7中断,将EP2中的命令及数据读出,对命令进行解析,并执行相应的指令工作。非周期指令执行完后,将接收数据写入EP4端点,PC机从管道1中将数据取走;周期指令执行完后,将接收数据写入EP6端点,PC机从管道2中将数据取走。




