|
|
  |
Снова про const, не получается переползти с С на СРР |
|
|
|
Jan 10 2011, 06:05
|

Местный
  
Группа: Участник
Сообщений: 374
Регистрация: 7-11-07
Из: Moscow
Пользователь №: 32 131

|
Искал свою проблему в форуме, но не нашел решения. Проблема в следующем. Имеется готовый проект на С для IAR-430A, кристаллы ARM ST91х. Использую структуры, состоящие из данных-констант вида: Код typedef struct{ const Tsome_type some_data1; const Tsome_type some_data2; // ...etc } Tsome_info; Затем в коде на С создаю эти структуры с уже конкретными константами в полях Код const Tsome_info info1={,,,,,}; const Tsome_info info2={,,,,,}; const Tsome_info info3={,,,,,}; //..etc На С все прекрасно живет, компилятор помещает мои структуры в сегмент CONST, а линкер- в ROM. Но, тот же самый код на СPP приводит к размещению структур в сегменте CSTACK вместе с другими объектами. В результате куча констант хранится в RAM, которой и так мало! Я в шоке.  Можно ли как-то победить эту проблему? Или придется перелопачивать идеологию проекта?
|
|
|
|
|
Jan 10 2011, 06:41
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (Aprox @ Jan 10 2011, 11:05)  На С все прекрасно живет, компилятор помещает мои структуры в сегмент CONST, а линкер- в ROM. Но, тот же самый код на СPP приводит к размещению структур в сегменте CSTACK вместе с другими объектами. Странно это. Разница между C и C++ в плане const лишь в том, что в C++ константы по-умолчанию имеют локальную область видимости, что соответствует static const в C. Чтобы получить константы с глобальной областью видимости, их надо определять через extern const type = value; Но это никак не связано с размещением на стеке. Приведите побольше кода, попробуем разобраться.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 10 2011, 06:46
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Ну и оставьте свои Код const Tsome_info info1={,,,,,}; ... в С-ом модуле, а в .h файле объявите их как Код #ifdef __cplusplus
extern "C" const Tsome_info info1;
#else
extern const Tsome_info info1;
#endif
|
|
|
|
|
Jan 10 2011, 08:58
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (Aprox @ Jan 10 2011, 12:55)  Чисто на CPP создавать структуры из данных-констант в ROM видимо не получится. В руководстве прочитал, что объекты и структуры компилятор СРР IAR размещает в сегмент CSTACK, который затем в RAM. Уже несколько лет пользуюсь ИАРом 4.30, пишу на C++, и он все константы прекрасно располагает во флеше: CODE 9 struct my_type 10 { 11 int a; 12 int b; 13 }; 14
\ In segment DATA_C, align 4, align-sorted 15 extern my_type const aa = {1,2}; \ aa: \ 00000000 010000000200 DC32 1, 2 \ 0000
\ In segment DATA_C, align 4, align-sorted 16 extern my_type const bb = {3,4}; \ bb: \ 00000000 030000000400 DC32 3, 4 \ 0000 А вы эти константы случайно не внутри функции без static объявляете?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 10 2011, 16:44
|

Местный
  
Группа: Участник
Сообщений: 374
Регистрация: 7-11-07
Из: Moscow
Пользователь №: 32 131

|
Цитата(sergeeff @ Jan 10 2011, 14:05)  В общем случае надо явно компилятору/линкеру сообщить, какие данные в каком именно сегменте вы хотите расположить, а не просто использовать размещение по умолчанию. Синтаксис таких команд сильно зависит от применяемой связки компилятор/линкер. Почитайте документацию, это не очень сложно. Понимаете, я хотел получить упрощение написания программ за счет перехода на обьектное программирование, а получается, надо разбираться в куче дополнительных подробностей, которые сводят на нет преимущества СРР. Понятно, что директивами pragma можно рулить сегментами. Но зачем эти сложности и лишний раз тыкать в клавиатуру? В кодах на "С" все нужное происходит автоматом. Кроме того, я четко видел в мануале- объекты и структуры помещаются в один сегмент данных. И тут, наверное, уже никакими ухищрениями их не разъединить. Цитата(Сергей Борщ @ Jan 10 2011, 14:58)  Уже несколько лет пользуюсь ИАРом 4.30, пишу на C++, и он все константы прекрасно располагает во флеше: Вот мой участок кода, который структуру из констант размещает в RAM. Тестовая программа в файле с расширением .cpp, т.е. будет работать СРР компилятор. Код #include <stdlib.h> #include <stdio.h> #include <string.h> #include <stdbool.h>
typedef struct{ const char* row[2]; } TFormInfo;
int main() { const TFormInfo form_info ={ "row1", "row2" };
return 0; } Пробежав симулятором от main до return, открываем структуру в QuickWatch и видим- она размещена в RAM.
|
|
|
|
|
Jan 10 2011, 16:58
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Вы должны четко понять, что С и С++ это разные компиляторы. Сам С++ существенно строже работает с разными типами данных и это сделано для повышения надежности и безопасности генерируемого кода. В приведенном вами примере структура будет располагаться в стеке, так как объявлена внутри функции, соответственно в RAM. Коллега Борщ советовал вам ее объявить как: Код static const TFormInfo form_info ={ "row1", "row2" }; Попробуйте! Да, и кто вам сказал, что программа на С++ будет проще, чем на С? Там своих заморочек будет предостаточно, особенно на этапе его освоения.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|