Tại sao thực thi mã từ RAM?


27

Tôi vừa bắt gặp một số macro cho trình biên dịch vi điều khiển của mình để buộc (hoặc đề xuất) một chức năng được thực thi từ RAM.

https://siliconlabs.github.io/Gecko_SDK_Doc/efr32mg1/html/group__RAMFUNC.html#gac6abbc7f869eec9fb47e57427587c556

http: // Processors.wiki.ti.com/index.php/Places_fiances_in_RAM

https://www.iar.com/support/tech-notes/linker/controlling-plocation-of-the-section-where-__ramfunc-fifts-reside-ewarm-5.x--6.x/

https://community.nxp.com/thread/389099

Trong trường hợp này là có giá trị? Tại sao tôi không luôn luôn thực hiện từ RAM nếu lợi ích chỉ tăng tốc độ? Điều này thường gây ra vẽ hiện tại cao hơn?


13
Mã thực thi từ RAM rút ra ít dòng điện hơn (tôi không chắc liệu nó có đúng với tất cả CPU / SoC không). Tôi đã từng thực hiện một dự án nơi chúng tôi đặt hầu hết mã vào RAM vì đó là thiết bị pin và chúng tôi muốn nó tồn tại càng lâu càng tốt. Nếu bạn chỉ có thể thực thi mã từ RAM, bạn thậm chí có thể tắt nguồn các khối flash trên một số SoC và tiết kiệm năng lượng hơn nữa.
Al Bundy

4
@pipe - Tôi tưởng tượng lý do để đưa ra nhận xét thay vì trả lời là vì nó không trả lời câu hỏi thực tế, đó là lý do tại sao bạn không muốn luôn sử dụng RAM để thực thi mã của mình.
Jules

1
@Jules Vâng, tôi tưởng tượng nó có nghĩa là một "giai thoại hữu ích". Những thứ Stack Exchange được thiết kế để ngăn chặn, vì những lý do rất tốt.
đường ống

1
Bởi vì bạn không có đủ thanh ghi để thực hiện từ đăng ký. (Tôi có con chip đó.)
Joshua

Ngoài tất cả mọi thứ: thực thi mã từ RAM động đặc biệt có thể là một phần của một vụ hack phần mềm phức tạp để duy trì việc làm mới DRAM. :)
Kaz

Câu trả lời:


32

Ngoài tốc độ và các tính năng khác mà những người khác đã đề cập, việc thực thi mã từ RAM có thể hữu ích trong bộ tải khởi động, nơi bạn cần lập trình lại đèn flash siêu nhỏ của mình - bạn không thể thực thi mã từ flash mà bạn đang xóa & lập trình lại.


4
phụ thuộc vào số lượng khối flash bạn có và bộ tải khởi động của bạn cho phép sửa đổi, số lượng ram bạn còn lại để tạo dữ liệu cho khối tiếp theo, v.v. nhưng đúng là để trampoline tắt flash để bạn có thể sửa đổi flash flash tốt cho điều đó ...
old_timer

1
Điều này dường như chỉ trả lời một nửa câu hỏi (phần tiêu đề). OP cũng đã hỏi "Tại sao tôi không luôn luôn thực thi từ RAM nếu lợi ích chỉ tăng tốc độ?", Và câu trả lời này không giải thích tại sao người ta có thể không muốn thực thi từ RAM.
Doktor J

2
Cho đến nay là tốt, nhưng điều gì xảy ra nếu bạn mất năng lượng (và do đó RAM) ở giữa đèn flash viết lại? Điều này có thể được giải quyết, nhưng giống như bất kỳ thiết kế nào khác cho bộ nạp khởi động, nó phải được xem xét.
AaronD

19

Tôi đã không nhìn vào bảng dữ liệu cho micro đó. Tuy nhiên, trong trường hợp này, việc tìm nạp từ RAM nhanh hơn so với tìm nạp từ flash mà bộ nhớ chương trình được triển khai từ đó.

