Bỏ phiếu hoặc hẹn giờ ngắt?


8

Chúng tôi hy vọng sẽ xây dựng một robot theo dõi dòng đơn giản và chúng tôi gặp vấn đề khi chúng tôi thảo luận về lập trình PIC.

Chúng tôi dự định viết một vòng lặp vô tận, kiểm tra việc đọc bảng cảm biến và thực hiện các công việc liên quan cho việc đọc đó.

Nhưng một trong những người bạn của chúng tôi bảo chúng tôi sử dụng ngắt hẹn giờ để tạo ra các ngắt trong các khoảng thời gian xác định và trong mỗi ngắt kiểm tra bảng đọc cảm biến và thực hiện các công việc liên quan cho việc đọc đó.

Nhưng chúng ta không thể tìm ra cái nào là tốt nhất: vòng lặp vô tận trong phương thức chính HOẶC phương thức ngắt hẹn giờ.

Cách tốt nhất là gì, và tại sao?


1
Bạn quên hỏi "có cách nào tốt nhất không?" Đối với một hệ thống đơn giản, đôi khi tốt nhất là sử dụng phần cứng hẹn giờ để đặt cờ, sau đó chạy vòng điều khiển của bạn khi cờ được đặt. Đối với một hệ thống phức tạp, các ISR (và thường là một số loại nhân hệ điều hành hoặc ít nhất là một trình chuyển đổi tác vụ) thường là tốt nhất.
TimWescott

Câu trả lời:


8

Bộ xử lý phải thực thi một cái gì đó. Bạn sẽ luôn có một vòng lặp "vô tận" ngay cả khi bạn đang thực hiện một số công việc trong trình xử lý ngắt.

Giải pháp tốt nhất phụ thuộc vào chính xác những gì bạn đang cố gắng làm.

Ưu điểm chính của việc sử dụng các ngắt là chúng cho phép bạn phục vụ các sự kiện trong thời gian thực trong khi chương trình chính của bạn đang làm một việc khác. Ngắt hẹn giờ đặc biệt cho phép bạn thực hiện một số hoạt động định kỳ trên cơ sở thời gian khá chính xác trong khi thực hiện một số xử lý khác.

Đối với hầu hết các thuật toán điều khiển, sẽ rất hữu ích khi có một số loại cơ sở thời gian (hoặc tần số cố định). Nếu đó là tất cả CPU của bạn đang làm, bạn có thể dễ dàng làm điều đó mà không bị gián đoạn bằng cách kiểm soát số chu kỳ / hướng dẫn trong vòng điều khiển hoặc bỏ phiếu hẹn giờ. Cả hai phương pháp sẽ đơn giản và hiệu quả hơn so với sử dụng ngắt. Ngắt là hữu ích hơn trong các hệ thống phức tạp hơn làm nhiều việc đồng thời (I / O, giữ thời gian, lập lịch, v.v.).

Nếu bạn đi với vòng lặp vô tận mà không bỏ phiếu hẹn giờ hoặc hiệu chỉnh thời gian cần thiết để chạy một vòng lặp của vòng lặp, bạn sẽ phải cẩn thận với các tình huống trong đó việc thêm nhiều mã trong vòng lặp của bạn sẽ thay đổi thời gian và hành vi của hệ thống điều khiển của bạn.

Nếu bạn thực hiện thuật toán điều khiển của mình trong ngắt hẹn giờ, bạn sẽ phải cẩn thận, bạn không cố thực hiện nhiều công việc hơn CPU có thể xử lý trong một "khe" một lần hoặc điều đó sẽ lại ảnh hưởng đến hành vi của hệ thống điều khiển của bạn.


4

Hơn nữa với câu trả lời của Guy, sử dụng ngắt hẹn giờ để tạo ra các khoảng chính xác sẽ tăng thêm tính xác định.

Ví dụ, tại bất kỳ thời điểm nào, bạn đều biết chính xác bộ xử lý đang làm gì và tất cả các hoạt động được thực hiện ở mức giá được chỉ định.

Bạn cũng nên lên lịch ở các mức xác định vì nếu không, bạn không có cơ sở cho các hằng số thời gian và như vậy, điều này sẽ rất cần thiết trong quá trình lọc của bạn.

Và cuối cùng, điều này có nghĩa là nếu bạn thêm các tác vụ bổ sung, thì các tác vụ hiện tại sẽ không bị chậm lại.


