2015-05-28 5 views
1

Целью является размещение большого массива постоянных данных в разделе .rodata, позволяющем получить доступ к нему из других единиц перевода. Насколько я знаю, GCC помещает данные в раздел только для чтения, если объявлено как static const. Но тогда невозможно объявить его extern в других файлах. Для нестатической массива я хотел бы сделать что-то вроде: data.c будет содержать:Размещение глобального постоянного массива в разделе .rodata.

const int data[] = {0,1,2,....} 

и data.h будет содержать:

extern const int data[]; 

Это позволит любой файл, включая data.h «видеть» эти данные. Но как бы один сделать по этому поводу:

static const int data[] = {0,1,2,....} 

Конечно, я могу определить целевой раздел в явном виде, используя __attribute __((section("name")), но я предпочитаю, чтобы избежать такого интенсивного использования артиллерии. Итак, какой самый переносимый и подходящий способ сделать требуемый?

ответ

2

Нет портативного способа поместить данные в раздел .rodata, потому что даже существование такого раздела зависит от реализации.

С учетом сказанного, вы могли бы рассмотреть вопрос о приближении к проблеме так:

extern const int * const data; 

/* ... */ 

static const int rodata[] = {0,1,2,....}; 
const int * const data = rodata; 
+0

Ну, 'rodata' не обязательно. Идея заключается в использовании памяти программ, а не памяти данных (встроенная система, ограниченная память, но большая FLASH ...). Но мне нравится твоя идея. Это просто. Я должен был хотя об этом сам :) Спасибо. –

0

этот ответ:

What is the use of "#pragma section <XYZ>" in C?

обсуждает общий способ поместить конкретный элемент данных в его собственный раздел в результирующем объектном файле

Я нашел раздел «#pragma» («rodata», «myData») во многих компиляциях RS.

Обратите внимание, что не каждый компилятор имеет эту #progma, поэтому этот метод не является полностью переносимым.

+0

Это то же самое, что использовать '__attribute ((раздел..' вещь, которую я бы предпочел избежать). –

+0

@EugeneSh. Это только половина ответа. Если вы хотите переместить данные в ячейку памяти, например L1/L2/L3 SRAM, вспышка или внешняя DRAM, вам необходимо переместить эти разделы «» в файле команд компоновщика, или они перейдут в папку памяти по умолчанию, обычно DRAM. См. Этот вопрос http://stackoverflow.com/questions/ 29784102/как к доступ-переменные-в-внешний-SDRAM/29798031 # 29798031 – user3528438