Có cách nào để chạy mã nhị phân từ RAM không?


8

Tôi đang tìm kiếm một máy tính bảng đơn rẻ tiền mà tôi có thể lập trình bằng ngôn ngữ lắp ráp, sử dụng các phương tiện hạn chế để tải mã đối tượng từ PC và các thiết bị ngoại vi I / O đơn giản.

Lý tưởng nhất là tôi muốn có thể tự viết trong một thời gian hợp lý tất cả các mã trên máy. Tôi không muốn có một hệ điều hành theo cách này, vì tôi muốn có một chương trình ghi vào RAM một số mã và sau đó các nhánh để thực thi nó. Arduino có lẽ sẽ là lựa chọn tốt nhất của tôi, miễn là đơn giản hệ thống phù hợp với lập trình lắp ráp, nhưng nó có kiến ​​trúc Harvard và nó sẽ không cho phép tôi thực thi từ RAM.

Cách đây nhiều năm, tôi đã sử dụng CPU 8 bit kiến ​​trúc Von Neumann có thể thực thi nhánh tới bất kỳ địa chỉ nào, bất kể nó được ánh xạ tới ROM, RAM hay bất cứ thứ gì. Đây là những gì tôi muốn làm bây giờ.

Tôi có thể có thể ghi và tải vào bộ nhớ Flash một trình thông dịch mã op được ghi trong RAM, nhưng đây là một giải pháp rất phức tạp và tốn thời gian, trừ khi các máy ảo loại này đã tồn tại.

Bất kỳ đề xuất nào về cách giải quyết khác với Arduino hoặc của các bộ điều khiển vi mô khác mà tôi có thể sử dụng?

Cảm ơn!

Pierre


3
PIC32 là chip kiến ​​trúc Princeton (Von Neumann). Đó là CPU MIPS vì vậy được ghi chép và chuẩn hóa tốt, mặc dù có phần phức tạp hơn so với một AVR thấp. Các bảng chipKIT có thể được nhiều hơn theo ý thích của bạn.
Majenko

2
Mặc dù được tối ưu hóa như Kiến trúc Harvard, dòng ARM Cortex-M có thể thực thi từ RAM với mức giảm hiệu quả có thể chấp nhận được và vẫn sẽ nhanh hơn rất nhiều so với một AVR khi làm như vậy. Ít nhất một nửa tá công ty chip đưa ra các đề xuất được sử dụng rộng rãi dựa trên việc cấp phép cho lõi này, và trong khi nhiều người sử dụng các thư viện của nhà cung cấp và / hoặc bán chuẩn, thì hoàn toàn có thể tự làm tất cả dựa trên các bảng dữ liệu. Tôi đã sử dụng STM32 trước vì các bảng khám phá của họ rất rẻ, hoạt động trên Linux / OSX với các công cụ nguồn mở và có thể lập trình chip trên các bảng tùy chỉnh, nhưng hiện tại cũng đã sử dụng Kinetis.
Chris Stratton

Câu hỏi chính là tại sao? Tại sao bạn yêu cầu thực hiện ASM từ RAM? Và loại lắp ráp nào bạn muốn sử dụng? Vì mỗi kiến ​​trúc đều có ngôn ngữ riêng ... Bạn có làm điều này cho mục đích học tập không? Hoặc bạn có một mục tiêu cụ thể?
frarugi87

2
Tôi cầu xin khác biệt, tại sao tôi muốn làm điều này không liên quan đến câu hỏi tôi đã hỏi vào lúc này vì đây không phải là một cách giải quyết cho một số vấn đề khác. Tình cờ, tôi đã làm theo lời khuyên của Majenko và hiện tại tôi có Uno32 cộng với các giao diện bên ngoài đang chạy lắp ráp (và gọi các hàm C từ lắp ráp), viết mã asm đã sửa đổi của nó trong RAM và thực thi nó.
bến tàu

Forth là những gì bạn đang tìm kiếm :)
Mikael Patel

Câu trả lời:


1

Theo tôi ý tưởng phiên dịch viên khả thi hơn nhiều. Khái niệm viết, trong trình biên dịch mã, mã tự tạo mã máy, trong RAM, và sau đó thực thi nó, tự nó rất phức tạp.

Bạn đã không nói lý do tại sao bạn muốn làm điều này, vì vậy đây là một phần của vấn đề XY .

Tôi không muốn một os theo cách ...

Arduinos bình thường không có hệ điều hành theo cách này - về cơ bản mã bạn viết là những gì được tải vào chip.


2
Trong một từ, không. Không thể thực thi bộ nhớ có thể sửa đổi là một hạn chế khá bất thường trong thời đại ngày nay, nơi hầu hết các thiết bị kiến ​​trúc danh nghĩa khác của Harvard được sửa đổi để có thể tránh được giới hạn đó. Viết một trình thông dịch phần mềm sẽ giúp bạn làm việc nhiều hơn và hiệu quả hơn rất nhiều so với việc xử lý một trong nhiều chip rẻ tiền, hiệu suất cao và dễ sử dụng có các kết nối bên trong cần thiết để thực thi mã từ RAM. Hoạt động đường ống kém hiệu quả hơn một chút trong chế độ đó vẫn còn vượt xa so với giải thích phần mềm.
Chris Stratton

1
Không. Nếu bạn định thực hiện sửa đổi mã thời gian chạy, việc tạo trực tiếp mã máy dễ dàng hơn nhiều so với việc tạo mã cấp cao và cũng phải tạo trình biên dịch hoặc trình thông dịch như trong khuyến nghị của bạn. Có thể đáng để dành một chút thời gian hướng dẫn viết tay để có được một số quan điểm. Và không, "tự mình viết tất cả mã trên máy" không đề cập đến việc tạo mã thời gian để bắt đầu, mà chỉ đơn thuần là tạo ra tác phẩm gốc so với dựa vào các tác giả khác để hỗ trợ các thành phần.
Chris Stratton

1
Đây là một kiểu vỏ đơn giản cho Arduino thực thi mã từ bất kỳ kho lưu trữ bộ nhớ nào (SRAM, EEMEM, EEPROM). Không phải là trình thông dịch nhanh nhất nhưng cho thấy cách tìm nạp lệnh (truy cập bộ nhớ) và con trỏ lệnh (địa chỉ gọi / trả về) có thể được trừu tượng hóa. github.com/mikaelpatel/Arduino-Shell
Mikael Patel

1
Tôi rất ấn tượng, Mikael. Tôi đã viết một thông dịch viên Forth cho Apple II năm trước. Tôi nghi ngờ tôi thậm chí có thể tìm thấy mã những ngày này. Forth già tốt, vẫn còn sống và đá! :)
Nick Gammon

1
@NickGammon Gần đây tôi đã viết một máy ảo (fvm) truyền thống hơn cho Arduino. Nó cho phép nhúng một trình thông dịch lệnh byte trong bản phác thảo Arduino vì nó là đa tác vụ (cho phép mang lại fvm). github.com/mikaelpatel/Arduino-FVM . Có một trình biên dịch mã thông báo (chạy trên Arduino :) và trình thông dịch tương tác truyền thống. Xin vui lòng xem các bản phác thảo ví dụ.
Mikael Patel
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.