Bỏ phiếu đơn giản là ổn nếu đó là tất cả hệ thống của bạn phải làm - nhưng trong khi lập lịch thời gian là một chi phí nhỏ trong một hệ thống tầm thường, việc thêm nó từ đầu cho phép tăng trưởng và mở rộng mà không phải cơ cấu lại mọi thứ sau này.


Trong một số tình huống, bạn có thể nhận được hiệu suất xác định nhiều hơn từ một vòng lặp hơn là bạn có thể từ các ngắt. Xuống một chu kỳ jitter. Nếu tất cả những gì bạn đang làm là một điều ...
Guy Sirton

4

Tôi chỉ muốn thêm vài điểm vào bài viết khác. Ý kiến ​​cá nhân của tôi là vòng lặp while vô tận không có ý nghĩa trong các hệ thống đọc từ snsors hoặc viết cho các bộ truyền động vì cả hai đều có một số ràng buộc vật lý, ví dụ. Không có điểm nào trong việc đọc từ các cảm biến ở mức 1Mhz nếu cảm biến có chu kỳ ổn định trước khi dịch bệnh chính xác ở 100Hz. Cùng đi đến trình điều khiển động cơ. Bạn có thể gửi hướng dẫn 1mil để di chuyển động cơ nhưng nó chỉ có thể hiểu được các giới hạn vật lý của nó đối với quán tính.

Những gì tôi làm trong thiết kế của tôi là sau. Tôi tạo ra bộ đếm thời gian ngắt kích hoạt cứ sau 1ms hoặc sau đó tôi giảm một số biến toàn cục trong thói quen ngắt đó. Trong vòng lặp while chính tôi kiểm tra xem biến có bằng 0 không và thực thi lệnh được xác định bởi biến đó. Trong trường hợp đó tôi có thể điều khiển động cơ ở tần số 125Hz, đọc cảm biến ở 20Hz và đèn led đầu ra ở mức 0,5Hz.

Tôi hy vọng bạn có điểm.


3

Tôi cũng muốn nhấn mạnh rằng việc so sánh giữa bỏ phiếu (nghĩa là kiểm tra xem cờ ngắt đã được đặt chưa) và các vectơ ngắt (tức là ISR, hoặc hàm được tải khi xảy ra gián đoạn) không chỉ đơn thuần là đánh giá hiệu quả / đơn giản thực hiện một khối mã phản động. Các bộ điều khiển ngắt của hầu hết các máy vi tính hiện đại có khả năng nhiều hơn nữa, đặc biệt là khi xem xét tín hiệu liên ngoại vi (tức là DMA).

Ví dụ, bộ vi điều khiển TMS320F28335 của Texas Cụ cho phép bạn kích hoạt xung bắt đầu chuyển đổi ADC của bạn trực tiếp từ cạnh tăng hoặc giảm của PWM . Ngoài ra, micro còn có bộ điều khiển DMA sáu kênh, ví dụ, cũng có thể được lập trình để kích hoạt cùng một tín hiệu PWM (điều này có thể cho phép bạn bắt đầu đọc bộ nhớ thông qua bus song song của thiết bị, ví dụ, được kết nối với bộ chuyển đổi sigma delta tốc độ cao). Bộ điều khiển DMA tương tự sau đó có thể được sử dụng để đệm các giá trị được đọc từ ADC và sigma delta bên ngoài vào RAM bên trong. Bộ điều khiển DMA sau đó có thể được cấu hình để chỉ kích hoạt một thói quen dịch vụ ngắt thông thường sau khi lấy mẫu tổng cộng 128 lần đọc ADC và delta sigma. Tất cả điều này sẽ xảy ra mà không có sự can thiệp của CPU (giải phóng bạn để làm những việc khác).

Kiểu kích hoạt hậu trường này cho phép bạn hoàn thành công việc nhiều hơn so với khi bạn có ISR kiểm soát tất cả các cờ kích hoạt hoặc đọc bộ nhớ (do chi phí liên quan đến độ trễ ngắt ). Cách tiếp cận chuỗi vector sẽ cho phép bạn lấy mẫu tại (giả sử) 50 KHz, trong đó cách tiếp cận theo định hướng ISR sẽ chỉ cho phép bạn lấy mẫu tại (giả sử) 5 KHz.

