Công cụ bảo vệ mã nguồn .NET mạnh nhất, không thể unpack, miễn phí cho các khách hàng đầu tiên đăng ký.
Trang 1 trên tổng số 3 123 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 25 kết quả

Đề tài: Lập trình với ngắt thời gian

  1. #1
    Ngày gia nhập
    08 2018
    Nơi ở
    Online
    Bài viết
    4

    Mặc định Lập trình với ngắt thời gian

    Giả sử em có 1 đoạn chương trình, Liệt kê tất cả các số nguyên tố tăng dần như 2 3 5 7 11 13 17...
    Em cần viết 1 đoạn code C++ sử dụng ngắt thời gian(timer interrupt) để cài 1 ngắt -"Dừng chương trình và xuất tất cả những kết quả đã tính được."
    Ai có tài liệu về sử dụng ngắt này bằng tiếng Việt hoặc cho em xin đoạn code này lun. Em dốt tiếng Anh ko phải tại em lười.Hihi.

    Lưu ý đây là sử dụng ngắt của hệ thống nên không ảnh hưởng tốc độ xử lý của thuật toán.
    Ví dụ như hết thời gian làm bài (t định trước là 30s chẳng hạn) thì gọi ngắt này và dừng tính toán, lưu hết kết quả đã tính được ra file bài làm.
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.

  2. #2
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    586

    Ngắt thì dễ thôi. Nhưng làm sao biết được kết quả nào đã tính được thì khó đấy.

    Quá trình A (kiểm soát) ngắt quá trình B (tính toán). Cái này dễ.

    Quá trình B không hay biết gì về việc bị ngắt. Quá trình A không hay biết gì về thời điểm nào có thể ngắt. Nên dữ liệu ở thời điểm ngắt có thể đúng. Hoặc sai. Nghĩa là dữ liệu không còn nữa, chỉ còn 1 đống rác.

    Cần làm cho quá trình A và B "hiểu" nhau, ví dụ

    (a) B báo hiệu tình trạng của mình (ngắt được hay không). Trước khi bắt đầu cập nhật dữ liệu, báo hiệu cấm ngắt. Sau khi cập nhật dữ liệu xong, báo hiệu cho phép ngắt. Đây là phương pháp đợi em nhé. Cái này khó.

    (b) Thiết kế 1 cấu trúc dữ liệu và thuật toán đặc biệt cho B để dữ liệu của nó luôn luôn toàn vẹn, sẵn sàng ngắt bất cứ lúc nào. Và hạn chế A chỉ đọc dữ liệu, không cập nhật dữ liệu. Đây là phương pháp anh cứ đi. Khó hơn.

    (c) Thiết kế 1 cấu trúc dữ liệu và thuật toán đặc biệt hơn để cả B lẫn A đều có thể cập nhật dữ liệu (B sản xuất dữ liệu còn A tiêu thụ dữ liệu). Đây là phương pháp ông ăn chả bà ăn nem. Rất khó.

    Các phương pháp (a), (b), (c) nói chung đều khó làm, dù trên lý thuyết thì đều làm được nhưng cái khó là chúng ảnh hưởng đến tốc độ của thuật toán.
    Đã được chỉnh sửa lần cuối bởi Ada : 09-10-2018 lúc 10:37 PM.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  3. #3
    Ngày gia nhập
    08 2018
    Nơi ở
    Online
    Bài viết
    4

    Dạ.Em có 1 số ví dụ dễ hiểu và thực dụng hơn đó là:
    a. 1 chuơng trình đánh cờ tự động nó cần bít đến thời gian còn lại của trận đấu.
    b. Chương trình diệt virus trên totalWeds. nó hạn định 1 thời gian cần thiết để thông báo tình trạng của các AntiVirus như: có hay ko có virut hay ko đủ thời gian tính.
    c.Các chuơng trình chấm điểm các Phần mềm nói chung và AV nói riêng đều Phân tích các kết quả trả về của các chương trình trên 1 tập các mẫu Test sau 1 thời gian
    giới hạn.
    Tất nhiên nó phải chạy độc lập và không làm ảnh hưởng đến kết quả riêng của các phần mềm.
    Và tất nhiên chúng sử dụng ngắt hệ thống. Chứ chúng đâu có tự tính thời gian đâu,nếu không mún chiếm dụng tài nguyên các phần mềm kia.
    Ví dụ cái đồng hồ windows nào cũng có. Cái chương trình hiển thị đồng hồ nó sử dụng ngắt thời gian hệ thống để mà hiển thị thay đổi mỗi phút hoặc mỗi giây (1 s nó tính được 10 nghìn chu kì chẳng hạn). Ngắt của nó được tạo ra bằng phần cứng. Ví dụ sau mỗi 10 nghìn chu kì số giây tăng lên 1.
    Mún sử dụng các ngắt hệ thống thì phải sử dụng 1 bảng các Vecto Ngắt cung cấp bởi hệ điều hành, thừa hưởng từ BIOS hay hệ nền. Ví dụ sẽ có 1 số vecto Ngắt được WIn sử dụng và thay đổi để điều khiển các thiết bị phần cứng.
    Đó là tất cả những gì em còn nhớ khi học PASCAL nay qua C++ ko có tài liệu về ngắt hệ thống, cụ thể là ngắt thời gian. Liệu ai bít hay có tài liệu tiếng Việt share cho em được em cảm ơn.

  4. #4
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    586

    Đồng hồ là tương đối đơn giản, nên việc lấy giờ thường được thực hiện bằng cơ chế ngắt, nói rõ hơn, ngắt theo phương pháp "đợi em nhé" (a). Cụ thể, ngắt thời gian được định thời và xử lý ở cấp độ hệ điều hành; dữ liệu (thanh ghi của phần cứng định thời) được đọc và cập nhật trong chế độ bảo vệ cấm ngắt, thường là tuyệt đối, nghĩa là ở cấp ưu tiên cao nhất hay nói cách khác, không có phần mềm ứng dụng hay phần mềm hệ thống nào được phép ngắt thủ tục xử lý ngắt thời gian. Vì thế, ngắt thời gian là việc mà lập trình viên không cần quan tâm, trừ khi viết hệ điều hành hay viết ứng dụng nhúng (bao gồm cả hệ điều hành và ứng dụng).

    Thứ bạn quan tâm có lẽ không phải là ngắt, mà là cách tạo và sử dụng đồng hồ phần mềm (timer) riêng cho ứng dụng của bạn, hoặc ở mức thấp hơn nữa, cách cắm (hook) một hàm gọi sau (callback) vào một biến cố (event) nào đó liên quan đến đồng hồ, do hệ điều hành định nghĩa, mà thôi.
    Đã được chỉnh sửa lần cuối bởi Ada : 17-10-2018 lúc 03:51 PM.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  5. #5
    Ngày gia nhập
    08 2018
    Nơi ở
    Online
    Bài viết
    4

    Điều anh nói em còn mơ hồ và chưa thực sự hiểu hết được.Mong anh chỉ dẫn thêm. Sau đây là vài khái niệm của em:

    Cách thức 1 ngắt diễn ra như thế nào? Cái này em không có bít vì em chỉ tìm hiểu về cách sử dụng ngắt mà thôi.Cụ thể ở đây là ngắt hệ thống Thời gian.

    Đúng là em học trong lập trình nhúng(điện cơ). Theo trí nhớ của em, đại loại.
    Mọi hệ thống đều phải có thời gian riêng của nó để sắp xếp công việc. Như 1 cái máy tính nó có chip xử lý thời gian riêng chứa1 cái nhân thạch anh dao động với tần số 16MHz chẳng hạn.
    Vậy thì 16MHZ này cũng là tốc độ tối đa mà hệ thống có thể đáp ứng (trong các ứng dụng đòi hỏi sự đồng bộ).Nó có 1 số đại lượng tương đương khác được biết đến với cái tên như là Băng Thông. (BandWitch)
    Điều anh nói em hiểu nôm na về sự đồng bộ các quá trình trong 1 hệ thống Ko Đồng Bộ.Không biết em nghĩ như vậy có đúng không nữa.
    Nói về các ngắt ko khể quên nhắc đến tập lệnh của vi xử lý. Mà phần này em cũng quên mất tiêu rồi.
    Nhờ có nó ta biết được rằng 1 hệ thống có thể tồn tại 1 vài loại ngắt sau: Ngắt cứng và ngắt mềm với các độ ưu tiên khác nhau. Ngắt cứng chắc do phần cứng tạo ra. Ngắt Mềm do phần mềm cài vào. Và Các Ngắt cứng hay mềm thì nó cũng được xếp vào bảng Vecto ngắt để xác định độ ưu tiên.
    Như vậy Nguồn gốc của Ngắt là do Vi xử lý nó cung cấp cho hệ thống Nhúng của ta hoặc hệ Điều hành như BIOS rồi BIOS cung cấp tiếp cho DOS hay WInDOWS.
    Như ta đã thấy WIDOWS cũng chỉ là phần mềm và nó được quyền thay đổi bảng Vecto Ngắt này.
    Em xin lỗi là em chưa tìm hiểu về lập trình WINDOWS nên các khái niệm hàm callback hay kỹ thuật hook em chưa có biết.
    Và em đã từng cài 1 hàm do mình tự định nghĩa vào ngắt bàn phím(Lập trình PasCal trong môi trường DOS). Nó không phải môi trường đa nhiệm nên nó không phải trojan. Đó chỉ là 1 mày mò thử nghiệm nhỏ. Và cũng từ rất lâu rồi trước khi em biết đến lập trình nhúng.

    Kết Luận của em về ngắt: Có thể thay đổi được.Trong PasCal thì ngắt DOS là 21Hexa thì phải. và các chỉ số đi kèm trong các thanh ghi Flag sẽ quyết định số hiệu của Ngắt. hoặc 1 sử dụng kĩ thuật nhúng 1 đoạn assembler trực tiếp xử lý ngắt vô.
    Túm lại làm gì cũng được. Nó có nhiều điểm tương đồng với hook. Bởi em nghĩ hook cũng chính là "Cài 1 hàm của chính ta vào trong 1 ngắt mềm(thay thế cái thủ tục có sẵn của windows) ".Nói chung là WINDOWS đã sử dụng 1 cái ngắt mềm nào đó(em chưa học) để lập lịch các thao tác còn ta thì lại cài cái ngắt đó đến thủ tục của ta trước khi nó callback lại hàm ban đầu của WInDOW.
    HOOK là 1 cách sử dụng 1 loại ngẳt tiêu chuẩn nào đó.Là con cháu chút chít chụt chịt của cái ngắt thời gian.(Không hẳn là ngắt thời gian)

    Em không bít trong C++ có cho nhúng mã assembler không. Chắc em phải tìm lại các tài liệu về Ngắt bằng ASSembler quá.

    Tiện thể mong anh chỉ dẫn thêm hoặc về Ngắt hoặc về HOOK và lập trình WINDOWS.

    Anh rất nhiệt tình khi em mới vô đây. Cảm ơn anh rất nhiều, mà em vẫn chưa biết cách thank. Thất lễ.

  6. #6
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    586

    Mặc định Lập trình với ngắt thời gian

    Trích dẫn Nguyên bản được gửi bởi emyeuvn Xem bài viết
    Điều anh nói em còn mơ hồ và chưa thực sự hiểu hết được.Mong anh chỉ dẫn thêm. Sau đây là vài khái niệm của em:

    Cách thức 1 ngắt diễn ra như thế nào? Cái này em không có bít vì em chỉ tìm hiểu về cách sử dụng ngắt mà thôi.Cụ thể ở đây là ngắt hệ thống Thời gian.

    Đúng là em học trong lập trình nhúng(điện cơ). Theo trí nhớ của em, đại loại.
    Mọi hệ thống đều phải có thời gian riêng của nó để sắp xếp công việc. Như 1 cái máy tính nó có chip xử lý thời gian riêng chứa1 cái nhân thạch anh dao động với tần số 16MHz chẳng hạn.
    Vậy thì 16MHZ này cũng là tốc độ tối đa mà hệ thống có thể đáp ứng (trong các ứng dụng đòi hỏi sự đồng bộ).Nó có 1 số đại lượng tương đương khác được biết đến với cái tên như là Băng Thông. (BandWitch)
    Điều anh nói em hiểu nôm na về sự đồng bộ các quá trình trong 1 hệ thống Ko Đồng Bộ.Không biết em nghĩ như vậy có đúng không nữa.
    Đúng. Ở bài #2 mình dùng từ "ngắt" theo nghĩa rộng (mà bạn đã nêu ở bài #1) để chỉ bất cứ cách nào làm gián đoạn 1 quá trình trong 1 hệ thống đa nhiệm. Tuy nhiên, ở bài #4 mình dùng từ "ngắt" theo nghĩa hẹp (mà bạn đã nêu ở bài #3) để chỉ biến cố phần cứng làm gián đoạn phần mềm đang chạy và nhảy đến 1 phần mềm khác.

    Trích dẫn Nguyên bản được gửi bởi emyeuvn Xem bài viết
    Nói về các ngắt ko khể quên nhắc đến tập lệnh của vi xử lý. Mà phần này em cũng quên mất tiêu rồi.
    Nhờ có nó ta biết được rằng 1 hệ thống có thể tồn tại 1 vài loại ngắt sau: Ngắt cứng và ngắt mềm với các độ ưu tiên khác nhau. Ngắt cứng chắc do phần cứng tạo ra. Ngắt Mềm do phần mềm cài vào. Và Các Ngắt cứng hay mềm thì nó cũng được xếp vào bảng Vecto ngắt để xác định độ ưu tiên.
    Như vậy Nguồn gốc của Ngắt là do Vi xử lý nó cung cấp cho hệ thống Nhúng của ta hoặc hệ Điều hành như BIOS rồi BIOS cung cấp tiếp cho DOS hay WInDOWS.
    Đúng. Thật ra thì bảng vector ngắt bao hàm mọi ngắt, cả phần cứng (bất đồng bộ) lẫn phần mềm (đồng bộ, do phần mềm tự gây ra, thường là có chủ đích như 1 lời gọi nhân hệ thống (syscall), nhưng cũng có khi ngoài ý muốn, như mã lệnh bất hợp lệ, xâm phạm bộ nhớ, lỗi tràn stack, lỗi chia cho 0, v.v.). Nhưng ở đây chủ đề là ngắt thời gian nên mình chỉ giới hạn ở ngắt phần cứng thôi.

    Trích dẫn Nguyên bản được gửi bởi emyeuvn Xem bài viết
    Như ta đã thấy WIDOWS cũng chỉ là phần mềm và nó được quyền thay đổi bảng Vecto Ngắt này.
    Đúng. Windows có quyền. Nhưng điều đó không đảm bảo phần mềm ứng dụng trên Windows cũng có quyền ấy.

    Trích dẫn Nguyên bản được gửi bởi emyeuvn Xem bài viết
    Em xin lỗi là em chưa tìm hiểu về lập trình WINDOWS nên các khái niệm hàm callback hay kỹ thuật hook em chưa có biết.
    Và em đã từng cài 1 hàm do mình tự định nghĩa vào ngắt bàn phím(Lập trình PasCal trong môi trường DOS). Nó không phải môi trường đa nhiệm nên nó không phải trojan. Đó chỉ là 1 mày mò thử nghiệm nhỏ. Và cũng từ rất lâu rồi trước khi em biết đến lập trình nhúng.

    Kết Luận của em về ngắt: Có thể thay đổi được.Trong PasCal thì ngắt DOS là 21Hexa thì phải. và các chỉ số đi kèm trong các thanh ghi Flag sẽ quyết định số hiệu của Ngắt. hoặc 1 sử dụng kĩ thuật nhúng 1 đoạn assembler trực tiếp xử lý ngắt vô.
    Túm lại làm gì cũng được.
    Mình không nghĩ là Windows cho phép thay đổi bảng vector ngắt.

    Và nếu nó đã không cho, thì không có cách nào qua mặt nó được. Windows chỉ chạy trên những bộ xử lý có chế độ bảo vệ và chỉ chạy trong chế độ bảo vệ (được thiết lập rất sớm trong quá trình khởi động hệ điều hành). Bảng vector ngắt là dữ liệu được bảo vệ, chỉ tồn tại trong không gian (bộ nhớ ảo) của nhân hệ điều hành (kernel land), không tồn tại trong không gian của phần mềm ứng dụng và thư viện API mà hệ điều hành cung cấp cho ứng dụng (user land). Mã ứng dụng không "nhìn thấy" nó.

    Khi ngắt (cứng hay mềm) xảy ra, bộ xử lý nhảy từ chế độ người dùng (user mode) sang chế độ nhân (kernel mode) và cùng với đó, nó đổi không gian từ user land sang kernel land; và chỉ khi ấy, bảng vector ngắt và các dữ liệu hệ thống mới "hiện ra". Cho đến cuối năm 2017, các hệ điều hành không nhúng đều tổ chức kernel land bao hàm user land, đổi không gian đơn giản chỉ là mở rộng không gian. Từ đầu năm 2018 đến nay, do hàng loạt lỗi bảo mật trong bộ xử lý Intel được phát hiện, các hệ điều hành thay đổi rất nhiều, điều này có lẽ không còn đúng nữa. User mode và user land được bộ xử lý tái thiết lập ngay khi thi hành một lệnh return đặc biệt (IRET) trả điều khiển về ứng dụng.

    Tất nhiên, mình có thể sai.

    Trích dẫn Nguyên bản được gửi bởi emyeuvn Xem bài viết
    Nó có nhiều điểm tương đồng với hook. Bởi em nghĩ hook cũng chính là "Cài 1 hàm của chính ta vào trong 1 ngắt mềm(thay thế cái thủ tục có sẵn của windows) ".Nói chung là WINDOWS đã sử dụng 1 cái ngắt mềm nào đó(em chưa học) để lập lịch các thao tác còn ta thì lại cài cái ngắt đó đến thủ tục của ta trước khi nó callback lại hàm ban đầu của WInDOW.
    HOOK là 1 cách sử dụng 1 loại ngẳt tiêu chuẩn nào đó.Là con cháu chút chít chụt chịt của cái ngắt thời gian.(Không hẳn là ngắt thời gian)
    Đúng. Hook được hệ điều hành cung cấp, để ứng dụng khai thác cho dễ và an toàn (không gây nguy hiểm cho hệ điều hành hay ứng dụng khác).

    Trích dẫn Nguyên bản được gửi bởi emyeuvn Xem bài viết
    Em không bít trong C++ có cho nhúng mã assembler không. Chắc em phải tìm lại các tài liệu về Ngắt bằng ASSembler quá.

    Tiện thể mong anh chỉ dẫn thêm hoặc về Ngắt hoặc về HOOK và lập trình WINDOWS.
    Mình nghĩ là kho tài liệu MSDN (Microsoft) có mô tả đầy đủ các phương pháp làm việc với timer và hook ở cả mức phân hệ (Win32, POSIX, Linux) lẫn mức nền tảng (.NET).

    Còn về ngắt, tài liệu là của Intel.

    Rất tiếc, tất cả đều bằng tiếng Anh.
    Đã được chỉnh sửa lần cuối bởi Ada : 24-10-2018 lúc 06:37 PM. Lý do: Giải thích thêm về Windows
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  7. #7
    Ngày gia nhập
    08 2017
    Bài viết
    3,540

    1 - c/c++ cho phép nhúng hoặc liên kết với code asm. Trong cviet có vài bài viết demo về cái này rồi.
    2 - phong cách không nên nói chớt, nói ngọng, nói kiểu yêu thương, ẻo lả trong cộng đồng, trong công việc.

  8. #8
    Ngày gia nhập
    08 2018
    Nơi ở
    Online
    Bài viết
    4

    Em rút kinh nghiệm.Vậy hai anh nghĩ sao về lập trình driver. Em nghĩ chắc WInDOWS phải có công cụ nào đó cho họ phát triển các thiết bị mở rộng của họ phải không nào.

  9. #9
    Ngày gia nhập
    08 2017
    Bài viết
    3,540

    Nên trình bày cụ thể.

    Với những thiết bị ngoại vi hoặc một tính toán nào đó quá nhanh và không cần thiết phải hiện thị - tính tiếp trong khoảng t_min thì người ta cho nó ngủ (sleep).
    Lệnh kiểm soát ngủ cũng tốn, ảnh hưởng ít nhiều tới CPU.

  10. #10
    Ngày gia nhập
    08 2018
    Nơi ở
    Online
    Bài viết
    4

    Em Nghĩ driver như âm thanh là do bên thứ 3 cung cấp. Và có thể là nó được windows hỗ trợ để xử lý các ngắt. Em Nghĩ bảng vecto Ngắt sinh ra để đồng bộ các quá trình. Và như vậy rất có thể WinDows sẽ cung cấp cho chúng ta 1 phiên bản thu nhỏ các ngắt có thể sử dụng lắm chứ.
    Đó là câu hỏi của em. Em sẽ cố tự mình tìm hiểu thêm về HOOK và Timer trong MSDN như anh Ada đã chỉ dẫn. Trước khi chúng ta có thêm thông tin cho những câu hỏi mới.
    1 lần nữa Thank 2 anh. Em mới vô nên chưa bít đặt câu hỏi ở mục nào. Mong 2 anh thông cảm.
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn