PDA

View Full Version : Sự khác nhau về dùng delay_ms() và timer?


love_ac
09-10-2008, 05:28 PM
Trong lập trình c:về thời gian delay có sự khác nhau giữa sử dụng hàm sẵn có delay_ms(time) và sử dụng timer để tạo ra thời gian trễ không.Xin các bạn giúp giải đáp

namqn
09-10-2008, 07:12 PM
Trong lập trình c:về thời gian delay có sự khác nhau giữa sử dụng hàm sẵn có delay_ms(time) và sử dụng timer để tạo ra thời gian trễ không.Xin các bạn giúp giải đáp
- Hàm delay_ms() thường đếm cho đủ số chu kỳ cần thiết để tạo thời gian trễ, trong thời gian này CPU bận rộn đếm thời gian, không làm được việc gì khác

- Dùng timer, kiểu thứ nhất: cho timer đếm thời gian, còn CPU liên tục kiểm tra xem đủ thời gian trễ hay chưa, như vậy CPU cũng bận rộn, không làm được việc gì khác

- Dùng timer, kiểu thứ hai: cho timer đếm thời gian, CPU thường xuyên kiểm tra xem đủ thời gian hay chưa, trong lúc vẫn thực hiện các công việc khác (chẳng hạn, trong vòng lặp có lệnh kiểm tra xem cờ tràn timer đã bật hay chưa)

- Dùng timer, kiểu thứ ba: cho timer đếm thời gian, chỉ khi nào đủ thời gian chờ thì mới báo hiệu cho CPU xử lý (dùng ngắt timer)

Dùng hàm delay_ms() có thể tạo độ trễ rất chính xác (không có sai lệch, nếu code được viết tốt và tần số thực thi lệnh đủ lớn). Dùng timer kiểu thứ ba cũng có thể tính toán để có độ trễ rất chính xác (không có sai lệch đến sai lệch 1 chu kỳ máy). Dùng timer kiểu thứ hai có thể kém chính xác hơn dùng timer kiểu thứ nhất. Dùng timer kiểu thứ nhất có thể đạt sai lệch 1 chu kỳ thực thi lệnh.

Thân,

hopeman
10-10-2008, 01:37 PM
mình có 1 băn khoăn
khi mình dùng hàm delay_ms() của CCS và xử dụng nhiều ngắt, sai số là rất lớn
theo mình hiểu bản chẩ hàm này là cho CPU điên cuồng tính toán, và hoàn toàn có thể bị ngắt bởi các ngắt khác để làm việc khác nên tạo ra sai lệch. mình đã thử nghiệm delay_ms(500) với chip 4431 và dùng timer ở tần số 20KHz , thực tế bị delay mất khoảng 3s.
ko biết mình hiểu có đúng ko???

love_ac
10-10-2008, 02:38 PM
@hopeman:như anh Nam đã giải thích trên rồi đó.
Mình đồng ý với bạn về vấn đề hàm delay_ms() bị ngắt bởi các ngắt khác.Theo mình nghĩ thì hàm này được viết như sử dụng asm viết thời gian delay mà không động đến timer,chỉ sử dụng đến các thanh ghi thông thường thôi.Tuy nhiên kĩ thuật lập trình chỗ này có vẻ khá tốt vì mình mô phỏng thử thấy hàm này cho thời gian delay chính xác

thaithienanh
10-10-2008, 02:39 PM
mình có 1 băn khoăn
khi mình dùng hàm delay_ms() của CCS và xử dụng nhiều ngắt, sai số là rất lớn
theo mình hiểu bản chẩ hàm này là cho CPU điên cuồng tính toán, và hoàn toàn có thể bị ngắt bởi các ngắt khác để làm việc khác nên tạo ra sai lệch. mình đã thử nghiệm delay_ms(500) với chip 4431 và dùng timer ở tần số 20KHz , thực tế bị delay mất khoảng 3s.
ko biết mình hiểu có đúng ko???

Bản chất của Delay là thi hành lập lại nhiều lần câu lệnh rỗng với mục đích là "đốt thời gian" do mỗi lần CPU thực thi câu lệnh đó, vì vậy nó cũng tương tự như một vòng lặp đương nhiên sẽ bị tạm dừng khi có ngắt xảy ra :), khi sử dụng đồng thời delay và ngắt bạn chú ý đừng để nó xung đột với nhau kết quả chắc chắn là timer đảm bảo và delay thì không, bạn nên sử dụng nhiều ngắt và tính toán đặt mức ưu tiên hợp lý (hạn chế sử dụng delay thì sẽ đạt hiệu quả cao hơn).

Chúc vui :).