看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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