Cũng như Andrew đã nêu, sử dụng các vectơ ngắt có tính xác định hoặc lặp lại nhiều hơn nhiều so với việc bỏ phiếu một thanh ghi trạng thái.

Tôi cũng khuyên bạn nên đăng ký vào blog của Phil Koopman hoặc ít nhất là đọc các bài viết sau:


1

Bài cũ, vẫn trả lời cho người khác tham khảo.

Tôi đang làm việc trên một dự án tương tự. Ngay cả với tôi một người bạn đã đề nghị sử dụng bộ đếm thời gian.

Cuối cùng, đề nghị của tôi là sử dụng bộ điều khiển tốc độ cao nhất có thể (của tôi là 80 MHz). Sử dụng ngắt 5us Timer (Bộ lập lịch). Thực hiện như sau trong Thường trình ngắt lịch trình này:

  1. Kiểm tra viên ()
  2. ClockActuators () (nếu sử dụng Steppers sau đó làm cho tất cả các chân Clk ở mức thấp ban đầu và sau đó tăng Clk cho bất kỳ động cơ nào cần chạy)
  3. StateChange () / ApplicationRoutine () / SwitchContext () (để biết thêm thông tin về State Machine tham khảo: https://barrgroup.com/Embedded-Systems/How-To/State-Machines-Event-Driven-Systems ) (để được thẳng thắn , không thể tiêu hóa phần kết thúc của bài viết nhưng có ý tưởng. Tôi đang sử dụng Switch Case đơn giản trong StateChange ().)

Trong vòng lặp while (1) của main ():

  1. Kiểm tra đầu vào từ Bàn phím / Màn hình cảm ứng / Comm nối tiếp, v.v.
  2. Cập nhật màn hình (Nếu quá lâu và làm cho phản hồi Bàn phím chậm thì hãy thử đặt bước trên, tức là kiểm tra bàn phím / cảm ứng / nối tiếp bị gián đoạn.)

Chào mừng bạn đến với Robotics, Krishnananda Hegde. Có vẻ như bạn có thể đã vô tình tạo ra hai tài khoản (Krishnananda Hegde & Krishnananda. K. Hegde). Stack Exchange chỉ cho phép một cá nhân chủ động sử dụng một tài khoản, vì vậy vui lòng làm theo hướng dẫn tại Tôi vô tình tạo hai tài khoản; Làm thế nào để tôi hợp nhất chúng? Đáng buồn là người kiểm duyệt không thể hợp nhất tài khoản cho bạn, nhưng có thể xóa tài khoản mà họ cho là sock con rối .
Gian hàng Mark

0

Mặc dù sử dụng bỏ phiếu hoặc Ngắt sẽ không gây ra bất kỳ thay đổi đáng kể nào trong rô bốt theo dõi dòng đơn giản, nhưng sử dụng Ngắt thường rất tốt.

Mặc dù Ngắt hẹn giờ được sử dụng rất tốt trong một số trường hợp nhưng tôi đề nghị, trong trường hợp này, bạn có thể sử dụng Ngắt đơn giản được kích hoạt khi đầu vào cụ thể đến từ cảm biến (như màu trắng được phát hiện và cảm biến cho logic cao). Làm điều này bạn sẽ chắc chắn về chính xác những gì vi điều khiển của bạn đang làm khi nó gặp phải các bản vá trắng. Ngoài ra, có ít nhất độ trễ giữa việc nhận đầu vào và thực hiện đầu ra tương ứng.

Mặc dù, trong trường hợp theo dõi dòng đơn giản, bạn có thể chỉ cần ngắt và tiếp tục bỏ phiếu. Nhưng nếu bạn đang đa nhiệm với robot của mình (như có nhiều cảm biến để kích hoạt nhiều thứ khác nhau) thì có lẽ bạn sẽ cần ngắt. Một lợi ích nữa là bạn có thể thiết lập mức độ ưu tiên cho các sự kiện này bị gián đoạn. Giống như những gì sẽ xảy ra nếu bạn đang thực hiện nhiệm vụ A và một ngắt xuất hiện và yêu cầu thực hiện nhiệm vụ B. Bạn có thể làm cho một trong số chúng quan trọng hơn bằng cách đặt một trong số chúng thành ưu tiên cao hơn. Làm điều này, hành động với ưu tiên nhiều hơn sẽ được hoàn thành đầu tiên.

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.