2014-12-28 19 views
5

Tôi biết dereferencing một con trỏ null là không xác định - nhưng tôi muốn biết những gì xảy ra trên một mục tiêu cụ thể - một MSP430.Trên MSP430, điều gì sẽ xảy ra khi tôi không quan tâm đến một con trỏ rỗng?

Tôi không có bảng để tải nó lên trước mặt mình để kiểm tra điều này ngay bây giờ.

Điều gì sẽ xảy ra nếu tôi thực hiện việc này (hoặc tương tự)?

int * foo = NULL; 
(*foo)++; //Crash? 

Vị trí 0x0 nằm trong phạm vi SFR và được đặt trước.

Nó có tạo ra PUC/POR không? Hoặc nó sẽ âm thầm "làm việc"?

Việc lắp ráp được tạo ra là

;int * foo = NULL; 
clr.w R15 
;(*foo)++; 
inc.w R15 

Vì vậy, vị trí 0x0 là nghĩa đen được tăng thêm 1.

Khi tôi chạy này trong mô phỏng tôi thấy giá trị tại địa chỉ 0x0 đi từ 0 đến 1. Tôi không có cảnh báo trong nhật ký gỡ lỗi và chương trình thoát bình thường.

Tôi đang sử dụng trình biên dịch/trình mô phỏng/trình mô phỏng IAR EW430.

+0

Chỉ cần rõ ràng, bạn đang hỏi về hành vi được quan sát của hành vi không xác định; một thứ tự cao. Câu hỏi này sẽ không có ở đây nếu bạn có phần cứng * thực tế trong mits của bạn, đúng không? Và thậm chí sau đó, nó sẽ không phụ thuộc vào việc liệu một móc gián đoạn trọng hơn đã được cài đặt tại thời điểm vi phạm, mà sẽ phụ thuộc vào thời điểm cụ thể của nói như vậy? (hoặc bạn có * hoàn thành * kiểm soát tất cả các bên trên không?). – WhozCraig

+0

@WhozCraig đúng. Trong một vỏ hạt tôi hỏi nếu msp430 sẽ tắt dữ dội khi 0x0 được đọc từ hoặc ghi vào hoặc nó vẫn tiếp tục hoạt động. Tôi dường như không thể tìm ra địa chỉ đó sẽ chứa gì. Có một ngắt mà bạn có thể thiết lập sẽ kích hoạt khi bộ nhớ "trống" ngoài phạm vi bình thường được truy cập, từ đó bạn có thể thực hiện một số ghi nhật ký về sự kiện nhưng tôi không nghĩ đó là một tùy chọn ở đây. Nhiều hơn hoặc ít hơn tôi hỏi về một cơ sở mã di sản khổng lồ không sử dụng xác nhận hoặc kiểm tra các thông số con trỏ trong giao diện.Địa chỉ – Nick

+0

0,1 là các bit kích hoạt ngắt. Do đó tăng địa chỉ 0 từ giá trị 0 lên giá trị 1 sẽ cho phép một trong các ngắt. Chương trình sẽ tiếp tục chạy ngay. @ Nick, có bạn không đọc bảng kiến ​​trúc cho msp430? Đặc tả kiến ​​trúc có thể được tìm thấy tại: user3629249

Trả lời

6

Không chỉ viết và đọc địa chỉ 0x0 sẽ không gây ra sự cố hoặc khởi động lại, nó thực sự là một hoạt động hoàn toàn hợp pháp thường được sử dụng bởi các ứng dụng MSP430.

Phần ban đầu hoặc bản đồ bộ nhớ MSP430 được dành riêng cho cổng I/O và thanh ghi điều khiển: http://en.wikipedia.org/wiki/TI_MSP430#MSP430_address_space

Đặc biệt, các thanh ghi điều khiển ở 0x0 và địa chỉ tiếp theo là:

#define IE1_     0x0000 /* Interrupt Enable 1 */ 
#define IE2_     0x0001 /* Interrupt Enable 2 */ 
#define IFG1_     0x0002 /* Interrupt Flag 1 */ 
#define IFG2_     0x0003 /* Interrupt Flag 2 */ 

Vì vậy, ví dụ bằng văn bản không đến địa chỉ bộ nhớ đó bằng cách hủy đăng ký một con trỏ uint8_t * hoặc uint16_t * sẽ tắt ngắt. Viết số không bằng cách dereferencing uint32_t * nó cũng sẽ xóa cờ. Gia tăng giá trị của các thanh ghi này không có ý nghĩa gì nhiều, nhưng phải hoàn toàn hợp pháp.

Ít nhất đây là trường hợp trên msp430 Series 1, Series 2 và Series 4. Bằng cách kiểm tra các tệp tiêu đề tôi không thể tìm thấy bất kỳ thứ gì được ánh xạ tới 0x0 trên Series 5 (thanh ghi điều khiển ngắt được ánh xạ tới vùng bắt đầu từ 0x0100).

Vì vậy, nếu bạn muốn bắt các địa điểm trong mã nơi con trỏ NULL bị hủy đăng ký, bạn hoàn toàn tự làm.

+0

Cảm ơn lời giải thích, đó là điều tôi sợ. Tôi đã nhìn vào một loạt 5 tiêu đề đó là lý do tại sao tôi không thể tìm ra những gì 0x0 đã được sử dụng cho. – Nick

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