Tôi có một số dữ liệu liên tục mà tôi muốn lưu trữ trong ROM vì có một số tiền hợp lý và tôi đang làm việc với thiết bị được gắn với bộ nhớ ARM7 bị hạn chế về bộ nhớ. Tôi đang cố gắng để làm điều này sử dụng cấu trúc giống như thế này:lưu trữ cấu trúc trong ROM trên thiết bị ARM
struct objdef
{
int x;
int y;
bool (*function_ptr)(int);
some_other_struct * const struct_array; // array of similar structures
const void* vp; // previously ommittted to shorten code
}
mà tôi sau đó tạo và khởi tạo như globals:
const objdef def_instance = { 2, 3, function, array, NULL };
Tuy nhiên, điều này ngốn khá nhiều RAM mặc dù const
ngay từ đầu. Cụ thể hơn, nó làm tăng đáng kể lượng dữ liệu RW và cuối cùng làm cho thiết bị bị khóa nếu đủ trường hợp được tạo ra.
Tôi đang sử dụng uVision và trình biên dịch ARM, cùng với nhân RTX thời gian thực.
Có ai biết tại sao điều này không hoạt động hoặc biết cách tốt hơn để lưu trữ dữ liệu có cấu trúc không đồng nhất trong ROM?
Cập nhật
Cảm ơn tất cả các bạn cho câu trả lời của bạn và lời xin lỗi của tôi vì đã không liên lạc lại với các bạn trước đó. Vì vậy, đây là điểm số cho đến nay và một số quan sát bổ sung về phía tôi.
Đáng buồn thay, __attribute__
không ảnh hưởng đến RAM so với ROM và điều tương tự cũng xảy ra với static const
. Tôi chưa có thời gian để thử tuyến đường lắp ráp.
Đồng nghiệp của tôi và tôi đã phát hiện ra một số hành vi bất thường hơn.
Trước tiên, tôi phải lưu ý rằng vì mục đích đơn giản, tôi đã không đề cập đến cấu trúc objdef
của tôi có chứa trường const void*
. Các lĩnh vực đôi khi được gán một giá trị từ một bảng chuỗi định nghĩa là
char const * const string_table [ROWS][COLS] =
{
{ "row1_1", "row1_2", "row1_3" },
{ "row2_1", "row2_2", "row2_3" },
...
}
const objdef def_instance = { 2, 3, function, array, NULL };//->ROM
const objdef def_instance = { 2, 3, function, array, string_table[0][0] };//->RAM
string_table
là trong ROM như mong đợi. Và đây là kicker: các trường hợp của objdef
được đưa vào ROM cho đến khi một trong các giá trị trong string_table
được gán cho trường const void*
đó. Sau đó, cá thể struct được chuyển sang RAM.
Nhưng khi string_table
được thay đổi để
char const string_table [ROWS][COLS][MAX_CHARS] =
{
{ "row1_1", "row1_2", "row1_3" },
{ "row2_1", "row2_2", "row2_3" },
...
}
const objdef def_instance = { 2, 3,function, array, NULL };//->ROM
const objdef def_instance = { 2, 3, function, array, string_table[0][0] };//->ROM
những trường hợp objdef
được đặt trong ROM mặc dù trước đó const void*
assigment. Tôi không biết tại sao điều này lại quan trọng.
Tôi bắt đầu nghi ngờ rằng Dan nói đúng và cấu hình của chúng tôi bị rối ở đâu đó.
Hãy thử khai báo là 'static const'. Tôi nhận thấy một số trình biên dịch sẽ sao chép dữ liệu từ ROM để ngăn xếp khi nó chỉ được khai báo là 'const'; truy cập trực tiếp vào ROM xảy ra khi 'static const' được áp dụng. –
C++ 'const' không có nghĩa là" chỉ đọc thực ". Bạn có thể có const_cast, cho một điều .. –
Tôi biết bạn luôn có thể thực hiện một const_cast, nhưng tôi đã xem qua một số tài nguyên trên web đã đề xuất sử dụng 'const' để lấy dữ liệu được lưu trữ trong ROM. Ngoài ra, tôi đã học được thông qua kinh nghiệm rằng 'const' đôi khi nhưng không phải lúc nào cũng có hiệu ứng này. Rõ ràng là tôi không hoàn toàn rõ ràng về thời điểm hoặc lý do. :) – dandan78