2012-01-10 18 views
11

Tôi đang làm một số phát triển trong C với một chip STM32F107 và, tại một số điểm, thiết bị bắt đầu đặt lại khi tôi gọi một chức năng cụ thể. Tôi không có một trình gỡ lỗi và gỡ lỗi của tôi chỉ là văn bản thuần trên một cổng nối tiếp.Làm cách nào để gỡ lỗi các lần đặt lại không mong muốn trong thiết bị STM32?

Tôi đã sử dụng một số bộ vi điều khiển khác mà tôi có thể truy cập vào sổ đăng ký để xem nguyên nhân của việc đặt lại, nhưng dường như tôi không thể tìm thấy thiết bị này tương đương. Tôi nhận thức được các ngoại lệ phần cứng của Cortex-M3, nhưng tôi không biết liệu một trong số chúng có được kích hoạt hay không vì tôi dường như không gửi văn bản qua đầu khi tôi ở trong các trình xử lý đó (có thể vì TX của tôi chức năng sử dụng gián đoạn?).

Vì vậy, tôi quyết định hỏi những người có nhiều kinh nghiệm hơn tôi trong thiết bị này: những gì thường được thực hiện để gỡ lỗi các tình huống như thế này?

EDIT

Một trong những nhà phát triển kích hoạt cơ quan giám sát WWDG và nó đã Reseting phần cứng trước khi tôi có thể nhận được thông tin của tôi từ các trình xử lý lỗi. Đó là một lỗi cứng do gọi một hàm bằng một con trỏ trỏ đến địa điểm sai. Tuy nhiên, tôi sẽ giữ câu hỏi này với hy vọng rằng ai đó sẽ cung cấp thêm chi tiết (hoặc tài liệu về nó) để trỏ ngược lại mã C từ sổ đăng ký được lưu trong, cho phép nói, Lỗi cứng (ý tưởng @dwelch).

Trả lời

11

Cortex M3 có các tính năng xử lý lỗi tuyệt vời giúp cuộc sống của bạn dễ dàng hơn. Khi gặp lỗi, nó sẽ tự động ngăn xếp một số thanh ghi như PC và LR, và thanh ghi trạng thái lỗi sẽ cho bạn biết những thứ như địa chỉ lỗi bus, v.v.

Bạn nên thực hiện xử lý lỗi tốt (ví dụ, trình xử lý lỗi cứng) ở đây: http://blog.frankvh.com/2011/12/07/cortex-m3-m4-hard-fault-handler/) để in ra các thanh ghi xếp chồng lên nhau và gỡ lỗi các thanh ghi trạng thái lỗi.

Bạn nên sử dụng UART để in, chỉ cần viết phiên bản printf tùy chỉnh đơn giản của riêng bạn để sử dụng từ trình xử lý lỗi không phụ thuộc vào ngắt. Chỉ cần ghi các byte trực tiếp vào thanh ghi dữ liệu uart Tx và thăm dò để hoàn thành byte.

1

Do bạn không có trình gỡ lỗi, tôi khuyên bạn nên tìm một số thiết bị ngoại vi trên vi điều khiển để trợ giúp bạn. Có lẽ bạn có một đèn LED, bạn có thể chuyển đổi hoặc một pin GPIO đơn giản mà không được sử dụng mà bạn có thể treo lên đến một dao động. Nếu bạn chuyển đổi một pin GPIO đủ chậm (không nhanh hơn 1 Hz và có thể chậm hơn tùy thuộc vào đồng hồ), bạn có thể sử dụng một đồng hồ đo thay vì một phạm vi. Đặt mã để chuyển đổi đèn LED hoặc pin GPIO trong từng bộ xử lý ngoại lệ một lần cho đến khi bạn theo dõi nó. Nếu bạn có nhiều hơn một pin GPIO, bạn có thể tăng tốc quá trình. Bạn cũng có thể viết trình bao bọc cho hàm cụ thể gây ra việc đặt lại. Hàm wrapper sẽ gửi một danh sách các ngắt được kích hoạt ngay trước khi chức năng ngắt được thực thi. Bằng cách này bạn không phải lãng phí thời gian thử nghiệm những cái chưa được kích hoạt.

Một ưu điểm của các chân GPIO trong trường hợp này là chúng không yêu cầu ngắt. Tốt nhất là tránh xa bất cứ thứ gì yêu cầu gián đoạn (như USART của bạn trong trường hợp này). Nếu việc đặt lại bị gây ra bởi ngoại lệ ưu tiên cao hơn thì mã gỡ lỗi của bạn sẽ không bao giờ thực thi.

Việc đặt lại do con trỏ chưa được khởi tạo cũng phổ biến. Một con trỏ hàm được đặt bằng 0 sẽ làm cho việc thực thi trông giống như một thiết lập lại. Trong trường hợp này, mã khởi tạo USART có thể đang được thực hiện trước khi một byte có thể được truyền đi hoàn toàn bởi USART, điều này sẽ khiến USART vô dụng như một công cụ gỡ lỗi trong trường hợp này.

