Bộ vi xử lý / Vi điều khiển - Các thanh ghi có địa chỉ không?


7

Giáo sư Hệ thống nhúng của tôi tiếp tục đề cập đến các vị trí bộ nhớ của các thanh ghi như là "địa chỉ" tương ứng của chúng. Tôi bối rối vì điều này; Tôi luôn có ấn tượng rằng trong bất kỳ bộ vi xử lý nào, các thanh ghi CPU không có địa chỉ vì chúng không nằm trong bộ nhớ chính (chúng nằm trong chính bộ vi xử lý). Tôi cũng bối rối về những gì chúng ta đề cập đến khi chúng ta nói "vị trí bộ nhớ của thanh ghi" - một lần nữa, nó không nằm trong bộ nhớ chính.

Như đã nói, tại sao chúng ta lại đề cập đến vị trí của các thanh ghi CPU theo "địa chỉ"? Do tất cả / một số thanh ghi có địa chỉ?

Tôi đã nghĩ về điều này và lý do rằng có lẽ chúng "được kết nối" với các vị trí bộ nhớ chính nhất định, cho phép truy cập vào các giá trị được lưu trữ trong các thanh ghi. Để mở rộng suy nghĩ này, đây có phải là bản đồ bộ nhớ?

Tôi cũng nên nói thêm rằng chúng tôi đang làm việc cụ thể với bộ vi điều khiển LPC1768 của NXP, sử dụng bộ vi xử lý ARM Cortex-M3.

Câu trả lời:


6

Nó phụ thuộc vào bộ xử lý cụ thể xem "các thanh ghi" có ở cùng không gian địa chỉ với bộ nhớ dữ liệu thông thường hay riêng biệt hay không. Trong cả hai trường hợp, nếu có nhiều người trong số họ, mỗi người vẫn cần một địa chỉ.

Giả sử bộ xử lý có 16 thanh ghi được gắn chặt với CPU và được triển khai tách biệt với bộ nhớ dữ liệu. Những đăng ký vẫn phải được xác định bằng cách nào đó. Trong trường hợp này, sẽ cần một địa chỉ 4 bit để phân biệt các thanh ghi riêng lẻ. Trong kiến ​​trúc RISC, địa chỉ 4 bit của bất kỳ (các) thanh ghi nào mà một lệnh được làm việc sẽ được đưa vào mã lệnh. Ví dụ, lệnh ADD có thể thêm giá trị của thanh ghi nguồn vào thanh ghi đích. Lệnh đó sẽ bao gồm 4 bit để xác định thanh ghi nguồn và 4 bit khác để xác định thanh ghi đích. Tài liệu có thể đề cập đến các thanh ghi này theo "số" từ 0 đến 15, nhưng đó thực sự là địa chỉ nơi các thanh ghi sống trong một bộ nhớ nhỏ đặc biệt của CPU.

Ngoài những điều trên, ngay cả khi bộ xử lý có các thanh ghi chuyên dụng đặc biệt, các thanh ghi đó có thể được ánh xạ vào không gian địa chỉ dữ liệu mục đích chung. Tham chiếu đến các địa chỉ đó bị mắc kẹt và được tham chiếu đến các thanh ghi nội bộ.

Có rất nhiều lược đồ ngoài kia, nhưng nếu bạn có nhiều hơn một thanh ghi, thì các thanh ghi đó cần được phân biệt với nhau bằng cách nào đó và bên trong phần cứng sẽ có một "địa chỉ", cho dù nó được gọi là trong tài liệu hay không phải.


Ah, vậy là có vấn đề. Tôi đã luôn gắn liền chính bộ nhớ / RAM với địa chỉ bộ nhớ, độc quyền ; Tôi chưa bao giờ nghĩ sẽ liên kết các địa chỉ bộ nhớ với bất cứ điều gì khác. Cảm ơn bạn đã giải thích rõ ràng!
chevestong

