2012-02-22 27 views
10

Về kiến ​​trúc ARM, thật không may là tôi không biết chính xác chip đó là gì, là một nguyên tử đọc/ghi int 32 bit?ARM: Viết/đọc từ int nguyên tử?

Có bất kỳ loại bảo đảm nào về đọc/ghi đối với các loại cơ bản không?

+0

Nếu 'int' được sắp xếp phù hợp (đến 4 byte), tôi đoán rằng, giống như trên hầu hết các bộ xử lý 32 bit, viết là bằng cách nào đó nguyên tử. là mô hình bộ nhớ (đặc biệt trong các tình huống đa lõi: kết hợp bộ nhớ cache, vv) –

+0

Ngay cả khi không có sự kết hợp bộ nhớ cache, bộ nhớ đọc/ghi vào bộ nhớ chính vẫn là nguyên tử (nhưng bị trì hoãn) –

+0

@BasileStarynkevitch yes memory model là một điểm tốt, nhưng tôi chỉ h ave trên ARM CPU với một lõi. –

Trả lời

9

Nó phải là nguyên tử, TRỪ nếu int đó được lưu trữ trên một địa chỉ không liên kết.

+0

Làm thế nào để tìm hiểu xem nó được lưu trữ trên một địa chỉ không liên kết? Tôi không làm bất kỳ sự sắp xếp đặc biệt nào. –

+2

Kiểm tra xem địa chỉ mod 4 của nó là 0. Mặc dù nếu bạn không làm bất cứ điều gì lạ (loại-punning, vv), thì trình biên dịch sẽ làm cho nó phù hợp. – jjlin

+3

Trên thực tế một số bộ vi xử lý ARM như Cortex-M3 hỗ trợ truy cập chưa được ký kết trong HW, do đó, ngay cả một unaligned đọc/ghi là nguyên tử. Việc truy cập có thể kéo dài nhiều chu kỳ bus đến bộ nhớ, nhưng không có cơ hội cho một lệnh khác để nhảy inbetween, vì vậy nó là nguyên tử cho lập trình viên. – TJD

10

Điều này được ghi lại trong TRM cho lõi hoặc trong thông số AMBA/AXI. Bạn cần phải tìm kiếm lõi được sử dụng từ đó nếu bạn có thể tìm ra những gì hương vị của AMBA/AXI xe buýt và trong đó spec nó spells ra bản chất nguyên tử/phi nguyên tử của từng loại giao dịch.

Ví dụ: swp và ldrex/strex là nguyên tử. Một strd và stm cũng nên là nguyên tử. Nhưng trên ARM11 Mpcore rằng tôi quen thuộc nhất nó phá vỡ các ghi vào chu kỳ xe buýt 64 bit duy nhất, làm một stm với 8 thanh ghi tôi nghĩ rằng nó sẽ trở thành 4 chiều dài riêng biệt của 1 chu kỳ xe buýt, nơi một ldm của 8 đăng ký tôi nghĩ là một giao dịch với chiều dài là bốn.

Đây là thời điểm tốt để lưu ý rằng ldrex và strex thường không được người lập trình sử dụng đúng cách. Linux có sai ví dụ. Chúng được dùng để khóa khi sử dụng bộ xử lý đa lõi trên một hệ thống bộ nhớ chia sẻ, KHÔNG cho các chủ đề phần mềm khóa trên một bộ xử lý đơn lẻ. Sử dụng SWP cho điều đó. Bạn sẽ nhận được may mắn nếu bạn có bộ đệm L1 khi ldrex/strex xảy ra để làm việc (bên trong một bộ xử lý).

Lưu ý ARM luôn cho phép truy cập chưa được ký, đôi khi theo mặc định (ARM7TDMI) sau đó mặc định là ném dữ liệu, nhưng bạn có thể thay đổi cài đặt sao cho không. Unaligned trên ARM không làm những gì x86 lập trình muốn ví dụ. nếu bạn đọc 32 bit tại địa chỉ 0x02 bạn không nhất thiết phải thu thập các byte 0x02, 0x03, 0x04, 0x05, bạn có thể/sẽ nhận 0x02, 0x03, 0x00, 0x01, sử dụng bus AMBA/AXI 32 bit. Bạn MIGHT có được kết quả mong muốn trên một bus AMBA/AXI 64 bit nhưng có thể không, chắc chắn trên cả 32 và 64 bit nếu bạn đọc 32 bit tại địa chỉ 0x0E bạn sẽ nhận 0x0E 0x0F và 0x08 0x09 hoặc 0x0c 0x0D. Không phải tất cả những gì các lập trình viên đang mong đợi (thông thường, một số người biết cách nó hoạt động như thế nào khi nó là một trình chuyển đổi byte đẹp), vì vậy nó thường bị bỏ sót khi ném dữ liệu và lập trình sửa mã của họ.

Trình biên dịch C thường tạo ra các truy cập chưa được ký, đó là lý do tại sao các lập trình viên x86 có thể chuyển mã hoặc di chuyển từ nền tảng đó sang bất kỳ hệ thống nào khác. Họ trả tiền phạt nặng trên x86 (hiệu suất khủng khiếp), nhưng không phải là một hình phạt nặng như các bộ vi xử lý khác (bộ nhớ hủy bỏ). SO được tải với các câu hỏi về chủ đề này, làm cách nào để mã của tôi chạy trên bộ xử lý xyz.

Tôi sẽ ra khỏi hộp xà phòng. ARM thực hiện một công việc tuyệt vời để ghi lại tất cả những thứ này (liên quan đến các nhà cung cấp chip khác). TRM (tài liệu tham khảo kỹ thuật, mỗi lõi có một) mô tả các lựa chọn xe buýt hoặc bus AMBA/AXI và sẽ đi vào các loại giao dịch. Sau đó, các tài liệu AMBA/AXI đi xa hơn để giải thích những gì đang diễn ra. Lỗ có thể có một bản đồ giữa các hướng dẫn và các loại giao dịch. Khi bạn làm một ldm của 6 từ tại một địa chỉ 0x4 trên một xe buýt AXI 64 bit bạn nhận được một bit 32 đọc tại địa chỉ 4, chiều dài 1. Bạn sau đó nhận được một chiều dài của 2 64 bit đọc (bốn byte) tại địa chỉ 0x8 (bao gồm các từ 0x8, 0xC, 0x10 và 0x14, sau đó đọc 32 bit riêng tại địa chỉ 0x18. Chỉ vì nó trở thành 3 giao dịch axi không có nghĩa là nó không nguyên tử; nó để lại cơ hội cho nó không nguyên tử, chắc chắn , nhưng bạn sẽ phải kiểm tra các tài liệu ARM

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