реклама на сайте
подробности

 
 
4 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Снова про const, не получается переползти с С на СРР
Aprox
сообщение Jan 10 2011, 06:05
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 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, которой и так мало! Я в шоке. wacko.gif Можно ли как-то победить эту проблему? Или придется перелопачивать идеологию проекта?


Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 10 2011, 06:41
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jan 10 2011, 06:46
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 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


Go to the top of the page
 
+Quote Post
Aprox
сообщение Jan 10 2011, 07:55
Сообщение #4


Местный
***

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



Спасибо за идею! Действительно, проект можно составить из модулей, написанных и на С и на СРР. Чисто на CPP создавать структуры из данных-констант в ROM видимо не получится. В руководстве прочитал, что объекты и структуры компилятор СРР IAR размещает в сегмент CSTACK, который затем в RAM.

В принципе задача следующая. В проекте создается много объектов визуализации и редактирования разнородных переменных. Каждый объект имеет свое описание в виде набора неизменных свойств/параметров, этой визуализации.
Помещать эти свойства в виде данных в состав класса - неразумный расход RAM. Я решил поместить в класс только ссылку на структуру из свойств-констант. И вот тут-то меня ждал описанный выше облом- такую структуру нельзя создавать в теле кода на СPP. Выход найден. Но насколько он идейный? Как люди поступают в подобных случаях?


Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jan 10 2011, 08:05
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



В общем случае надо явно компилятору/линкеру сообщить, какие данные в каком именно сегменте вы хотите расположить, а не просто использовать размещение по умолчанию. Синтаксис таких команд сильно зависит от применяемой связки компилятор/линкер. Почитайте документацию, это не очень сложно.
Go to the top of the page
 
+Quote Post
dimka76
сообщение Jan 10 2011, 08:24
Сообщение #6


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



А если IAR посвежее взять может там что-то изменили.


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 10 2011, 08:58
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
Aprox
сообщение Jan 10 2011, 16:44
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 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.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jan 10 2011, 16:58
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Вы должны четко понять, что С и С++ это разные компиляторы. Сам С++ существенно строже работает с разными типами данных и это сделано для повышения надежности и безопасности генерируемого кода.

В приведенном вами примере структура будет располагаться в стеке, так как объявлена внутри функции, соответственно в RAM. Коллега Борщ советовал вам ее объявить как:

Код
static const TFormInfo form_info ={
   "row1",
   "row2"
  };

Попробуйте!

Да, и кто вам сказал, что программа на С++ будет проще, чем на С? Там своих заморочек будет предостаточно, особенно на этапе его освоения.
Go to the top of the page
 
+Quote Post
Oldring
сообщение Jan 10 2011, 17:15
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874



Цитата(Aprox @ Jan 10 2011, 12:05) *
Я в шоке.


В плюсах модификатор const не гарантирует, что объект не будет изменяться во время работы программы. Для программ обычных компов это не критично. Для встроенных систем изучайте тонкости настроек компилятора, с целью заставить его поместить объект в ROM.


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 10 2011, 20:11
Сообщение #11


Гуру
******

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



QUOTE (Aprox @ Jan 10 2011, 21:44) *
Вот мой участок кода, который структуру из констант размещает в RAM.
Никто не дает гарантии, что С-компилятор разместит эту структуру во флеше. Локальные автоматические переменные компилятор размещает в регистрах или на стеке. Квалификатор const запрещает обращение на запись к такой переменной, не более. И лишь объявление локальной переменной с квалификатором static делает такую переменную неавтоматической и позволяет разместить ее в сегменте DATA_C. Добавьте static к своей переменной и в С и С++ программе - переменная ляжет во флешь.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Aprox
сообщение Jan 11 2011, 00:36
Сообщение #12


Местный
***

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



Спасибо огромное! Действительно, попробовал поместить структуру констант в область глобальных переменных и она легла во флешь. Еще раз спасибо, что помогли распутать ситуацию. rolleyes.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 11 2011, 03:36
Сообщение #13


Гуру
******

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



QUOTE (Aprox @ Jan 11 2011, 05:36) *
Действительно, попробовал поместить структуру констант в область глобальных переменных и она легла во флешь.
Хотя достаточно было сделать ее статической, оставив локальной. Хозяин - барин...


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Aprox
сообщение Jan 11 2011, 05:55
Сообщение #14


Местный
***

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



Цитата(Сергей Борщ @ Jan 11 2011, 09:36) *
Хотя достаточно было сделать ее статической, оставив локальной. Хозяин - барин...
Да, спасибо. Я просто хотел сделать точно также, как раньше писал на С. Теперь вижу,- был неправ, разницы нет. Ваши советы навели на мысль, что в старом проекте на С декларации констант локально приводили к их размещению в RAM. Пойду сейчас проверять и исправлять.

Go to the top of the page
 
+Quote Post
dxp
сообщение Jan 11 2011, 08:53
Сообщение #15


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(Oldring @ Jan 11 2011, 02:15) *
В плюсах модификатор const не гарантирует, что объект не будет изменяться во время работы программы.

Это как это? А что же тогда он гарантирует? И почему "в плюсах"? А в голом Цэ по-иному строится отношение к константным объектам?

Квалификатор const не гарантирует, что объект будет размещаться в ПЗУ (если оно вообще есть в наличие), это да. А насчет изменения очень даже гарантирует. И чтобы это обойти, придется использовать хаки (на свой страх и риск, ессно).


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post

4 страниц V   1 2 3 > » 
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th July 2025 - 05:48
Рейтинг@Mail.ru


Страница сгенерированна за 0.015 секунд с 7
ELECTRONIX ©2004-2016