Thông tin cơ bản:Việc di chuyển mã vào không gian hạt nhân có cung cấp thời gian chính xác hơn không?
Tôi hiện có thiết bị phần cứng kết nối với cổng USB. Thiết bị phần cứng chịu trách nhiệm gửi các thông điệp định kỳ chính xác lên các mạng khác nhau, nó lần lượt cũng kết nối. Bên trong thiết bị phần cứng, tôi có một vài MicroPip dsPIC. Có hai phương thức hoạt động.
Một trường hợp là nơi gửi "công việc" đơn giản tới dsPICs, đến lượt nó, có thể gửi các thông điệp chính xác với độ chính xác .001ms. Kiến trúc này không lý tưởng cho việc nhắn tin phức tạp hơn, nơi chúng ta cần gửi một gói định kỳ thay đổi dựa trên các sự kiện đang diễn ra trong ứng dụng PC. Vì vậy, chúng tôi có một chế độ hoạt động thứ hai, nơi ứng dụng PC của chúng tôi sẽ gửi các tin nhắn định kỳ và các dsPIC chỉ đơn giản là chuyển đổi và truyền tải đáp ứng. Tất cả điều này, bằng cách này, là minh bạch cho người dùng cuối của phần mềm của chúng tôi. Thiết bị phần cứng của chúng tôi là một công cụ kiểm tra được sử dụng trong lĩnh vực ô tô.
Hiện tại, chúng tôi sử dụng USB để nối tiếp chip từ FTDI và trình điều khiển Windows FTDI để giao tiếp phần cứng với phần mềm PC của chúng tôi.
Vấn đề ở chế độ hai nơi chúng tôi gửi tin nhắn từ máy tính, tốt nhất chúng tôi có thể đạt được là khoảng 1ms trên phạm vi phần cứng trung bình. Chúng tôi phải chịu sự chấp thuận trước của hạt nhân Windows. Tôi đã thử một số "thủ thuật" để cải thiện những thứ như:
- Đảm bảo rằng người đọc của chúng tôi có thể sống riêng biệt khi có thể.
- Tăng mức ưu tiên luồng của người viết trong khi giảm mức độ ưu tiên của người đọc.
- Thông báo cho người dùng tắt trình bảo vệ màn hình và các ứng dụng khác khi sử dụng phần mềm của chúng tôi.
- Thay thế cuộc gọi tạo cuộc gọi bằng CreateTimerQueueMọi cuộc gọi.
Tất cả phần mềm của chúng tôi được viết bằng C/C++. Tôi rất quen thuộc và thoải mái với lập trình Windows nâng cao; chẳng hạn như IO hoàn thành, Overlapped I/O, hàng đợi threadless khóa (thực sự là một chiến lược thiết kế), ổ cắm, chủ đề, semaphores, vv ...
Tuy nhiên, tôi không biết gì về phát triển trình điều khiển Windows. Tôi đã đọc qua một vài giấy tờ về KMDF so với UDMF so với WDM.
Tôi hy vọng nhà phát triển trình điều khiển chế độ hạt nhân dày dặn của Windows sẽ phản hồi tại đây ...
Vòng tiếp theo. phần cứng của chúng tôi có tùy chọn thay thế chip FTDI và sử dụng giao diện USB của dsPIC hoặc, có thể, chuyển mã nguồn mở FTDI Linux sang Windows và tiếp tục sử dụng chip FTDI trong trình điều khiển tùy chỉnh của chúng tôi. Tôi nghĩ bằng cách vào trình điều khiển chế độ hạt nhân ở phía PC, tôi có thể thiết lập trình điều khiển hạt nhân có thể gửi các tin nhắn định kỳ vào các khoảng thời gian chính xác hơn mà không cần sử dụng và/hoặc có thể tận dụng DMA.
Chúng tôi có một đối thủ cạnh tranh trong kinh doanh của chúng tôi, những người tôi nghĩ chính xác điều gì đó tương tự với công cụ của họ. Theo như tôi biết, các ứng dụng không gian người dùng không thể lên lịch một chuỗi nào tốt hơn 1ms. Chúng tôi hiện đang sử dụng timeGetTime trong một chủ đề. Tôi đã thử nghiệm với hàng đợi hẹn giờ (thông qua CreateTimerQueueTimer) mà không có cải tiến thực sự.
WDM là phương pháp đúng để đạt được thời gian chính xác hơn?
Đối thủ cạnh tranh của chúng tôi một số cách đạt được thời gian rất chính xác từ các tín hiệu điều khiển Windows đến phần cứng của chúng và chúng tải trình điều khiển hạt nhân (.sys) và thiết bị của họ chạy trên USB2.0 cũng như của chúng tôi.
Nếu WDM là con đường để đi, tôi có thể nhận được một số lời khuyên về những chức năng hạt nhân nào tôi nên nghiên cứu để thiết lập thời gian không? Cảm ơn bạn đã đọc
Bạn vẫn sẽ không nhận được chế độ thời gian thực trên Windows. Làm thế nào chính xác này cần phải được? –
xem bài đăng gốc, chúng tôi đang tìm cách để có được .001ms chính xác. Một thiết lập DMA điển hình sẽ chạy độc lập với CPU chủ và có thể đồng hồ dữ liệu ở tốc độ được cấu hình. Những gì tôi không biết là nếu tôi cần một thiết lập DMA hoặc nếu tôi có thể sử dụng một cái gì đó như RTC để sắp xếp thời gian ngắt. Tôi nghĩ rằng tôi đọc bạn có thể sử dụng Linux tương đương với một spin_lock_irqsave trong đó bạn vô hiệu hóa IRQs trong khi bạn xử lý dữ liệu. nó phức tạp, tôi biết nhưng ứng dụng không gian người dùng hiện tại của chúng tôi được đặt trước trong và ngoài ngữ cảnh luồng. Và điểm mấu chốt đối thủ cạnh tranh của chúng tôi là kéo nó ra! – Eric
Eric: Tương đương ở đây là để tăng mức IRQL trên mức công văn thông qua KeRaiseIrqlToDpcLevel –