2009-03-19 23 views
9

Tôi có một cơ quan giám sát trong vi điều khiển của tôi rằng nếu nó không được khởi động, sẽ đặt lại bộ xử lý. Ứng dụng của tôi chạy tốt trong một thời gian nhưng cuối cùng sẽ thiết lập lại vì cơ quan giám sát đã không bị đá. Nếu tôi bước qua chương trình thì nó hoạt động tốt.Cách gỡ lỗi thời gian chờ của cơ quan giám sát

Một số cách để gỡ lỗi điều này là gì?

CHỈNH SỬA: Kết luận: Cách tôi tìm thấy lỗi của tôi là đường dẫn watchdog.

Tôi đang sử dụng PIC có vectơ ISR cao và thấp. Các vector cao được cho là để xử lý ma trận LED và vector thấp là để xử lý các đánh dấu hẹn giờ. Nhưng tôi đặt cả hai bộ xử lý ISR ​​trong vector cao. Vì vậy, khi tôi vô hiệu hóa ISR ma trận LED và bộ đếm thời gian đánh dấu dịch vụ ISR cần thiết, bộ xử lý sẽ bị kẹt trong ISR thấp để xử lý việc đánh dấu hẹn giờ, nhưng bộ đếm thời gian đánh dấu không có ở đó.

Đường dẫn giới hạn tìm kiếm của tôi xuống chức năng xử lý ma trận dẫn và vô hiệu hóa ngắt ma trận LED.

Trả lời

9

Thêm biến toàn cục chưa được khởi tạo được đặt thành các giá trị khác nhau trong toàn bộ mã. Cụ thể, đặt nó trước và sau các cuộc gọi chức năng chính.

Đặt điểm ngắt ở đầu chính.

Khi bộ xử lý đặt lại biến toàn cầu vẫn sẽ có giá trị cuối cùng được đặt thành. Tiếp tục thêm các "mẩu bánh mì" này để thu hẹp chức năng vấn đề.

+0

Chỉ cần thêm cho bất kỳ ai đến đây: Một "biến toàn cục chưa được khởi tạo" sẽ cần một số ngữ nghĩa đặc biệt với trình biên dịch C. Tiêu chuẩn nói rằng thậm chí các biến toàn cầu không được gán giá trị phải được khởi tạo bằng không. Vì vậy, thông thường, một thuộc tính sẽ cần thuộc tính cho các biến này, ví dụ: ".noinit" cho avr-gcc. – FourtyTwo

0

Câu hỏi mỗi giả định bạn thực hiện, hai lần:

  • Hãy chắc chắn rằng cơ quan giám sát đá (Tôi không biết các cơ sở khai thác gỗ trên bộ vi xử lý).
  • Đảm bảo cơ quan giám sát, khi được đá, không đặt lại bộ xử lý.

Và tự hỏi sự khác biệt giữa 'bước qua' và chạy một mình; ràng buộc thời gian chắc chắn sẽ quan trọng.

3

Nhiều phần mềm giám sát sẽ tự động bị vô hiệu hóa khi bạn đính kèm trình gỡ lỗi (để ngăn không cho trình gỡ lỗi khởi động lại trong khi trình gỡ lỗi đã tạm dừng ứng dụng).

Điều đó nói rằng, dưới đây là một số vấn đề cơ bản:

Đây có phải là ứng dụng đa luồng không? Bạn đang sử dụng bộ lập lịch RT? Nếu vậy, nhiệm vụ cơ quan giám sát của bạn có bị bỏ đói không?

Đảm bảo rằng tác vụ giám sát của bạn không thể bị kẹt trên bất kỳ thứ gì (đang chờ semaphore, đang đợi thư, v.v.). Đôi khi, chức năng có thể chặn theo những cách bạn có thể không mong đợi; Ví dụ, tôi có một nền tảng Linux tôi đang làm việc ngay bây giờ, nơi tôi có thể nhận được printf để chặn khá dễ dàng.

Nếu đó là chuỗi đơn lẻ, trình thu thập thông tin có thể giúp bạn xác định các vấn đề về thời gian.

Nếu đây là hệ thống mới, hãy đảm bảo cơ quan giám sát hoạt động chính xác; kiểm tra mã đơn giản mà chỉ cần truy cập WD và sau đó ngủ trong một vòng lặp vô hạn.

+1

+1 cho đoạn đầu tiên nói riêng. –

+0

giây cho bạn! :) Bất cứ khi nào bảng mô phỏng mới đến để gỡ lỗi, điều đầu tiên tôi chắc chắn là đơn vị WD bị cắt bỏ! –

2

Tôi sử dụng chương trình dựa trên trạng thái và mẹo tôi luôn muốn sử dụng là đặt trước một cổng đầu ra cho trạng thái hiện tại theo dạng nhị phân.Sau đó kết nối một máy phân tích logic và xem thời gian của các thay đổi trạng thái. Bạn có thể làm một cái gì đó tương tự ở đây: Làm những gì Robert nói và tạo ra một biến toàn cầu và thay đổi giá trị của nó tại các điểm chính - tốt nhất là với một hàm ngay lập tức đặt giá trị của cổng cho trạng thái hiện tại (tức là changeState (nextState);) trạng thái khi bạn nhập hàm khởi động con chó, sau đó thay đổi nó về trạng thái trước đó trước khi bạn rời khỏi hàm. Bạn sẽ có thể nhìn thấy từ những chức năng nó KHÔNG được đá và sau đó bạn có thể làm việc trên những chức năng đó.

Chúc may mắn, có vẻ như vấn đề về thời gian và những vấn đề khó giải quyết.

1

Thông thường, chuỗi nhiệm vụ/trình theo dõi chạy ở mức độ ưu tiên thấp. Vì vậy, nếu cơ quan giám sát không bị đá, điều này là do bộ vi xử lý đang bận làm điều gì đó khác - có thể là điều mà nó không nên làm.

Sẽ rất hữu ích khi loại bỏ ngữ cảnh thực thi (ngăn xếp cục bộ, trạng thái lập lịch, v.v.) cho mỗi tác vụ/luồng ngay trước khi bộ xử lý đặt lại. Với một chút may mắn và công việc, bạn sẽ có thể xác định những gì đang ngăn chặn nhiệm vụ watchdog từ kicking bộ đếm thời gian.

1

Tôi muốn sử dụng thêm pin đầu ra, đặt cao rồi thấp tại các điểm thích hợp trong mã để giới hạn phạm vi của nơi tôi đang tìm kiếm. Sau đó, tôi sẽ theo dõi nó trên một phạm vi kỹ thuật số hoặc phân tích logic. Điều này tương đương với các phương pháp breadcrumbs được đề cập bởi một poster khác, nhưng bạn sẽ có thể thời gian tương quan với xung reset tốt hơn nhiều.

0

Bạn có thể chèn một vòng lặp while trong mã của mình và bật/tắt đèn LED bên trong vòng lặp while. Đây là cách hiệu quả để kiểm tra xem bảng có được đặt lại hay không.

Các vấn đề liên quan