2012-02-10 38 views
18

Trong quá khứ, tôi đã làm việc rất nhiều với 8 bit AVR và MSP430 nơi cả RAM và flash được lưu trữ trực tiếp trên chip. Khi bạn biên dịch và tải xuống chương trình của bạn, nó sắp xếp "chỉ hoạt động" và bạn không cần phải lo lắng về vị trí và cách các biến được lưu trữ thực sự.Cách sử dụng bộ nhớ ngoài trên vi điều khiển

Bây giờ tôi bắt đầu một dự án mà tôi muốn có thể thêm bộ nhớ ngoài vào bộ vi điều khiển (TI Stellaris LM3S9D92 nếu điều đó quan trọng) nhưng tôi không hoàn toàn chắc chắn cách bạn sử dụng mã của mình RAM bên ngoài. Tôi có thể thấy cách bạn cấu hình bus ngoài khá giống với bất kỳ thiết bị ngoại vi nào khác nhưng điều làm tôi bối rối là cách bộ xử lý theo dõi thời điểm nói chuyện với bộ nhớ ngoài và khi nào nói chuyện với bộ nhớ bên trong.

Từ những gì tôi có thể biết, RAM bên ngoài được ánh xạ tới cùng một không gian địa chỉ như SRAM nội bộ (khởi động nội bộ ở 0x20000000 và khởi động bên ngoài ở mức 0x60000000). Điều đó có nghĩa là nếu tôi đã viết một cái gì đó như thế này:

int* x= 0x20000000; 
int* y= 0x60000000; 

X và y sẽ trỏ đến 4 byte đầu tiên (giả định 32 bit int) của RAM nội bộ và bên ngoài tương ứng? Nếu vậy, những gì nếu tôi một cái gì đó như thế này:

int x[999999999999]; //some super big array that uses all the internal ram 
int y[999999999999]; //this would have to be in external ram or it wouldn't fit 

tôi tưởng tượng rằng tôi cần phải nói một cái gì đó về ranh giới của nơi từng loại bộ nhớ là hay tôi có nó tất cả các sai lầm và phần cứng tự nó ra sao? Các tập lệnh liên kết có giải quyết vấn đề này không? Tôi biết họ có cái gì đó để làm với bản đồ bộ nhớ nhưng tôi không biết chính xác những gì. Sau khi đọc về làm thế nào để thiết lập một trình biên dịch chéo ARM tôi có cảm giác rằng một cái gì đó như winavr (avr-gcc) đã làm rất nhiều thứ như thế này cho tôi đằng sau hậu trường vì vậy tôi sẽ không phải đối phó với nó.

Xin lỗi vì đã đánh bạc một chút nhưng tôi thực sự đánh giá cao nếu ai đó có thể cho tôi biết nếu tôi đang đi đúng hướng với nội dung này.

Cập nhật

Đối với bất kỳ độc giả tương lai Tôi thấy điều này sau một vài giờ googling http://www.bravegnu.org/gnu-eprog/index.html. Kết hợp với câu trả lời ở đây nó đã giúp tôi rất nhiều.

+0

Bạn có thể muốn hỏi trên http://electronics.stackexchange.com/. Bạn cũng có thể muốn xem [Bảng dữ liệu Stellaris] (http://www.ti.com/lit/ds/spms257a/spms257a.pdf). –

Trả lời

11

Nói chung đó chính là cách hoạt động của nó. Bạn phải thiết lập đúng phần cứng và/hoặc phần cứng có thể đã có những thứ được mã hóa cứng tại các địa chỉ cố định.

Bạn có thể hỏi cùng một câu hỏi, làm cách nào để phần cứng biết rằng khi tôi viết một byte để giải quyết 0x21000010 (tôi vừa tạo điều đó), đó là thanh ghi giữ uart và ghi có nghĩa là tôi muốn gửi một byte ra khỏi uart? Câu trả lời bởi vì nó được hardcoded trong logic theo cách đó. Hoặc logic có thể có một bù đắp, các uart có thể di chuyển nó có thể là một số nội dung đăng ký kiểm soát khác cộng với 0x10. thay đổi thanh ghi điều khiển đó (bản thân nó có một số địa chỉ mã hóa cứng) từ 0x21000000, đến 0x90000000 và sau đó ghi vào 0x90000010 và một byte khác thoát ra khỏi uart.

