Tôi là một lập trình viên nhúng cố gắng mô phỏng một trình lên lịch thời gian thực trong môi trường Win32 sử dụng Visual Studio 2010 và MingW (hai môi trường xây dựng riêng biệt). Tôi rất xanh trên môi trường lập kế hoạch Win32 và đã đánh một bức tường gạch với những gì tôi đang cố gắng làm. Tôi không cố gắng để đạt được hành vi thời gian thực - chỉ để có được các nhiệm vụ mô phỏng để chạy theo thứ tự và trình tự giống như chúng sẽ thực hiện trên phần cứng đích thực sự.Bắt buộc lập lịch trình chuỗi Win32 thành một chuỗi được xác định dựa trên mức ưu tiên
Trình lập lịch biểu thời gian thực được mô phỏng có mục tiêu đơn giản - luôn thực thi tác vụ ưu tiên cao nhất (chuỗi) có thể chạy. Ngay sau khi một nhiệm vụ có thể chạy - nó phải làm nhiệm vụ trước đang chạy nếu nó có mức ưu tiên cao hơn nhiệm vụ hiện đang chạy. Một nhiệm vụ có thể chạy do một sự kiện bên ngoài mà nó đang chờ đợi, hoặc một thời gian ra/chặn thời gian/thời gian ngủ hết hạn - với một ngắt đánh dấu tạo ra cơ sở thời gian.
Ngoài hành vi ưu tiên này, nhiệm vụ có thể mang lại hoặc tình nguyện từ bỏ phần thời gian của nó vì đang thực hiện chức năng ngủ hoặc chờ.
Tôi đang mô phỏng điều này bằng cách tạo chuỗi Win32 ưu tiên thấp cho mỗi tác vụ được tạo bởi trình lên lịch thời gian thực được mô phỏng (luồng có hiệu quả chuyển ngữ cảnh sẽ thực hiện trên mục tiêu được nhúng thực), ưu tiên trung bình Chuỗi Win32 như một trình xử lý ngắt giả (xử lý các ngắt đánh dấu mô phỏng và các yêu cầu về năng suất được báo hiệu bằng cách sử dụng đối tượng sự kiện Win32) và chuỗi Win32 ưu tiên cao hơn để mô phỏng thiết bị ngoại vi tạo ra các ngắt đánh dấu. Khi trình xử lý ngắt giả thiết lập rằng một lệnh chuyển đổi nhiệm vụ sẽ xảy ra, nó đình chỉ chuỗi đang thực thi bằng cách sử dụng SuspendThread() và tiếp tục luồng thực thi tác vụ mới được chọn bằng cách sử dụng ResumeThread(). Trong số nhiều tác vụ và các chuỗi Win32 liên quan của chúng có thể được tạo ra, chỉ có một luồng quản lý tác vụ sẽ thoát khỏi trạng thái bị treo bất kỳ lúc nào. Điều quan trọng là một sợi treo bị đình chỉ ngay lập tức rằng SuspendThread() được gọi, và rằng chuỗi xử lý ngắt giả thực thi ngay sau khi sự kiện nói rằng ngắt đang chờ được báo hiệu - nhưng đây không phải là hành vi tôi đang thấy. Một vấn đề ví dụ mà tôi đã có một công việc xung quanh cho: Khi một nhiệm vụ/thread mang lại sự kiện lợi nhuận được chốt trong một biến và chuỗi xử lý ngắt được báo hiệu là có một ngắt giả (năng suất) cần Chế biến. Bây giờ trong một hệ thống thời gian thực như tôi đang sử dụng để lập trình tôi mong đợi các thread xử lý ngắt để thực hiện ngay lập tức rằng nó được báo hiệu bởi vì nó có một ưu tiên cao hơn so với các sợi tín hiệu nó. Những gì tôi thấy trong môi trường Win32 là luồng báo hiệu luồng ưu tiên cao hơn tiếp tục một thời gian trước khi bị đình chỉ - hoặc vì phải mất một thời gian trước khi chuỗi ưu tiên cao hơn được báo hiệu bắt đầu thực hiện hoặc vì phải mất một thời gian nhiệm vụ thực sự ngừng chạy - Tôi không chắc chắn. Trong mọi trường hợp, điều này có thể dễ dàng chính xác bằng cách tạo khối chuỗi Win32 có hiệu lực trên semaphore sau khi báo hiệu chuỗi xử lý ngắt Win32 và có xử lý ngắt chuỗi Win32 bỏ chặn luồng khi nó kết thúc chức năng của nó (bắt tay). Sử dụng hiệu quả đồng bộ hóa luồng để buộc mô hình lên lịch cho những gì tôi cần. Tôi đang sử dụng SignalObjectAndWait() cho mục đích này.
Sử dụng kỹ thuật này mô phỏng hoạt động hoàn hảo khi bộ lập lịch thời gian thực được mô phỏng hoạt động ở chế độ hợp tác - nhưng không (khi cần) trong chế độ ưu tiên.Vấn đề với chuyển đổi nhiệm vụ preemptive là tôi đoán như nhau, nhiệm vụ tiếp tục thực hiện một thời gian sau khi nó đã được yêu cầu đình chỉ trước khi nó thực sự ngừng chạy để hệ thống không thể được đảm bảo để được ở trạng thái nhất quán khi chuỗi chạy lệnh treo. Trong trường hợp preemptive mặc dù, bởi vì nhiệm vụ không biết khi nào nó sẽ xảy ra, cùng một kỹ thuật của việc sử dụng một semaphore để ngăn chặn các Win32 thead tiếp tục cho đến khi nó tiếp tục tiếp theo không thể được sử dụng.
Có ai đó đã thực hiện điều này ở xa bài đăng này - xin lỗi vì độ dài của nó!
Câu hỏi của tôi sau đó là:
Làm thế nào tôi có thể buộc Win32 (XP) lên lịch bắt đầu và chấm dứt nhiệm vụ ngay lập tức rằng ngưng và tiếp tục chức năng chủ đề được gọi là - hay - làm thế nào tôi có thể buộc một ưu tiên cao hơn Win32 thread để bắt đầu thực hiện ngay lập tức mà nó có thể làm như vậy (đối tượng nó bị chặn trên được báo hiệu). Hiệu quả buộc Win32 lên lịch lại các tiến trình đang chạy của nó.
Có cách nào không đồng bộ dừng tác vụ chờ một sự kiện khi nó không nằm trong đường dẫn thực thi tuần tự nhiệm vụ/chủ đề không.
Trình mô phỏng hoạt động tốt trong môi trường Linux nơi tín hiệu POSIX được sử dụng để ngắt luồng có hiệu quả - có tương đương trong Win32 không?
Cảm ơn bất kỳ ai đã dành thời gian đọc bài đăng dài này và đặc biệt cảm ơn trước bất kỳ ai có thể nắm lấy tay kỹ sư thời gian thực của tôi qua mê cung Win32 này.
Nhưng các sợi sẽ không chạy đồng thời trên nhiều lõi. –
Cảm ơn lời khuyên.Tôi sẽ tìm kiếm một số tài liệu tham khảo trên sợi ngày mai. – Richard
@Zan: nhiều sợi có thể chạy trong một chuỗi duy nhất và bạn có thể chạy nhiều luồng, một chuỗi cho mỗi lõi. –