2012-06-11 18 views
6

Tôi biên dịch cho LPC1114, một ARM nhỏ (thực sự là Cortex) đích. RAM bị hạn chế nhiều hơn ROM. Tôi sử dụng trình biên dịch GCC (CodeBenchLite) mới nhất của Mentor (GCC 4.6.3). Tôi có một số đối tượng liên tục mà tôi muốn có trong ROM. Theo như tôi hiểu các đối tượng ffx trong mã dưới đây nên kết thúc trong ROM (mã), nhưng thay vào đó nó được đặt trong DATA.Làm cách nào để GCC đặt một C++ constexpr trong ROM?

class flop { 
    public: 
     int x; 
     constexpr flop(int x) : x(x){} 
}; 

extern constexpr flop ffx(1); 

Làm cách nào để thuyết phục trình biên dịch tính toán đối tượng và đặt nó trong ROM?

hoặc có lẽ tôi nên hỏi:

  • tôi làm cách nào mong đợi G ++ để tạo ra dữ liệu ROMable cho FFX
  • nếu như vậy, là mã của tôi chính xác cho này
  • nếu như vậy, mà G ++ phiên bản này được hỗ trợ (tôi sử dụng 4.6, có lẽ tôi cần 4.7?)

============================= ==========

Mục nhập lỗi này c++/49673 dường như chỉ ra rằng tôi là một vấn đề đã biết, có thể được khắc phục trong GCC 4.7. Thật không may tôi thích sử dụng Mentor/CodeSourcery được xây dựng, vẫn còn ở 4.6.3. Vì vậy, tôi đoán trong thời gian này tôi đang mắc kẹt với lỗi này. :(

+1

Tôi không biết kiến ​​trúc, nhưng dường như không phải là một oxymoron để cố gắng * ghi * vào * bộ nhớ chỉ đọc *? –

+1

@JohnDibling: có vẻ như nó, nhưng bạn đã sai. Các bộ vi xử lý nhỏ thường có cách để flash chương trình của bạn sang ROM. –

+0

Không có gì mà tiêu chuẩn C++ sẽ cung cấp cho bạn. Tuy nhiên, bạn có thể thử * phân tán tải * như mô tả ở đây: [Định vị mã và dữ liệu trong bộ nhớ (Scatterloading)] (http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc. faqs/ka3558.html). HTH! – dirkgently

Trả lời

1

Cập nhật # 2: Kết quả thử nghiệm với gcc 4.7.0

Đây thực sự là cố định trong gcc 4.7.0 Mã của bạn sản xuất ra sản lượng lắp ráp sau:.

.file "constexpr.cpp" 
    .globl _ffx 
    .section .rdata,"dr" 
    .align 4 
_ffx: 
    .long 1 

đó là những gì bạn có thể muốn. Nâng cấp?

Tôi nghĩ bạn cần một giải pháp cụ thể cho nền tảng này.Xem Locating code and data in memory (Scatterloading):

Phân đoạn tải lên cho phép bạn phân vùng ứng dụng thành một số mã và vùng dữ liệu riêng biệt trải rộng trên bản đồ địa chỉ. Vị trí của các khu vực này có thể khác nhau giữa thời gian tải và thời gian chạy:

  1. Khu vực tải chứa mã ứng dụng và/hoặc dữ liệu được sử dụng tại thời gian bật/tải (thường là ROM).

Thay vì dựa vào gcc một mình, hãy cố gắng tận dụng armlink như đề xuất trong các liên kết được cung cấp ở trên.

Cập nhật: Tôi thấy lỗi gcc mà bạn đã lưu ý. LLVM/MinGW cũng vô vọng. Tuy nhiên, tôi đã được chơi đùa với GCC 4.6 và đây là điều mà tôi nghĩ thể giúp bạn:

struct Data 
{ 
    int i;  
}; 
constexpr Data getData() { return Data{1}; } 

Nếu thay vì có một ctor, bạn có một hàm constexpr, và cố gắng để tạo ra sản lượng lắp ráp, đầu ra thường sẽ trống (không có các phần .data).Và nếu bạn sử dụng để khởi tạo một số biến (trong phạm vi toàn cầu) như sau:

const Data foo = getData(); 

bạn muốn có được một hội đồng như sau:

.file "constexpr.cpp" 
    .section .rdata,"dr" 
    .align 4 
__ZL3foo: 
    .long 1 

(đây là với g++ -std=c++0x -S dòng lệnh). Điều đó có hiệu quả với bạn không?

+0

Xem nhận xét của tôi về câu trả lời của Travis (và tôi đã chỉnh sửa câu hỏi): vấn đề là trình biên dịch đang đặt RAM và tạo mã khởi tạo, thay vì tạo ra dữ liệu hằng số được khởi tạo. –

+0

@WoutervanOoijen: Tôi nghĩ rằng nó có thể liên quan đến thực tế là một ctor là một hàm thành viên đặc biệt và trình biên dịch tạo ra bit bit đó để đảm bảo mọi thứ diễn ra tốt đẹp. Liệu đầu ra có thay đổi với cờ tối ưu hóa được bật (tôi không nghĩ rằng nó sẽ nhưng tôi đoán nó có giá trị một thử). Dù sao, tôi đã cập nhật câu trả lời của tôi với các điều tra mới nhất của tôi và nó có thể giúp bạn. – dirkgently

+0

Có, điều đó kết thúc bằng .rodata, nhưng nó không giúp tôi nhiều: mã tôi đã cho thấy là một ví dụ đơn giản, tôi cần một đối tượng lớp với một ctor không tầm thường (nhưng vẫn constexpr). Cảm ơn bạn đã kiểm tra LLVM. –

0

Theo kinh nghiệm của tôi, dữ liệu const được đặt vào phần chỉ đọc, vì vậy tất cả dữ liệu trong phần này có thể đi vào ROM (hoặc được lập trình thành FLASH).

Tệp hướng dẫn trình liên kết GCC (* .ld), có thể gán địa chỉ cho các phần khác nhau.

Một cách khác là đặt các cấu trúc dữ liệu lớn (chẳng hạn như phông chữ) vào ngôn ngữ assembly. Ngôn ngữ lắp ráp có thể đặt dữ liệu vào các phân đoạn dễ dàng hơn so với ngôn ngữ C hoặc C++.

Một trong những mục tiêu tiếp theo của chúng tôi là tách dữ liệu khỏi tệp thực thi của chúng tôi. Điều này rút ngắn tệp thực thi và giảm thời gian thử nghiệm trên tệp thực thi.

+0

Một đối tượng const có bộ khởi tạo (không tầm thường?) Sẽ không được đặt trong ROM. Một trong những lý do cho constexpr là (theo như tôi hiểu) để làm điều này có thể, nhưng nó dường như không xảy ra cho tôi.(constexpr là cấu trúc C++ 0x09/11 mạnh hơn (và ngụ ý) const). –

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