Ngoài ra, bây giờ tôi tò mò; thành phần nào chịu trách nhiệm định vị và truy cập các địa chỉ đăng ký này?
chevestong

1
Nếu chúng là các thanh ghi chuyên dụng, sẽ có phần cứng chỉ để chọn một thanh ghi. Vì có quá ít thanh ghi, nên có thể sử dụng nhiều phần cứng hơn để giải mã và hành động trên các bit địa chỉ mà bạn có thể sử dụng trong một bộ nhớ lớn thông thường. Điều này có thể làm cho việc giải mã nhanh hơn, cho phép nhiều cổng, v.v. Thông thường, bất kỳ một thanh ghi nào cũng có thể điều khiển đầu vào ALU và có thể lưu đầu ra ALU. Trong một số kiến ​​trúc (DSPIC là một ví dụ), ba thanh ghi riêng biệt có thể thực hiện những điều này một cách riêng biệt trong cùng một hướng dẫn.
Olin Lathrop

8

Nguồn gốc của sự nhầm lẫn là có (nói chung) hai loại thứ có thể được gọi là "thanh ghi".

Đầu tiên có lẽ là những gì bạn quen thuộc: trong ARM, đó là các thanh ghi R0, R1, R2, ... R12, SP, LR, PCvà trong x86 eax, ebx, ecx, edx, ebp, v.v. Đây cũng có thể được gọi là " thanh ghi lõi " hoặc " thanh ghi bộ xử lý ". Họ không có địa chỉ trong không gian bộ nhớ hệ thống và chỉ có thể được truy cập bằng các hướng dẫn cụ thể.

Cái còn lại là các thanh ghi có thể điều khiển các khối phần cứng (thiết bị ngoại vi) khác nhau, trong chính CPU hoặc bên ngoài nó. Trên LPC1768 và nhiều bộ xử lý nhúng khác, chúng thường được ánh xạ bộ nhớ và đó là lý do tại sao chúng có địa chỉ. Ví dụ, khối UART0 có địa chỉ 0x4000C000 và đó là nơi bạn cần đọc hoặc viết để giao tiếp với nó. Để phân biệt với các thanh ghi lõi, chúng có thể được gọi là " các thanh ghi ngoại vi " hoặc " các thanh ghi phần cứng ".

Trên một số bộ vi điều khiển 8 bit cấp thấp như 8051 hoặc PIC, có thể không có thanh ghi lõi nào cả ngoài bộ tích lũy và tất cả các thanh ghi khác được ánh xạ vào các vùng nhớ khác nhau như "RAM bên trong" (để lưu trữ / tính toán tạm thời) hoặc Bộ nhớ "Thanh ghi chức năng đặc biệt" (SFR) cho các thanh ghi điều khiển và ngoại vi. Trong đó, "sổ đăng ký" hầu như luôn có một địa chỉ.

Các ARM lớn hơn cũng có các thanh ghi bộ đồng xử lý , có thể được sử dụng để kiểm soát các chức năng cốt lõi khác nhau (ví dụ MMU hoặc bộ đệm) với các hướng dẫn như MRChoặc MCR. Các thanh ghi này tương tự như các thanh ghi lõi ở chỗ chúng không có địa chỉ bộ nhớ mà chỉ là một số.

Ngoài ra, trên x86, bạn có thể có các cổng I / O , được truy cập theo hướng dẫn inout, có thể được sử dụng để kiểm soát một số khối phần cứng. Đây là những chức năng tương tự như các thanh ghi ngoại vi nhưng thường không được gọi như vậy.


Các thanh ghi bộ xử lý có thể truy cập theo bất kỳ cách nào?
chevestong

1
@ ProSteve037: tất nhiên, nếu không sẽ không có lý do gì để có chúng :) Hầu hết các hướng dẫn thực sự hoạt động với các thanh ghi bộ xử lý. Ví dụ: trên ARM: MOV, LDR, STR, ADD, SUB, v.v.
Igor Skochinsky