Ưu điểm của flash là số lượng lớn có thể tương đối rẻ. Do đó, các nhà sản xuất vi điều khiển đôi khi đặt rất nhiều đèn flash vào chip, sau đó cung cấp không gian RAM hạn chế hơn mà mã có thể thực thi. Điều này cho phép sao chép các thói quen quan trọng về thời gian vào RAM, sau đó thực hiện chúng từ đó.

Công cụ biên dịch mà bạn tham khảo có thể hoạt động với trình liên kết và gắn cờ phần flash được sao chép vào RAM bằng mã thời gian chạy trình biên dịch chạy từ thiết lập lại. Thực hiện khác nhau sẽ khác nhau về các chi tiết.


17

Khi bạn muốn thực thi trong RAM vì nó nhanh hơn, thường là do RAM đó là SRAM trên chip. Đây là một nguồn tài nguyên khan hiếm, mà bạn có thể sẽ muốn cho dữ liệu yêu cầu quyền truy cập đọc / ghi.

Sử dụng nó cho mã khi bạn đã mã trong ROM / flash có nghĩa là bạn cần X lượng flash và một lượng RAM X bổ sung.

Nó cũng đòi hỏi một giai đoạn sao chép thêm khi khởi động hoặc khi bạn muốn chạy nó, mặc dù nó hầu như không đáng kể.

Theo truyền thống, điều này được giải quyết với bộ đệm hướng dẫn, nhưng trong vi điều khiển, có thể có ý nghĩa hơn để giữ chung SRAM bên trong, vì bạn không sử dụng vi điều khiển vì bạn muốn tốc độ thực thi nhanh nhất.

Ngoài ra còn có một vấn đề về độ tin cậy - việc thực thi mã trong ROM thực tế rất khó sửa đổi bằng mã lỗi.


14

Ngoài tất cả các câu trả lời hay:

Tại sao tôi không luôn luôn thực hiện từ RAM nếu lợi ích chỉ tăng tốc độ?

Bởi vì trong một hệ thống nhúng, thông thường bạn không có đủ dung lượng RAM cần thiết. Ví dụ: STM32 có 32kB hoặc RAM và 512kB EEPROM. Để có thể thực thi toàn bộ chương trình trong RAM, bạn sẽ cần kích thước RAM lớn hơn EEPROM.


5
"Bởi vì trong một hệ thống nhúng, thường bạn không có số tiền yêu cầu bộ nhớ RAM." - và bởi vì nếu bạn làm có đủ RAM để làm điều này, bạn gần như chắc chắn có thể giảm chi phí bằng cách chuyển sang một MCU rẻ hơn với ít RAM. Bởi vì nếu bạn đang đặt câu hỏi, luôn có MCU rẻ hơn với ít RAM hơn (MCU nhỏ nhất và rẻ nhất sử dụng kiến ​​trúc Harvard nên không thể thực thi từ RAM)
Jules

13

Các câu trả lời khác dường như không thảo luận nhiều về mức tiêu thụ năng lượng mà bạn đã hỏi cụ thể.

Câu trả lời là nó phụ thuộc phần nào vào vi điều khiển, nhưng thường việc thực thi từ RAM có thể giảm mức tiêu thụ điện năng vì nó đòi hỏi ít năng lượng hơn để đọc hướng dẫn từ RAM so với từ bộ nhớ flash.

Một cách sử dụng thông thường sẽ là chạy chức năng "ngủ" năng lượng thấp từ RAM, với bộ nhớ flash được tắt. Không chỉ giảm mức tiêu thụ điện, mà nếu vi điều khiển cần thức dậy nhanh chóng (ví dụ như phản ứng với ngắt ngoài) thì không có độ trễ trong khi bộ nhớ flash được cấp nguồn trở lại.

Một số bộ phận, chẳng hạn như một số dòng Atmel SAM, có RAM năng lượng cực thấp đặc biệt có thể được sử dụng cho mục đích này. Điều này cho phép một lượng nhỏ mã được nạp vào RAM đặc biệt, trong khi phần lớn RAM có sẵn và tất cả các bộ nhớ khác bị tắt và vi điều khiển chuyển sang chế độ ngủ sâu.


7

Khác với những lợi ích tốc độ tiềm năng được đề cập bởi những người khác, mã RAM cũng rất năng động và có thể được sửa đổi nhanh chóng bằng một số mã may đo trong FLASH theo yêu cầu.