Tôi sẽ phải xem phần đó, nhưng nếu nó hỗ trợ bộ nhớ ngoài, thì theo lý thuyết đó là tất cả những gì bạn phải biết địa chỉ nào trong không gian địa chỉ bộ xử lý được ánh xạ tới bộ nhớ ngoài đó và đọc và ghi sẽ gây ra truy cập bộ nhớ ngoài.

Máy tính dựa trên Intel, PC, có xu hướng thích một không gian địa chỉ phẳng lớn, sử dụng lệnh lspci trên hộp Linux của bạn (nếu bạn có) hoặc lệnh khác nếu cửa sổ hoặc mac và bạn sẽ thấy video của mình thẻ đã được cấp một đoạn địa chỉ.Nếu bạn vượt qua được sự bảo vệ của hệ điều hành/cpu và ghi vào một địa chỉ trong không gian đó, nó sẽ xử lý ngay bộ xử lý thông qua bộ điều khiển pcie và vào card màn hình, hoặc gây ra sự tàn phá hoặc có thể thay đổi màu sắc của pixel. Bạn đã xử lý điều này với avr và msp430s của bạn. Một số địa chỉ trong không gian địa chỉ là flash, và một số là ram, có một số logic bên ngoài lõi cpu nhìn vào lõi CPU cpu địa chỉ và đưa ra quyết định về nơi để gửi truy cập đó. Cho đến nay, ngân hàng flash và ngân hàng ram và logic đều nằm trong ranh giới của con chip, đây không phải là quá xa so với logic phản ứng với một địa chỉ, và từ đó tạo ra một chu kỳ bộ nhớ ngoài, khi nó được thực hiện hoặc kết quả trở lại trên một đọc nó hoàn thành chu kỳ bộ nhớ nội bộ và bạn đi vào điều tiếp theo.

Điều đó có ý nghĩa gì không hoặc tôi có làm cho nó tồi tệ hơn không?

+0

Điều đó làm cho cảm giác hoàn hảo với tôi, một điều tôi vẫn không nhận được khá: tôi sẽ cần phải tự phân bổ các biến trong ram bên ngoài/nội bộ trong C? Tôi sẽ không mong đợi ngăn xếp đủ thông minh để nhảy ranh giới bên trong/bên ngoài nhưng nếu tôi khai báo một tấn các biến toàn cục thì sao? Có cách nào để nói một cái gì đó như "đặt biến này trong ram nội bộ nếu nó phù hợp, nếu không, làm cho nó sống trên ram bên ngoài"? – nightrain

+0

các loại câu hỏi đó không dành riêng cho bộ nhớ ngoài, bạn phải quản lý bộ nhớ của mình bất kể bạn đang sử dụng nền tảng nào. Bạn có thể sẽ cần phải kiểm soát của mối liên kết để đặt bất cứ điều gì nó là bạn muốn đặt trong bộ nhớ đó. chạy trên một hệ thống nhúng, bạn phải quản lý stack và heap của bạn nếu bạn sử dụng một để đảm bảo không va chạm với một cái gì đó. tấn globals là một cách an toàn để làm điều đó nhưng không nhất thiết phải bộ nhớ hiệu quả. –

+1

cho công cụ gnu/gcc có một tập lệnh liên kết hoặc bạn đã viết hoặc nó được chôn trong trình biên dịch ở đâu đó và tập lệnh được chọn dựa trên có lẽ bộ vi xử lý hoặc loại hệ thống bạn đã chọn. bạn có thể ghi đè lên mặc dù và sử dụng của riêng bạn. Các kịch bản liên kết gnu/gcc có thể cấu hình và mạnh mẽ đến một điểm mà chúng có thể gây đau đớn khi tạo và sử dụng, bạn có thể điều chỉnh vị trí cho từng tệp, thậm chí có thể xuống chức năng hoặc biến. Thông thường bạn muốn ngăn xếp của bạn trong bộ nhớ nhanh nhất. –

0

Bạn có thể sử dụng thanh ghi từ dành riêng để đề xuất với trình biên dịch để biến biến đó vào một vị trí bộ nhớ trong: đăng ký int iInside; Thận trọng; trình biên dịch biết có bao nhiêu byte của bộ nhớ đăng ký có sẵn, và khi tất cả không gian có sẵn đã biến mất, nó sẽ không thành vấn đề.

Chỉ sử dụng các biến đăng ký cho những thứ sẽ được sử dụng rất, rất thường xuyên, chẳng hạn như bộ đếm.

+0

'RAM nội bộ' không có nghĩa là thanh ghi CPU. OP cũng muốn làm điều ngược lại: sử dụng bộ nhớ ngoài (một con chip tách biệt với µC) –

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