Tại sao có một đồng hồ trong arduino của tôi?


9

Tất nhiên tôi biết nó là hữu ích để kiểm soát thời gian trì hoãn, nhưng sử dụng nào khác?

Với đồng hồ 16Mhz, mỗi dòng chương trình của tôi sẽ mất 1/16000000 giây, phải không?

thậm chí một dòng rất lớn sẽ chỉ mất 1/16000000 của một giây?

Với xung nhịp 8 MHz, mỗi dòng sẽ mất gấp đôi thời gian, phải không? Vì vậy, toàn bộ "vòng lặp chính" cũng sẽ mất gấp đôi thời gian, phải không?


3
Bạn đang nhầm lẫn giữa hướng dẫn C và hướng dẫn máy (lắp ráp). Nhưng ngay cả khi bạn đã viết trực tiếp trong hội đồng, bạn có thể tìm thấy việc sử dụng tốt điều đó bởi vì chương trình KHÔNG tuyến tính. Ý tôi là, ngắt, như tên cho thấy, làm gián đoạn dòng mã bình thường bằng cách đi theo một hướng dẫn khác và sau đó tiếp tục. Vì vậy, có thể giữa một dòng và dòng tiếp theo, nó buộc phải thực thi ISR, có thể rất dài
frarugi87

2
Nếu bạn đồng hồ chip của bạn ở tám millihertz, ngay cả dòng mã đơn giản nhất cũng sẽ mất mãi mãi. Tôi đề nghị bạn sử dụng đồng hồ trong phạm vi mega hertz (MHz).
Edgar Bonet

Số lượng chu trình cần thiết để thực hiện mỗi lệnh máy được nêu trong Hướng dẫn cài đặt lệnh .
Edgar Bonet

Chết tiệt, tôi nên đi ngủ;), chỉnh sửa cảm ơn
n0tis

Câu trả lời:


13

Tại sao có một đồng hồ trong arduino của tôi?

Bởi vì đó là cách máy tính và vi điều khiển, v.v., hoạt động.

Với đồng hồ 16 MHz, mỗi dòng chương trình của tôi sẽ mất 1/16000000 giây, phải không?

Không.

thậm chí một dòng rất lớn sẽ chỉ mất 1/16000000 của một giây?

Không.

Đồng hồ xác định tốc độ mà các hướng dẫn mã máy được lấy từ bộ nhớ và được thực thi. Hầu hết các hướng dẫn mất 1 chu kỳ đồng hồ, nhưng một số mất nhiều hơn.

Một dòng mã C có thể được biên dịch thành bất kỳ số lượng hướng dẫn lắp ráp nào, sau đó được chuyển đổi thành mã máy (số nguyên). Đó có thể là bất cứ nơi nào từ 1 hướng dẫn lắp ráp đến hàng ngàn hướng dẫn lắp ráp, tùy thuộc vào những gì dòng làm.

Với xung nhịp 8 MHz, mỗi dòng sẽ mất gấp đôi thời gian, phải không? Vì vậy, toàn bộ "vòng lặp chính" cũng sẽ mất gấp đôi thời gian, phải không?

Mọi hoạt động trong chip đều được điều chỉnh bởi đồng hồ. Nếu đồng hồ bằng một nửa tốc độ thì chip đang chạy với tốc độ bằng một nửa, do đó, mọi thao tác sẽ mất gấp đôi thời gian, vâng.


Ngoài ra, ngắt.
njzk2

1
Mã khóa nhỏ: Nên là "... bất cứ nơi nào từ 0 hướng dẫn lắp ráp ...", ngay cả khi không có trình tối ưu hóa, nhưng thậm chí còn nhiều hơn sau khi tối ưu hóa.
Peter

2
Đừng nhầm lẫn cậu bé nghèo. Anh ấy đang có một thời gian đủ khó khăn như nó là.
Majenko

@Majenko: sự nhầm lẫn là một điều cần thiết. CNTT là khó.
intelfx

@intelfx "CNTT"? Đây là lập trình, không phải CNTT ....
BalinKingOfMoria Tái lập CM

10

Không được trả lời trong bài đăng của @ Majenko: Có, với đồng hồ 8 MHz, mỗi dòng sẽ mất gấp đôi thời gian. Trừ khi dòng chờ đợi một cái gì đó không phải là đồng hồ điều khiển - ví dụ đầu vào bên ngoài.

