Tất cả các bẫy luôn luôn phải được xác định?


18

Bây giờ tôi đã thấy hai trường hợp với DSPIC 30F4013 trong đó bộ điều khiển được đặt lại do một cái bẫy không xác định. Tại sao những cái bẫy này đã được nâng lên ở nơi đầu tiên vẫn còn là một bí ẩn, nhưng đó không phải là câu hỏi ngay lập tức của tôi. Tôi bắt đầu nghĩ rằng sẽ luôn là một thực hành lập trình tốt để luôn xác định tất cả các bẫy, ngay cả khi bẫy không bao giờ xảy ra, vì vậy tôi nhận được ít nhất một thông báo lỗi rõ ràng thay vì đặt lại ngẫu nhiên. Đây có phải là một thực hành tiêu chuẩn mà tôi không biết? Có những bất lợi cho thực hành này tôi nên xem xét?


4
Không phải là một câu trả lời cho câu hỏi của bạn, nhưng tôi đã chịu đựng những loại triệu chứng đó trên các hệ thống DSPIC & PIC24 cách đây ít lâu. Trong trường hợp của tôi, các bẫy dẫn đến từ các bit mã trong đó tôi đã hủy tham chiếu các con trỏ thành các giá trị 16 bit và chính các con trỏ này có các giá trị lẻ (không chẵn), vì chúng được trỏ vào bộ đệm comms tròn - và tôi không có trước cách nhận biết giá trị 16 bit sẽ bắt đầu trên một ranh giới lẻ hay chẵn. Trình biên dịch XC16 không bảo vệ bạn khỏi hangouts phần cứng ở đây. Cuối cùng tôi đã viết một macro trình bao cho các hàm này, điều này đã buộc 2 trình khử con trỏ 8 bit.
Brhans

Câu trả lời:


13

Quy tắc không chính thức của tôi là:

  1. Nếu một ngắt được kích hoạt, thì bạn nên có mã xử lý nó.
  2. Nếu bạn không viết mã cho một ngắt, vô hiệu hóa nó.
  3. Nếu bạn không thể vô hiệu hóa nó, hãy viết mã cho nó.

Mặc dù không có quy tắc đó, bảng dữ liệu trả lời rõ ràng câu hỏi của bạn:

Nếu người dùng không có ý định thực hiện hành động khắc phục trong trường hợp xảy ra tình trạng lỗi bẫy, các vectơ này phải được tải với địa chỉ của trình xử lý mặc định chỉ chứa lệnh RESET. Mặt khác, nếu một trong các vectơ chứa địa chỉ không hợp lệ được gọi, bẫy lỗi địa chỉ sẽ được tạo.

( Nguồn , phần 8.3, ghi chú đầu tiên)

Cho rằng bạn không thể che giấu bẫy, sau đó bạn phải xử lý chúng. Nếu bạn không muốn xử lý bẫy theo một cách cụ thể, phương pháp thích hợp là thực hiện một RESETlệnh.


Vâng Tôi có một mô-đun chuẩn với các mục tiêu cho tất cả các bẫy.
Olin Lathrop

16

Vâng, đó là một ý tưởng tốt - nhược điểm duy nhất là một chút kích thước mã bổ sung và bạn phải quyết định phải làm gì với cái bẫy (phát ra một thông báo trên cổng nối tiếp? Bật đèn "FAILED"? Âm thầm khởi động lại, v.v. )


4
Tôi thường chỉ có bộ xử lý chạy trong một vòng lặp NOP / GOTO vô hạn. Bằng cách đó, ngăn xếp đã không bị hỏng từ bẫy và khi gỡ lỗi tôi có cơ hội làm sáng tỏ nó và tìm hiểu điều gì đã xảy ra. Tôi không nhận được bẫy thường xuyên, nhưng 80% thời gian là bẫy địa chỉ kỳ lạ, thường là do rác được tải dưới dạng con trỏ. Đôi khi con trỏ ngăn xếp bị hỏng và tạo ra bẫy địa chỉ lẻ. Những cái đó khó gỡ lỗi hơn vì stack không còn ở đó nữa. May mắn thay, điều đó thực sự hiếm.
Olin Lathrop
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.