• Thứ Năm, 03/03/2005 16:05 (GMT+7)

    Câu hỏi :
     Xin hỏi một số vấn đề về điều khiển hệ thống tự động bằng máy tính:

     - Cách xác lập thời gian thực trong Windows? Cách xác định khoảng thời gian nhỏ hơn 1ms?

     - Khi chèn một đoạn hợp ngữ vào giữa một chương trình viết bằng C++ thì ta có phải lưu lại nội dung của các thanh ghi để trả về sau đoạn hợp ngữ hay trình biên dịch tự làm việc này?

     - Xin hướng dẫn một số chương trình trao đổi thông tin qua các cổng (COM, cổng máy in) của máy tính.


    Trả lời :

     - Bạn không nói rõ "xác lập thời gian thực" cụ thể để làm gì nên chúng tôi không thể trả lời chính xác cho bạn được. Chúng tôi chỉ lưu ý với bạn, Windows không phải là HĐH thời gian thực đúng nghĩa (real-time OS), tuy nhiên ta vẫn có thể dùng Windows để giải quyết 1 số chức năng chưa cần mức độ real-time quá khắt khe, thí dụ ta vẫn có thể record/play các thông tin audio/video, điều khiển các thiết bị I/O có tốc độ làm việc tương đối chậm... Để giải quyết các chức năng "real-time" này, bạn có thể gọi hàm API như SetPriorityClass() và SetThreadPriority() để thiết lập quyền ưu tiên cho thread liên quan có độ ưu tiên cao nhất (real-time). Chi tiết về các hàm API này được trình bày trong MSDN của Microsoft.

     - Các hàm API của Windows liên quan đến timer đều dùng Int 8 làm cơ sở đo lường, mà Int 8 xảy ra với tần số 18.2Hz, nghĩa là có độ phân giải khoảng 55ms, như vậy quá kém chính xác so với yêu cầu của bạn. Để đo khoảng thời gian khá nhỏ (nhỏ hơn 1ms), thường ta phải dùng dịch vụ VTC (Virtual Timer Device), dịch vụ này có thể cho độ phân giải khoảng 0.8 microsecond). Để biết thông tin chi tiết, cụ thể về việc dùng dịch vụ VTC, bạn nên đọc trang Web "Timer2.exe - Timers and Timing in Microsoft Windows" trong CD MSDN của Microsoft.

     - Không thể khẳng định được điều gì cả, thường thì chương trình dịch sẽ tự quản lý nội dung các thanh ghi CPU giữa các đoạn lệnh assembly và C++ xen kẽ nhau để tránh gây lỗi. Tuy nhiên nếu bạn là người cẩn thận, trước các đoạn lệnh assembly bạn nên thêm 1 số lệnh push để cất các thanh ghi được dùng trong đoạn lệnh assembly đó, rồi sau khi đoạn lệnh assembly chạy xong, bạn viết thêm 1 số lệnh pop để phục hồi lại giá trị cũ của các thanh ghi.

     - Do nhu cầu giao tiếp giữa máy tính với thiết bị I/O qua cổng COM rất phổ biến nên Microsoft đã xây dựng sẵn linh kiện "Microsoft Communications Control", linh kiện này cung cấp 1 tập các hàm liên quan đến việc giao tiếp thông qua cổng COM. Bạn có thể đọc thông tin chi tiết về nó trước khi dùng trong MSDN của Microsoft.
    Chuyên mục: Hệ thống