Ngoài câu trả lời của @ Majenko, CPU còn có đồng hồ để đảm bảo các hướng dẫn được hoàn thành, trước khi bước tiếp theo bắt đầu. Một CPU được tạo ra từ rất nhiều bóng bán dẫn (tôi đã tìm thấy một tài liệu tham khảo cho thấy AtMega nằm trong phạm vi hàng triệu thấp, cho hoặc nhận một thứ tự cường độ).

Trong một chu kỳ, dòng điện chạy qua chip, bật / tắt bóng bán dẫn, kết quả của nó sẽ bật / tắt nhiều bóng bán dẫn hơn, và tiếp tục xuống dòng. Trong khi điều này đang xảy ra, một số phần của chip có giá trị "sai" - bạn có thể nghĩ đây là một nửa tính toán (bạn đã thêm cột một và cột 10 giây và sắp bắt đầu Cột 100s). Bạn không muốn điều này ảnh hưởng đến thế giới bên ngoài, vì vậy (ví dụ) các chân đầu ra của bạn được chốt - được giữ ở bất kỳ giá trị nào - cho đến khi hướng dẫn hoàn tất. Mất bao lâu để hoàn thành một hướng dẫn khác nhau, nhưng nhà sản xuất thực hiện hướng dẫn chậm nhất trong những trường hợp xấu nhất.

Đối với AtMega (là chip trên Arduino), Atmel (người thiết kế chip) đã tuyên bố đây là 1 / 20.000.000 của một giây - đây là 20 MHz.

Lưu ý rằng không phải tất cả các bộ vi xử lý đều chạy tất cả các hướng dẫn của chúng ở 1 lệnh trên mỗi chu kỳ - một số hướng dẫn có thể mất 1, hoặc 2 hoặc 10 chu kỳ. Pipelining làm cho mọi thứ trở nên phức tạp hơn - bộ xử lý có thể thực hiện một số công việc (ví dụ: tìm nạp lệnh tiếp theo) trong một chu kỳ, thực hiện nó trong lần tiếp theo - nhưng trong khi thực hiện lệnh 1, nó cũng có thể tìm nạp lệnh tiếp theo. Để làm điều này, có thể cần phải đoán xem hướng dẫn nào tiếp theo (trong trường hợp mã máy tương đương với "goto" - như vậy được sử dụng cho các vòng lặp) và nếu nó đoán sai, nó phải đối phó với cái đó; vứt bỏ lệnh mà nó lấy và lấy cái tiếp theo, mất một chu kỳ.

Trang Wikipedia về đường ống dẫn lệnh cho thấy một ví dụ về đường ống chip RISC trong 5 giai đoạn - tìm nạp lệnh, giải mã lệnh, thực thi, truy cập bộ nhớ và ghi lại. Vì vậy, bạn có thể có 5 hướng dẫn ở một số giai đoạn thực hiện, chồng chéo. Cho đến giai đoạn "viết lại", các hướng dẫn không có hiệu lực thực sự. Bạn có thể coi đây là một dây chuyền lắp ráp - mất 7 phút để đặt một widget với nhau, nhưng nó có thể được chia thành 5 giai đoạn, giai đoạn dài nhất mất 2 phút. Cứ sau hai phút, mỗi widget hoàn thành một phần sẽ được di chuyển bởi dây chuyền lắp ráp đến trạm tiếp theo. Bạn nhận được một tiện ích sau mỗi hai phút - "Đồng hồ" chỉ có thể đánh dấu nhanh như bước chậm nhất. Nếu bạn đẩy widget ra nhanh hơn, "nút cổ chai" sẽ ngày càng có nhiều widget xếp hàng.


AVR có một đường ống rất nông: chỉ tìm nạp và thực thi. Sau đó, các bước nhảy có điều kiện thực hiện một chu kỳ (nhảy không được thực hiện) hoặc hai chu kỳ (nhảy thực hiện).
Edgar Bonet

Biến chứng bổ sung: nhớ cache.
Martín-Blas Pérez Pinilla

Có nhiều điều tôi đã không đề cập đến: bộ đệm (thuộc bất kỳ loại nào), đa luồng, đa lõi ... Có lẽ tôi đã đi quá sâu vào bài viết của mình.
AMADANON Inc.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.