Tư vấn: 0979.466.469 / 0938.128.290

MENU

7 cách làm arduino bị treo và cách ngăn ngừa

Báo giá đặt hàng nhập

Để giúp các bạn ngăn Arduino gặp sự cố hoặc bị treo, Điện Tử Tương Lai sẽ giới thiệu tất cả các cách Arduino có thể gặp sự cố, treo, reset, đóng băng, ngừng chạy mã hoặc làm điều gì đó kỳ lạ. Chúng tôi đã tổng hợp lại thành một hướng dẫn về cách Arduino gặp sự cố hoặc treo và cách bạn có thể ngăn chặn điều này xảy ra với mình.

 

  1. Gọi quá nhiều hàm

Gọi quá nhiều hàm, chẳng hạn như trong một vòng lặp đệ quy, có thể khiến Arduino gặp sự cố và reset. Từ một thử nghiệm được tiến hành, lỗi này có thể xảy ra sau khoảng 300 lần gọi hàm. Việc có các hàm có nhiều biến cục bộ hoặc các biến cục bộ lớn, làm giảm số lượng lệnh gọi hàm có thể được thực hiện trước khi Arduino reset. Một vòng lặp đệ quy các hàm là cách có nhiều khả năng nhất để đạt đến giới hạn hàm này.

Mỗi lệnh gọi hàm tiêu thụ một số bộ nhớ của Arduino; khi Arduino hết bộ nhớ cho các hàm, nó thường reset (giống như nút khởi động lại bên ngoài đã được nhấn) và chạy lại setup().

Các model Arduino có nhiều bộ nhớ có thể sẽ cho phép nhiều lệnh gọi hàm. Các model Arduino có ít bộ nhớ có thể sẽ cho phép các lệnh gọi hàm ít hơn.

 

Để ngăn Arduino gặp sự cố do quá nhiều lệnh gọi hàm:

 

Nếu sử dụng các hàm đệ quy, hãy đảm bảo điều kiện để kết thúc đệ quy không mất quá nhiều thời gian để xảy ra.

Thay vào đó, hãy cân nhắc sử dụng vòng lặp for hoặc while, hầu hết các ứng dụng Arduino không cần hàm đệ quy.

Giảm số lượng biến cục bộ trong hàm. Nếu một hàm đệ quy phải được sử dụng, việc giảm số lượng biến cục bộ sẽ cho phép nhiều lệnh gọi hàm hơn để phù hợp với bộ nhớ Arduino.

 

  1. Phân bổ quá nhiều bộ nhớ

Nếu Arduino hết bộ nhớ, nó có thể bị sập, bị kẹt hoặc hoạt động theo cách không thể đoán trước. Cách dễ nhất để Adruino hết bộ nhớ là cấp phát quá nhiều biến hoặc quá nhiều không gian cho các biến, chẳng hạn như bằng cách sử dụng hàm malloc(). Cũng có thể hết bộ nhớ khi sử dụng các lệnh gọi hàm (như mô tả ở trên).

 

Để ngăn Arduino gặp sự cố do hết bộ nhớ:

 

Khai báo các biến trong một hàm khi chuẩn bị sketch, đối với hầu hết các dự án Arduino, có thể tính toán các biến cần thiết khi viết mã; trình biên dịch sẽ cảnh báo bạn nếu chúng quá lớn;

Tránh sử dụng malloc();

Sử dụng free () nếu không thể tránh khỏi việc sử dụng malloc(), sketch vẫn có thể hết bộ nhớ mặc dù sử dụng free() (do triển khai malloc()) nhưng ít khả năng hơn.

 

  1. Bị mắc kẹt trong một vòng lặp vô hạn

Arduino có thể bị treo nếu nó bị mắc kẹt trong một vòng lặp vô hạn khiến nó không thể thực thi mã khác. Điều này thường xảy ra khi mã đang kiểm tra một điều kiện vòng lặp sẽ luôn kết thúc đúng.