1
@ ProSteve037 Trong một nghĩa nào đó, đăng ký xử lý làm có một loại địa chỉ, nhưng nó được sử dụng trong register fieldcác opcode (hướng dẫn-word máy-code), và không thể bị nhầm lẫn với các địa chỉ bộ nhớ (vị trí của họ trong các định dạng opcode là khác biệt và các trường có kích thước khác nhau).
kẻ lừa đảo người lái xe

3

Bạn đúng rằng một số thanh ghi không nằm trong bộ nhớ chính, mà là trong chính bộ vi xử lý và các thanh ghi đó được ánh xạ bộ nhớ vào các vị trí nhất định.

Bộ vi điều khiển LPC1768 chỉ có 64kB RAM (ý tôi nói là bộ nhớ chính) tuy nhiên bus địa chỉ 32 bit và 4GB tổng không gian địa chỉ. Phần còn lại của không gian địa chỉ này chứa bộ nhớ flash lưu trữ chương trình của bạn và các thanh ghi cho tất cả các thiết bị ngoại vi (ví dụ: trạng thái chân đầu ra hoặc ADC).

Thông thường khi bạn cố truy cập vào một vị trí được ánh xạ bộ nhớ, logic bên trong vi điều khiển sẽ xác định vị trí của địa chỉ bộ nhớ và sẽ vận hành các dòng điều khiển để dữ liệu được chuyển đến nơi được dự định, bất kể đó là trong RAM, Cổng GPIO hoặc một thanh ghi điều khiển ngoại vi.

Điều này giúp đơn giản hóa phần mềm viết, vì bạn không cần phải lo lắng quá nhiều về vị trí của các thanh ghi và giúp việc biên dịch các ngôn ngữ cấp cao hơn (như C) dễ dàng hơn nhiều.

