本帖最后由 yyx_200 于 2012-10-7 20:00 编辑
先上程序.
void sendToENDP3(void)
{
if(section_count > 0) // 还有未接收剩余数
{
// 缓冲中现有未发出数据大于等于一个包处理
if( demo_data_count >= EVB_USB_BUF_SIZE )
{
demo_data_count -= EVB_USB_BUF_SIZE; // 重新计算缓冲中现有未发出数据长度
section_count --; // 计算剩余数
// 双缓冲处理 ----------------------------------------------------------
if(_GetENDPOINT(ENDP3) & EP_DTOG_RX)
{
UserToPMABufferCopy(pOutput, ENDP3_TXADDR0, EVB_USB_BUF_SIZE);
_SetEPDblBuf0Count(ENDP3,EP_DBUF_IN,EVB_USB_BUF_SIZE);
}else{
UserToPMABufferCopy(pOutput, ENDP3_TXADDR1, EVB_USB_BUF_SIZE);
_SetEPDblBuf1Count(ENDP3,EP_DBUF_IN,EVB_USB_BUF_SIZE);
}
_SetEPTxStatus(ENDP3, EP_TX_VALID);
// 移动上传数据起始指针 ------------------------------------------------
pOutput += EVB_USB_BUF_SIZE;
// if( pOutput >= demodata + DEMO_DATA_MAX_BUFFER_SIZE ){
if( pOutput >= pMAXIntput ){// 优化指针
pOutput = demodata;
}
#if 0
// 做个假数据 ----------------------------------------------------------
if(demo_data_count < 1 ){ // 做个假数据
if(section_count>1)
demo_data_count = 8192;
}
#endif
// ---------------------------------------------------------------------
_ToggleDTOG_RX(ENDP3);
}
// 大量数据上传处理--------------
void EP3_IN_Callback(void)
{
sendToENDP3();
}
我写了一个STM32程序,用于接收外部器件产生的数据流. 我用两个GPIO接到这个器件上.一个GPIO为clk输入端,另一个GPIO为sdo输入端,这个器件产生时钟和数据.每个时钟的周期是4uS,由于接收外部器件的数据实时性强,我用了外部中断方式,采集数据,并用个32k的buffer空间作为环形队列保存采集到的数据,stm32 根据时钟产生的串行数据流,通过stm32 的usb接口用BULK模式上传到PC,我用的是双缓冲上传,上传速度已经达到1M/s .当用假数据上传到PC时,USB传送正常,但打开外部中断后,却发生队列溢出问题,后来发现是每4US中断干扰了UserToPMABufferCopy 数据的传输.使usb传输变慢导致溢出. 请问各位大侠,如何解决这个问题? |