Về mặt kỹ thuật, Arduino luôn chạy một vòng lặp vô hạn (hàm void loop()), nhưng Arduino có thể bị treo nếu nó bị mắc kẹt trong một vòng lặp mà bạn không cố ý. Không giống như PC, Arduino thường không có khả năng thực thi hai chương trình cùng một lúc. Điều này có nghĩa là nếu một sketch bị mắc kẹt trong một vòng lặp, toàn bộ Arduino thường sẽ ngừng thực hiện bất kỳ tác vụ nào khác.

 

Các hàm đệ quy, đã đề cập ở trên cũng là một loại vòng lặp vô hạn. Ngoài đệ quy trong đó một hàm tự gọi, các hàm cũng có thể gọi nhau trong một vòng lặp.

 

Để ngăn vòng lặp vô hạn:

 

Đọc qua dòng mã của bạn và đảm bảo các điều kiện để thoát khỏi vòng lặp vô hạn.

Lập kế hoạch các điều kiện mà các hàm sẽ được gọi, cố gắng tránh một vòng lặp vô hạn của các hàm.

Sử dụng các hàm gọi lại và ngắt thay vì chờ đợi trong một vòng lặp cho đến khi điều gì đó xảy ra (xem cách xử lý ngắt bên dưới)

 

  1. Chờ một hàm trả kết quả

Arduino có thể bị treo khi nó đang đợi một hàm thư viện thực thi. Khi Arduino đang đợi một hàm thực thi, nó thường không thể xử lý mã khác. 

 

Hàm phổ biến nhất hay xảy ra là Serial.available(). Nhiều người sử dụng điều này như điều kiện trên một vòng lặp có nghĩa là Arduino sẽ bị mắc kẹt trong vòng lặp cho đến khi có kết nối nối tiếp; nếu không có kết nối, Arduino sẽ không thực thi bất kỳ mã nào khác.

 

Để giảm khả năng các lệnh gọi hàm sẽ gặp sự cố hoặc treo Arduino:

 

Đảm bảo rằng Arduino có thể thoát khỏi các vòng lặp vô hạn;

 

  1. Xử lý ngắt không chính xác

Arduino có thể bị treo nếu nó liên tục cung cấp các ngắt thay vì thực thi mã chính của nó. Nếu bộ xử lý liên tục nhảy để ngắt các quy trình dịch vụ, nó sẽ không thể hoàn thành các tác vụ khác và sẽ bị treo.

Quảng cáo đặt hàng nhập

 

Luồng thực thi điển hình cho một ngắt là:

 

Đăng ký một hàm xử lý ngắt cho một sự kiện cụ thể trong setup() (hàm này sẽ được thực thi bởi bộ xử lý khi sự kiện xảy ra);

Arduino thực hiện loop() của nó;

Sự kiện xảy ra và Arduino sẽ thực hiện chức năng xử lý ngắt;

Arduino quay trở lại thực thi loop().

 

Nếu Arduino bị tràn các ngắt trước khi nó có thể xử lý xong, nó có thể không bao giờ xử lý xong và sẽ bị treo.

 

Để giảm thiểu nguy cơ treo Arduino khi quá trình xử lý bị gián đoạn:

 

Dành càng ít thời gian xử lý ngắt càng tốt, giảm thiểu mã trong chức năng xử lý ngắt;

Xem xét tính nguyên tử của việc sửa đổi các biến khi xử lý một ngắt, có thể ngắt một trình xử lý ngắt với cùng một ngắt ;

Thay vì bật và tắt ngắt, hãy cân nhắc lưu trạng thái của thanh ghi của bộ xử lý, tắt ngắt, sau đó khôi phục trạng thái của thanh ghi, điều này ngăn việc vô tình bật lại ngắt khi chúng nên tắt (bởi một trình xử lý khác).

 

  1. Nguồn yếu

Arduino sẽ gặp sự cố và reset nếu điện áp đầu vào giảm xuống dưới một mức nhất định. Một cảnh báo có thể được cấu hình để bắt đầu thực hiện chức năng xử lý ngắt khi điện áp bắt đầu giảm; khi nguồn yếu, Arduino sẽ gặp sự cố và reset.

 

