作者newranger (ranger)
看板C_and_CPP
標題[問題] read driverDescript
時間Wed Jul 31 11:54:45 2013
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
GCC
問題(Question):
請教各位版友, 我在kernel層有個讀寫URB封包的driver.
而想在User層每隔約10ms的迴圈,讀取一次封包內容
然而當執行read後, 迴圈的間隔時間從10ms被拉到1s的等級
我也試過select的寫法, 但是依舊迴圈間隔被拉長
請問這是怎麼一回事呢? 謝謝
程式碼(Code):(請善用置底文網頁, 記得排版)
#define QSI_UsbDevPath "/dev/test0"
int main(void)
{
int fID,ack;
time_t lt;
unsigned char AAA[256];
fID=open(QSI_UsbDevPath, (O_RDWR|O_NONBLOCK));
while(1){
lt =time(NULL);
printf("T=%d\r\n",lt);
ack=read(fID, AAA, 1);
usleep(10000);
}
return 0;
}
補充說明(Supplement):
select的寫法:
FD_ZERO(&event_fds);
FD_SET(fID,&event_fds);
tv.tv_sec = 0;
tv_usec = 1000;
fID=open(QSI_UsbDevPath, (O_RDWR|O_NONBLOCK));
while(1){
lt =time(NULL);
printf("T=%d\r\n",lt);
usleep(10000);
if(select(fID+1, &event_fds, NULL, NULL, &tv)>0)
{
memset(DevData.recv_buffer, 0, MAX_RECV_SIZE);
ack = read(DevData.fd, buffer, 1);
}
else
{
FD_ZERO(&event_fds);
FD_SET(fID,&event_fds);
tv.tv_sec = 0;
tv_usec = 1000;
}
}
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.120.179.30
※ 編輯: newranger 來自: 59.120.179.30 (07/31 11:56)
→ newranger:另外就是我額外開一個Thread去跑read(), 想說這樣就可以 07/31 18:31
→ newranger:用block, 但是為啥無法block. 還是給我1秒回一次return. 07/31 18:32
→ newranger:雖然不會讓主迴圈的10ms延誤, 但這樣polling很慢很卡耶 07/31 18:33
→ hpeter:aio ?? 07/31 23:00
→ newranger:糟糕,AIO概念不是很熟,我很少寫driver... >_<a 08/01 00:48
→ newranger:該driver其實是用usb_fill_int_urb等去註冊URB封包. 然 08/01 00:48
→ newranger:後在URB封包接收傳送完成時, 放到KERNEL裡面的buffer 08/01 00:48
→ newranger:最後撰寫註冊open,read,write等要做的函式, 其中read() 08/01 00:49
→ newranger:write()也不過就是對該buffer作copy_to_user()與 08/01 00:49
→ newranger:copy_from_user()而已, 這樣算是非同步嗎? 08/01 00:49