2013-02-28 29 views
6

Tôi đang lập trình ARM Cortex-R4 và tôi có một vài tệp nhị phân mà tôi muốn thực thi chúng từ TCRAM, chỉ để xem hiệu suất có tăng hay không.Làm thế nào để chạy mã từ RAM trên kiến ​​trúc ARM

Tôi biết tôi sẽ phải viết một hàm để sao chép các tệp nhị phân sang RAM (có thể được thực hiện bằng tập lệnh liên kết và biết kích thước của tệp nhị phân). Nhưng họ sẽ chạy như thế nào?

Hãy tưởng tượng điều này: nhị phân đầu tiên có func1(), func2(), func3() và func4(). Tôi muốn sao chép toàn bộ mô-đun vào TCRAM và làm cách nào để gọi một hàm ở đó? Tôi phải sử dụng một con trỏ hàm đến hàm cụ thể đó? Và nếu func4(), gọi func2() và func3() thì sao? Nếu tôi không nhầm họ sẽ chỉ vào đoạn mã nằm trong flash. Điều đó có nghĩa là tôi phải viết lại những func đó? Sử dụng con trỏ chức năng hoàn toàn? Tôi đã nói rằng chỉ có kịch bản liên kết là đủ để làm tất cả những điều này và tôi không cần phải lo lắng về bất cứ điều gì, nhưng tôi vẫn không hiểu nó hoạt động như thế nào.

Trả lời

4

Bạn có hai tùy chọn.

  1. Sao chép chúng như bạn đề xuất, biên dịch với pc relative.
  2. Sử dụng tệp trình liên kết với địa chỉ tải/chạy khác.

Một bản sao đơn giản sẽ chỉ hoạt động nếu các thường trình không sử dụng bất kỳ địa chỉ tuyệt đối tuyệt đối. Nó có thể tốt nếu họ sử dụng địa chỉ tuyệt đối tuyệt đối vì tôi đoán bạn sẽ để lại một bản sao trong RAM tiêu chuẩn. Tuy nhiên, điều này có thể không nhận được toàn bộ lợi ích của số TCM.

Với tập lệnh liên kết, bạn có thể chỉ định một vị trí LOADRUN khác.

sections { 
.text { *(.text); } >FLASH 
.tcm { 
     *(.tcm); 
    } >TCM_MEM AT>FLASH 
    .data { *(.data); } > RAM 
    .bss : NOLOAD { *(.bss); } > RAM 
} 

Lưu ý đặc biệt AT>FLASH.

Xem thêm: gnu linker map file... và nhiều nội dung khác trên luồng ngăn xếp. Các Gnu Ld manual có thông tin trên LMA phần (LOAD địa chỉ). LMA của bạn sẽ là flash, nhưng VMA (RUN địa chỉ) sẽ là TCM. Liên kết thủ công ở trên cũng cho biết cách sao chép. RAM, FLASHTCM_MEM được xác định với thông tin ld MEMORY, tùy thuộc vào địa chỉ dành cho bảng của bạn. Tất cả điều này sẽ được ghi lại trong một tập tin MAP. Đảm bảo tạo tệp MAP và kiểm tra các địa chỉ để kiểm tra lại tập lệnh ld của bạn.

Trường hợp thứ 2 cũng yêu cầu bản sao (lúc khởi động hoặc ít nhất trước khi sử dụng chức năng TCM đầu tiên). Tuy nhiên, trình biên dịch có thể sử dụng địa chỉ tuyệt đối tuyệt đối và chúng sẽ nằm trong bộ nhớ TCM. Ngoài ra, bất kỳ chức năng nào trong chính DRAM đều có thể gọi trực tiếp chức năng TCM. Với trường hợp đầu tiên, bạn phải sử dụng các con trỏ hàm để gọi mã số TCM. Nếu bạn muốn các biến số toàn cầu được đặt trong bộ nhớ này, bạn có thể sử dụng các thuộc tính để đặt chúng trong các phần khác nhau và sử dụng gnu ld để đặt chúng một cách thích hợp.Tôi nghĩ rằng có ITCMDTCM? Vì vậy, có thể điều này không áp dụng cho bạn, hoặc bạn cần hai phần.

Tập lệnh trình liên kết tổng quát hơn và sẽ hoạt động tốt nhất nếu bạn đặt chức năng phức tạp trong TCM. Chỉ cần sử dụng -fpic, v.v. và sao chép có thể khiến mọi thứ hoạt động nhanh chóng, đặc biệt nếu bạn chỉ có một hàm pure.

9

On GCC: Chỉ cần đặt các chức năng trong phần .data:

__attribute__((section(".data"))) 

Nó sẽ được sao chép với phần còn lại của các biến initialzed của bạn bằng cách mã khởi động (không cần phải gây rối với The Script mối liên kết) . Bạn cũng có thể cần tùy chọn "long_call" nếu chức năng kết thúc "xa" từ phần còn lại của mã sau khi được đặt vào RAM.

__attribute__((long_call, section(".data"))) 

Ví dụ:

__attribute__((long_call, section(".data"))) void ram_foobar (void) { ... } 

Bạn có thể nhận được một cảnh báo trình biên dịch có thể được bỏ qua một cách an toàn:

Warning: ignoring changed section attributes for .data 
+0

này rất hữu ích, nhưng tôi không nghĩ rằng nó sẽ đặt các chức năng trong TCRAM là OP được yêu cầu. Điều này sẽ đặt chức năng vào ram một cách khá dễ dàng, nhưng nó sẽ không hiệu quả lắm và tùy thuộc vào kích thước thường lệ, nó có thể thực sự chậm hơn so với thực thi từ flash (do chi phí cuộc gọi). Vì vậy, điều này sẽ chỉ hữu ích tùy thuộc vào ** tại sao ** bạn cần phải đặt dữ liệu trong RAM (không phải là TCRAM theo OP); ví dụ SMC. –

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