Nguồn yếu thường xảy ra khi điện áp nguồn giảm đáng kể và liên tục, nằm ngoài mức chịu đựng của Arduino. Điều này có thể do:

 

Nếu Arduino đang chạy bằng pin, pin sẽ hết

Nhiễu đáng kể hoặc gián đoạn nguồn điện

Dòng điện đột ngột do một thiết bị khác được định cấu hình không chính xác để chia sẻ nguồn với Arduino (ví dụ: động cơ được cấu hình kém)

Các mức đầu vào điện áp khác nhau tùy theo kiểu Arduino: Ví dụ, họ UNO thường là 7V đến 12V (hoặc USB 5V) trong khi họ MKR là 5V.

 

Hầu hết các bo Arduino, chắc chắn là những bo do chính Arduino sản xuất, đều có các mạch quản lý nguồn chất lượng tốt (chẳng hạn như bộ điều chỉnh điện áp) được tích hợp sẵn trong bo. Miễn là bạn tuân thủ các yêu cầu về điện áp trên datasheet và cung cấp đủ dòng điện, thì sẽ không có vấn đề gì xảy ra.

 

Để tránh việc reset Arduino do nguồn yếu:

 

Cung cấp nguồn điện ổn định, hầu hết các thiết bị cung cấp điện thương mại (bao gồm cả bộ sạc điện thoại) trong thông số kỹ thuật tương thích sẽ hoạt động;

Hãy cẩn thận khi kết nối các thành phần mạch sử dụng nhiều dòng điện (ví dụ: động cơ) với cùng một nguồn điện áp mà Arduino sử dụng, dòng điện đột ngột có thể làm gián đoạn nguồn cung cấp của Arduino.

 

  1. Watchdog timer được định cấu hình không chính xác

Arduino sẽ reset nếu watchdog timer đã được bật và đạt đến cuối khoảng thời gian đếm ngược của nó mà không bị xóa bằng mã. Nếu Arduino không xóa được watchdog timer trước khi hết thời gian, thì nó sẽ khởi động lại Arduino.

 

Quên xóa watchdog timer trong mã hoặc không thực hiện đủ thường xuyên, có thể dẫn đến sự cố Arduino xuất hiện.

 

Làm thế nào để biết Arduino vẫn thực thi mã chính xác

Để chứng minh rằng Arduino vẫn đang thực thi mã chính xác, một quy trình nhịp tim thường được sử dụng. Nhịp tim cho Arduino là sự nhấp nháy của đèn LED theo một mẫu cố định, sao cho có thể quan sát thấy rằng nếu đèn LED không tuân theo mẫu đó thì tức là Arduino không thực thi mã một cách chính xác.

 

Nếu một đèn LED báo nhịp tim được mã hóa nhưng nó không nhấp nháy, thì Arduino đã bị lỗi hoặc bị treo. Kiểu đèn flash rất quan trọng vì Arduino bị mắc kẹt trong vòng lặp khởi động lại (ví dụ: nhờ watchdog timer) có thể vẫn nhấp nháy đèn LED, nhưng sai kiểu.

Gia công pcb 932*150
Sản phẩm nổi bật
Sale 0%
23000 /Cái
/ Cái

Code: 7206-013 Còn hàng

Lưu xem sau
Sale 0%
PIC16 PIC16F Microcontroller IC 8-Bit 20MHz 7KB...
44000 /Cái
/ Cái

Code: 7204-076 Còn hàng

Lưu xem sau
Sale 0%
39000 - 45000 /Cái
/ Cái

Code: 7202-065 Còn hàng

Lưu xem sau
Sale 0%
145000 /Cái
/ Cái

Code: M-7006-010 Còn hàng

Lưu xem sau
Hỗ trợ liên kết
0979466469
0899909838
0938128290
0899909838
Khiếu nại: 0964238397
0979466469
0868565469
0868565469

Hotline: 0979 466 469

Loading
0964238397
Bạn cần linh kiện mẫu ? 7-11 ngày