1

Khi bạn nói đặt lại, tôi nghĩ về mặt bạn nhấn vector đặt lại, không phải là một trong các ngắt hoặc trình xử lý.Bạn có nói rằng nó thực sự thiết lập lại chip và khởi động lại phần mềm của bạn hay bạn đang nói rằng nó đang treo ở đâu đó? hoặc bạn có bảng vectơ tất cả các điểm tại các vector thiết lập lại?

Cách tiến hành phụ thuộc vào những gì bạn đang thực sự nhìn thấy, bạn cần phải rõ ràng hơn hoặc cụ thể hơn hoặc có thể bạn muốn giúp tìm hiểu điều đó.

Thông thường tôi ánh xạ các vectơ chưa sử dụng vào một dòng mã đơn giản mà các nhánh của chính nó. Sau đó tôi có thể remap một số người trong số họ để mã thực.

vỏ não-m rất đẹp ở chỗ bạn có thể trỏ vào mã C. Nếu bạn nghĩ rằng bạn đang nhận được một ngoại lệ, nó chỉ vào một thói quen mà lấy một cái gì đó giúp bạn tìm ra chế độ bạn đang ở, thanh ghi liên kết có thể có thông tin đó, hoặc một csr ở đâu đó, in ra và đi vào vòng lặp vô hạn . Điền các phần chưa sử dụng của bảng vectơ với địa chỉ vào hàm gỡ rối chung này.

Từ đó bạn cần tìm ra lý do tại sao bạn đang nhấn ngoại lệ đó, nó có thể giống như một truy cập chưa được ký hiệu chẳng hạn. Nó có thể là bạn đã tạo ra một ngắt khi cố gắng initalize một thiết bị trước khi hoàn toàn thiết lập xử lý, những người hiểu biết.

chỉnh sửa câu hỏi của bạn với nhiều câu trả lời hoặc thông tin hơn khi bạn thực hiện việc này.

0

Điều "đúng" cần làm, thật không may là không thực tế với STM32. Điều đó sẽ được đặt trong một xử lý ngoại lệ lớn có kiến ​​thức về mã nguồn, và có thể thư giãn ngăn xếp và cung cấp cho bạn các ngăn xếp cuộc gọi đầy đủ và số dòng gây ra lỗi. Điều này sẽ yêu cầu thêm tất cả thông tin gỡ lỗi từ ứng dụng của bạn vào bộ nhớ flash của STM32 và điều đó không thực tế.

Có nhiều cách lừa IDE của bạn đôi khi cung cấp cho bạn ngăn xếp cuộc gọi. Tôi muốn cung cấp chi tiết nhưng tôi quên viết chúng xuống, vì vậy tôi đã quên. Tôi nghĩ rằng nó phải tự thay đổi con trỏ ngăn xếp từ một đăng ký bóng khác.

Những gì tôi thường làm là đặt điểm ngắt tại vector ngoại lệ lỗi cứng, sau đó xem tất cả các thanh ghi khi điểm ngắt truy cập. Hãy xem xét chúng bằng chứng pháp y từ một vụ giết người, được thực hiện với chất nổ dẻo. Các giá trị của thanh ghi sẽ cho bạn ý tưởng. Đăng ký các giá trị bắt đầu bằng 0x20000000 là địa chỉ RAM. Đăng ký các giá trị bắt đầu bằng 0x08000000 là các địa chỉ Flash. Mở trình tháo rời và nhập vào các địa chỉ đó. Nó có thể sẽ đi thẳng đến biến hoặc chức năng tại các vị trí bộ nhớ đó. Nếu điều đó không giúp được gì thì hãy nhìn vào con trỏ ngăn xếp. Nhìn vào các vị trí bộ nhớ tại con trỏ ngăn xếp và thực hiện thủ thuật tương tự. Tôi đã luôn tìm thấy đủ mảnh đạn để định vị chức năng mà ngoại lệ đã xảy ra.

3

Ngoài những gì đã được đề cập về trình xử lý ngắt để gỡ lỗi, một số thiết bị ST cũng có một thanh ghi nguồn đặt lại mà bạn có thể đọc khi bật nguồn (sau khi đặt lại). Đối với gia đình M vỏ não (m0/m3/m4) thanh ghi là RCC_CSR. http://www.st.com/web/en/resource/technical/document/reference_manual/DM00031020.pdf

Thật không may là bạn sẽ không thể biết được các chi tiết cụ thể, chẳng hạn như lỗi cứng nhưng nó sẽ cho bạn biết liệu cơ quan giám sát (cửa sổ hoặc độc lập) đã bị vấp.

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