Trong trường hợp cụ thể của LPC1768, nhìn vào biểu dữ liệu ( http://www.nxp.com/document/data_sheet/LPC1769_68_67_66_65_64_63.pdf ) chúng ta có thể thấy bản đồ địa chỉ trên trang 20 (Hình 4) thiết bị ngoại vi được ánh xạ tới trong bộ nhớ.

Tất nhiên, bộ xử lý cũng chứa một số thanh ghi bên trong không được ánh xạ bộ nhớ, chúng có thể được truy cập nhanh hơn bất kỳ thứ gì trong không gian địa chỉ, vì logic quản lý bộ nhớ chậm so với lõi và được sử dụng làm bộ nhớ tạm thời trong quá trình hoạt động. Một phần công việc của trình biên dịch là xử lý việc lưu trữ dữ liệu trong các thanh ghi và chuyển nó ra khỏi / vào bộ nhớ cho bạn.


2

Như những người khác đã nói, nó phụ thuộc vào gia đình vi điều khiển. Và nó phụ thuộc vào những gì bạn có nghĩa là bằng cách đăng ký.

Ví dụ, msp430 có hai bộ "thanh ghi". Đầu tiên là tệp đăng ký RISC, với 16 thanh ghi 16 bit. Chúng bao gồm Bộ đếm chương trình, Con trỏ ngăn xếp, Trạng thái và các thanh ghi Trình tạo liên tục và 12 thanh ghi sử dụng chung. Đây là các thanh ghi trong việc sử dụng kiến ​​trúc truyền thống của từ này.

Đăng ký tập tin

Bộ thanh ghi thứ hai là mọi thứ khác. Các cổng, thiết bị ngoại vi, ngắt, v.v ... Đây là một phần của tệp bộ nhớ đơn và chia sẻ không gian với RAM và Flash sử dụng chung (Không gian mã)

Bản đồ bộ nhớ

Ví dụ: msp430g2231 có thanh ghi Đầu ra Cổng 1 tại địa chỉ bộ nhớ 0x21.

Cụ thể

Bạn có thể truy cập vào thanh ghi với tên đăng ký p1out, nhưng đó chỉ là một con trỏ tới địa chỉ bộ nhớ 8 bit 0x21. Quan trọng nhất, đó là cách trình biên dịch nhìn thấy nó. Tệp tiêu đề, trong trường hợp này là msp430g2231.h, định nghĩa "p1out" có nghĩa là 0x0021. Ngoài tệp đăng ký RISC, việc sử dụng chung Đăng ký chỉ có nghĩa là một địa chỉ bộ nhớ cho x tùy chọn cụ thể. Những gì bạn thấy là Đăng ký p1out, chỉ là cách ngôn ngữ cao hơn giúp bạn lập trình dễ dàng hơn, thay vì ghi nhớ bản đồ bộ nhớ.

Nếu bạn sử dụng một con trỏ tới địa chỉ bộ nhớ 0x27f, thay vào đó bạn sẽ đọc từ RAM. Con trỏ tới địa chỉ bộ nhớ 0xffdf và thay vào đó bạn sẽ đọc mã được biên dịch. Tất cả một thanh ghi là, một địa chỉ bộ nhớ cho một chức năng đặc biệt.


2

Là một thuật ngữ chung "đăng ký" chỉ có nghĩa là nơi bạn có thể lưu trữ thông tin ("đăng ký"), không có gì hơn.

Hầu hết các kiến trúc dành riêng thanh ghi thuật ngữ cho các vị trí trong CPU được xác định bởi các bit trong một lệnh và thường có thể truy cập nhanh hơn nhiều so với bộ nhớ chung ("RAM"). (Và thường có thể truy cập song song 2 hoặc 3 thanh ghi trong một chu kỳ thực hiện.)

Tuy nhiên, ví dụ, tài liệu PIC của Microchip, đề cập đến tất cả các vị trí có thể định địa chỉ là các thanh ghi, thậm chí bao gồm cả RAM. Khi giáo sư của bạn sao chép việc sử dụng thuật ngữ này, anh ấy nên IMO thông báo cho bạn rằng đây không phải là cách thuật ngữ "đăng ký" thường được sử dụng hiện nay. (Giống như tôi hy vọng tôi đã làm trong các lớp trình biên dịch PIC.)


1
Không chỉ là vi mạch - hãy nhìn vào 8051 cho một ví dụ sớm hơn nhiều, và thậm chí điều đó cũng có thể có người tiền nhiệm.
Chris Stratton

@ChrisStratton: Tôi khá chắc chắn rằng PIC dụng cụ chung (dựa trên cơ sở 16C54 của Microchip) trước 8051, và nó thậm chí có thể có trước 8048.
supercat

Vâng, có vẻ như nó có trước 8048 khoảng một năm.
Chris Stratton

1

Các thanh ghi có địa chỉ, mặc dù chúng thường không nằm trong bộ nhớ.

Hãy suy nghĩ về nó một phút: một địa chỉ biểu thị một vị trí trong một không gian nào đó, trong đó bộ nhớ chỉ là một ví dụ của một không gian. I / O thường có không gian địa chỉ riêng; trong một số kiến ​​trúc vi điều khiển, bộ nhớ mã và bộ nhớ dữ liệu là các không gian riêng biệt.

Và do đó, các thanh ghi cũng có thể có không gian riêng: đôi khi các thanh ghi FP và số nguyên (và trên 68000 tôi tin rằng, các thanh ghi địa chỉ) mỗi thanh ghi có không gian riêng.

Một câu hỏi là: làm thế nào để chúng ta biết liệu địa chỉ 1 đề cập đến byte 1 trong bộ nhớ, cổng I / O 1 hay đăng ký 1? Thông thường từ ngữ cảnh: trong một lệnh IN hoặc OUT, rõ ràng là một cổng. Trong hướng dẫn đăng ký để đăng ký, đó là một địa chỉ đăng ký. Trong hướng dẫn tải, sẽ có một địa chỉ bộ nhớ (lớn) và địa chỉ thanh ghi (nhỏ), v.v.

Trong lõi ARM, địa chỉ bộ nhớ thường sẽ là số 32 bit; một địa chỉ đăng ký sẽ là một số 5 bit.


Nhiều bộ xử lý có một số thanh ghi được truy cập "theo số", nhưng cũng có một số thanh ghi chỉ có thể truy cập bằng các hướng dẫn đặc biệt. Tôi không biết làm thế nào người ta có thể mô tả một cách có ý nghĩa đăng ký "S" của 6502 là có một địa chỉ, chẳng hạn. Ngoài việc đẩy / bật / gọi / trả lại, các hướng dẫn duy nhất truy cập nó là TSX / TXS (chuyển S sang X hoặc X sang S). Bit 4 của opcode chọn giữa TSX và TAX, hoặc giữa TXS và TXA, nhưng không có nghĩa gì khi coi các opcode là "Chuyển X để đăng ký #b", vì không có hướng dẫn nào khác đề cập đến A là reg # 0 và S là reg # 1.
supercat

1

Nếu người ta định nghĩa một địa chỉ là một tập hợp các kbit có thể được sử dụng để chọn một mục từ một tập hợp thành các 2^kmục, thì thông thường nhiều thanh ghi trong nhiều bộ xử lý và bộ điều khiển có địa chỉ, nhưng cũng có một số bộ điều khiển các thanh ghi được kích hoạt bởi các mạch phát hiện các điều kiện cụ thể và không thể nhận dạng được thông qua bất kỳ dạng địa chỉ nào. Tuy nhiên, điều quan trọng cần lưu ý là trong nhiều trường hợp, dây địa chỉ điều khiển các thanh ghi CPU sẽ không liên quan đến dây địa chỉ được kết nối với hệ thống bộ nhớ lớn hơn. Do đó, đăng ký "địa chỉ" thường sẽ tồn tại trong một "vũ trụ" hoàn toàn riêng biệt với các địa chỉ bộ nhớ.

Trên hầu hết các bộ xử lý, "địa chỉ" đăng ký luôn được tạo ra bên trong bởi logic bộ xử lý, nằm ngoài sự kiểm soát của lập trình viên hoặc được tìm nạp từ các bit nhất định trong mỗi lệnh. Cách duy nhất bằng cách thay đổi mã có thể theo phần mềm ảnh hưởng đến thanh ghi nào sẽ được tìm nạp bởi một lệnh cụ thể sẽ là vá các bit thích hợp trong lệnh đó. Trên PIC Dụng cụ chung, có thiết kế tồn tại dưới dạng PIC Microchip, nếu một mã op quy định tất cả các số 0 cho một địa chỉ, phần cứng sẽ thay thế nội dung của một thanh ghi khác ở địa chỉ 3. Điều này cho phép mã sử dụng tính toán để chọn một địa chỉ.

Có lẽ điều quan trọng nhất để hiểu về địa chỉ là một hệ thống có các không gian địa chỉ khác nhau tồn tại hiệu quả trong các vũ trụ khác nhau. Ví dụ, trên 8051, tùy thuộc vào cách tính của một người, ít nhất bốn không gian địa chỉ khác nhau và có thể lên đến sáu; bốn trong số đó là hoàn toàn độc lập (hướng dẫn:

mov a,80h  ; Direct address space
mov a,@r0  ; Assume R0 = 80h
movc a,@a+dptr ; Assume A = 0 and DPTR = 80h
movx a,@dptr ; Assume DPTR = 80h

tất cả lấy dữ liệu từ "địa chỉ 80h" nhưng họ đọc bốn thứ không liên quan: một địa chỉ trong không gian I / O (tôi nghĩ là thanh ghi dữ liệu cổng 0), đăng ký dữ liệu nội bộ 80h, bộ nhớ mã tại địa chỉ 0x0080 và bộ nhớ dữ liệu ngoài tại địa chỉ 0x0080 . Trong nhiều hệ thống, những thứ này trong thực tế sẽ không liên quan gì đến nhau. Việc một thanh ghi sẽ phản hồi đến một địa chỉ cụ thể trong một vũ trụ nói rất ít hoặc không có gì về việc nó sẽ phản hồi với địa chỉ đó hay bất kỳ địa chỉ nào khác trong vũ trụ khác.


0

RISC có nghĩa là "Máy tính tập lệnh giảm". Một phần trong cách bạn giảm kích thước của tập lệnh là chỉ có một loại vị trí dữ liệu, bao gồm Thanh ghi, RAM hoặc I / O.

Quay trở lại khi mọi người thực hiện những ý tưởng này một cách nghiêm túc, hai ưu điểm mong đợi của thiết kế RISC là, bạn có thể làm cho bộ xử lý nhanh hơn nhiều nếu bạn làm nó đơn giản hơn nhiều và bạn có thể tối ưu hóa mã chương trình của mình nếu bạn có thể sử dụng bất kỳ địa chỉ bộ nhớ nào cho mọi thứ, thay vì buộc mọi thứ phải tải và dỡ tải đi qua thanh ghi ALU cho số học, thanh ghi Địa chỉ bộ nhớ để đánh địa chỉ bộ nhớ, v.v.

Hai phần còn lại của lối suy nghĩ đó là, (1) Chúng tôi có các bộ xử lý PRETEND tất cả các thanh ghi bằng nhau, bằng cách ánh xạ các thanh ghi vào không gian bộ nhớ và (2) Chúng tôi có các giáo sư rằng PRETEND tất cả các thanh ghi đều bằng nhau, bằng cách gọi các vị trí bộ nhớ của thanh ghi.

Hãy bao dung. Đó là một lĩnh vực nghiên cứu quan trọng đối với sinh viên PHD, có tác động đáng kể và lâu dài đến cách thức một số bộ xử lý được thiết kế.


Không. RISC không có nghĩa là mất sự phân biệt giữa tệp đăng ký và bộ nhớ chính, vì điều đó sẽ làm phức tạp việc giải mã hướng dẫn, điều này trái ngược với các mục tiêu của RISC. RISC là một cách cổ điển về các hướng dẫn đơn giản, thực hiện nhanh chóng những gì họ làm và để lập trình viên / trình biên dịch kết hợp chúng lại với nhau. Vì vậy, các phiên bản địa chỉ đăng ký và bộ nhớ của các hướng dẫn có mã hóa khác nhau trong kiến ​​trúc RISC cổ điển. Và truy cập bộ nhớ thường là một địa chỉ được cung cấp bởi một thanh ghi với sự dịch chuyển tức thời bị hạn chế do chỉ có rất nhiều bit có sẵn trong từ lệnh.
Chris Stratton

Bạn đã đúng, ngoại trừ câu đầu tiên. Mất phân biệt giữa tệp đăng ký và bộ nhớ chính là một trong những cách giải mã hướng dẫn đơn giản hóa RISC cổ điển, là một trong những mục tiêu của RISC. Trong thực tế, cân nhắc thực tế can thiệp. Ví dụ, xem RISC tối thượng
david

Một từ lệnh RISC mã hóa khá rõ ràng một số thanh ghi hoặc một tham chiếu bộ nhớ, đó là một sự bảo tồn phân biệt so với tình huống được dự tính ở đây trong đó một thanh ghi được mã hóa chính xác giống như một địa chỉ bộ nhớ.
Chris Stratton

Xin vui lòng đọc tài liệu tham khảo đầu tiên. Trước khi đăng.
David

Tài liệu tham khảo là một kiến ​​trúc hàn lâm kỳ quặc, không phải là thiết kế risc cổ điển như thực sự được xây dựng.
Chris Stratton

0

8051 nếu tôi nhớ đúng, bạn có thể truy cập vào các thanh ghi bằng địa chỉ bộ nhớ, nhưng đây không phải là trường hợp chung cho tất cả các bộ xử lý. Các bộ xử lý ARM không có cách nào để làm điều này, các thanh ghi mục đích chung r0-r15 không thể được truy cập trên bus bộ nhớ.

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.