[問題] read driverDescript

看板C_and_CPP (C/C++)作者 (ranger)時間12年前 (2013/07/31 11:54), 編輯推噓0(0010)
留言10則, 2人參與, 最新討論串1/1
開發平台(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)

07/31 18:31, , 1F
另外就是我額外開一個Thread去跑read(), 想說這樣就可以
07/31 18:31, 1F

07/31 18:32, , 2F
用block, 但是為啥無法block. 還是給我1秒回一次return.
07/31 18:32, 2F

07/31 18:33, , 3F
雖然不會讓主迴圈的10ms延誤, 但這樣polling很慢很卡耶
07/31 18:33, 3F

07/31 23:00, , 4F
aio ??
07/31 23:00, 4F

08/01 00:48, , 5F
糟糕,AIO概念不是很熟,我很少寫driver... >_<a
08/01 00:48, 5F

08/01 00:48, , 6F
該driver其實是用usb_fill_int_urb等去註冊URB封包. 然
08/01 00:48, 6F

08/01 00:48, , 7F
後在URB封包接收傳送完成時, 放到KERNEL裡面的buffer
08/01 00:48, 7F

08/01 00:49, , 8F
最後撰寫註冊open,read,write等要做的函式, 其中read()
08/01 00:49, 8F

08/01 00:49, , 9F
write()也不過就是對該buffer作copy_to_user()與
08/01 00:49, 9F

08/01 00:49, , 10F
copy_from_user()而已, 這樣算是非同步嗎?
08/01 00:49, 10F
文章代碼(AID): #1H-8g85V (C_and_CPP)
文章代碼(AID): #1H-8g85V (C_and_CPP)