Điều này có thể đơn giản như thay đổi một vài tham số hoặc có thể là toàn bộ các trình xử lý được tải lên từ xa.


Hoặc mã trong RAM có thể được tải từ đĩa (ví dụ: SD) hoặc mạng
teambob

4

Thực thi mã từ RAM nhanh hơn đáng kể so với thực thi mã từ bộ nhớ flash. Hầu hết các CPU được tối ưu hóa mạnh mẽ để truy cập RAM nhanh nhất có thể và ngay cả bộ nhớ flash nhanh nhất cũng chỉ đạt được một phần tốc độ của RAM.

Tuy nhiên, hãy nhớ rằng việc chuyển mã từ flash sang RAM cũng mất thời gian. Nếu mã chỉ được thực thi một lần, bạn chỉ cần đọc nó một lần và do đó bạn thực sự sẽ mất thời gian để sao chép nó vào RAM trước thay vì thực thi trực tiếp. Nếu mã thỉnh thoảng được thực thi (vì vậy sao chép mã vào RAM sẽ tăng khả năng thực thi lần thứ hai), nhưng hệ thống thường không hoạt động, thì bạn sẽ thực thi mã đó nhanh hơn bằng cách sao chép mã vào RAM, nhưng không ai quan tâm, vì hệ thống có đủ thời gian để chi tiêu

Vì vậy, tối ưu hóa như vậy chỉ có giá trị nỗ lực, nếu mã được thực thi thường xuyên và bạn đã đo nó là một điểm nghẹt thở của hệ thống.

Mặt khác, RAM cần chủ động giữ dữ liệu được lưu trữ, trong khi bộ nhớ flash thì không, do đó tổng mức tiêu thụ điện năng tăng lên, nếu RAM cần được duy trì hoạt động. Tuy nhiên, điều này chỉ có liên quan, nếu RAM hoàn toàn không được sử dụng, nhưng hầu hết các hệ thống hiện đại sẽ - bằng cách này hay cách khác - sử dụng RAM có sẵn và do đó đã giữ cho nó hoạt động.


4

Có hai lý do rất phổ biến để thực thi mã từ RAM:

  1. Một số bộ vi xử lý không thể thực thi từ flash trong khi lập trình flash - mặc dù nhiều bộ có thể làm điều này miễn là mã nằm trong một khối khác với flash được ghi. Flash write có thể được lập trình lại ứng dụng (trường hợp bộ tải khởi động) hoặc khi flash được sử dụng để lưu trữ thông tin chương trình không bay hơi (cấu hình, hiệu chuẩn, v.v.)

  2. Trên nhiều bộ vi xử lý, RAM nhanh hơn nhiều so với flash. Đối với các thiết bị này, các thói quen quan trọng về tốc độ nhỏ có thể được thực thi từ RAM, mặc dù thông thường RAM được cung cấp ngắn hơn nhiều so với flash.


2

Một usecase khác cho RAM chỉ thực hiện bảo mật đối với các bitflips ngẫu nhiên. Chúng tôi sử dụng mô hình này trên cubesat nhỏ của chúng tôi vì bo mạch máy tính chính có ram ECC chịu được bitflips do bức xạ. Toàn bộ hệ điều hành được tải vào ram dưới dạng ramdisk khi khởi động chạy hoàn toàn trong môi trường ECC.

Đèn flash không được bảo vệ ECC (tiêu chuẩn ngoài thẻ micro SD) tuy nhiên chúng tôi có các phương pháp khác để kiểm tra tham nhũng (nhiều hình ảnh, tổng kiểm, v.v.)


Tôi đã giả định rằng một cái gì đó như EEPROM hoặc flash sẽ "khó" hơn nhiều đối với bitflip bởi bức xạ, nghĩa là, đòi hỏi nhiều năng lượng hơn.
đường ống

Quả thực là như vậy, nhưng vì chúng tôi chỉ sử dụng đèn flash tiêu chuẩn không có tính năng ECC đặc biệt, sử dụng ram sẽ tốt hơn nhiều cho mục đích này.
Tejas Kale
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.