|
модификатор const. Как правильно использовать в Си |
|
|
|
Dec 22 2017, 15:39
|
Знающий
   
Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748

|
где компилятор должен расположить "переменные" такого вида: CODE // Описано глобально const u8 x_pos[][8] = { {50, 60}, {55, 62, 69, 76, 83, 90, 97, 104}, {76}, {76}, }; то же самое, описано внутри функции и то же самое внутри функции CODE static const u8 x_pos[][8] = { {50, 60}, {55, 62, 69, 76, 83, 90, 97, 104}, {76}, {76}, };
у меня есть неизменяемый массив большого размера и при входе в функцию этот констатный масив создается в стеке. если его не определить как static правильно ли это поведение или нет? в первом варианте в глобальной константе этот массив помещен в память Flash. Правильное поведение. Во втором варианте в стек - неправильное в третьем варианте во Flash память.
|
|
|
|
|
 |
Ответов
|
Dec 22 2017, 17:00
|
Знающий
   
Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842

|
Цитата(inventor @ Dec 22 2017, 19:21)  может ли компилятор поместить static const не во flash а в памяти данных? Теоретически может, но делать этого не будет, т.к. поведение задано настройками. Если говорить за gcc, то где-то в недрах проекта у вас должен быть файл с расширением *.ld в котором записано что и куда класть. Вы можете его редактировать что бы получить результат отличный от того того что по умолчанию. Цитата(Raven @ Dec 22 2017, 19:53)  А разве не должен компилятор помещать глобальные и static const объекты в .rodata секцию? (которая естественным образом ассоциируется с FLASH) А линкер может в соответствии со своим скриптом секцию запихнуть туда куда записано в скрипте.
|
|
|
|
|
Dec 22 2017, 17:07
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(Kabdim @ Dec 22 2017, 20:00)  Согласно стандарту языка Си константные данные обязаны лечь в основное адресное пространство - всё. А куда они лягут - об этом более нет ни слова. Кстати, задумайтесь над тем что будет если константные данные всегда будут лежать во флэш и чем это чревато для архитектуры AVR и не только... Совершенно легальный код станет невозможен: Код char str1[] = "xxx"; const char str2[] = "yyyy";
extern void print_str(const char* str);
print_str(str1); // норм print_str(str2); // попа Или так будет делать бессмысленно: Код volatite const int uptime; Это я к чему - крутить параметры в скриптах линкера надо не с шашой наголо, а очень и очень вдумчиво...
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Dec 24 2017, 17:36
|

Профессионал
    
Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045

|
Цитата(demiurg_spb @ Dec 22 2017, 22:07)  Согласно стандарту языка Си константные данные обязаны лечь в основное адресное пространство - всё. Что такое "основное адресное пространство"? В Си нет такого. В Си нет адресных пространств одно адресное пространство. ps и в вашем авр нет основного адр. простр. В авр гарвардская архитектура, там есть адресное пространство памяти программ и адресное пространство памяти данных. Но к стандарту Си это отношения не имеет, т.к. Си абстрагирован от архитектуры. Куда разместит - зависит от компилятора. А вообще мне тоже не понятно почему во 2-м случае в ОЗУ. Получается что эти данный размещены дважды - и в озу и в пзу. Если это авр - то это понятно, для авр все случаи должны быть в озу. Если арм - то вроде как все константы должны быть в флеше. Зачем их дублировать в ОЗУ?
|
|
|
|
|
Dec 25 2017, 14:08
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(juvf @ Dec 24 2017, 20:36)  Что такое "основное адресное пространство"? В Си нет такого. В Си нет адресных пространств одно адресное пространство.
ps и в вашем авр нет основного адр. простр. В авр гарвардская архитектура, там есть адресное пространство памяти программ и адресное пространство памяти данных. Но к стандарту Си это отношения не имеет, т.к. Си абстрагирован от архитектуры. Если Вы не в теме, то это не означает, что этого нет. https://gcc.gnu.org/onlinedocs/gcc-4.7.0/gc...-Address-SpacesВ настоящий момент в GCC именно на этой почве случился ступор. Разработчики avr-gcc не могут сделать так, чтобы по возможности константные данные автоматом ложились во флэш именно из-за того, что стандарт в настоящее время этого не разрешает. Если интересно - скачайте стандарт c11.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Dec 25 2017, 16:28
|

Профессионал
    
Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045

|
Цитата Согласно стандарту языка Си константные данные обязаны лечь в основное адресное пространство - всё. Цитата(demiurg_spb @ Dec 25 2017, 19:08)  Если Вы не в теме, то это не означает, что этого нет. https://gcc.gnu.org/onlinedocs/gcc-4.7.0/gc...-Address-SpacesВ настоящий момент в GCC именно на этой почве случился ступор. Разработчики avr-gcc не могут сделать так, чтобы по возможности константные данные автоматом ложились во флэш именно из-за того, что стандарт в настоящее время этого не разрешает. Если интересно - скачайте стандарт c11. И? Где в стандарте си основное адресное пространство? Да даже в по вашей ссылке нет ни каких основных адресных пространств. ps Это вы не в теме. При чем тут на какойт-о AVR Named Address Spaces? Вопрос не о авр, и даже не о gcc, а о Си. pps Цитата константные данные автоматом ложились во флэш именно из-за того, что стандарт в настоящее время этого не разрешает. Навыдумывали. В стандарте Си нет даже слова flash. Если интересно - скачайте стандарт c11.
|
|
|
|
Сообщений в этой теме
inventor модификатор const. Как правильно использовать в Си Dec 22 2017, 15:39  demiurg_spb Цитата(inventor @ Dec 22 2017, 19:21) мож... Dec 22 2017, 16:29    Kabdim Цитата(demiurg_spb @ Dec 22 2017, 20:07) ... Dec 23 2017, 19:41     DASM Цитата(Kabdim @ Dec 23 2017, 22:41) Верно... Dec 23 2017, 20:24     DASM Цитата(juvf @ Dec 24 2017, 20:36) Что так... Dec 24 2017, 19:04      razrab83 Цитата(DASM @ Dec 24 2017, 20:04) const н... Dec 25 2017, 03:10       Quasar Цитата(razrab83 @ Dec 25 2017, 06:10) А п... Dec 30 2017, 09:04        razrab83 Цитата(Quasar @ Dec 30 2017, 09:04) Локал... Jan 3 2018, 10:26         Quasar Цитата(razrab83 @ Jan 3 2018, 13:26) Лока... Jan 3 2018, 22:06      juvf Цитата(DASM @ Dec 25 2017, 00:04) const н... Dec 25 2017, 03:34       demiurg_spb С вами бесполезно разговаривать - это Вы к AVR и f... Dec 26 2017, 12:03        juvf Цитата(demiurg_spb @ Dec 26 2017, 17:03) ... Dec 27 2017, 02:57         demiurg_spb Цитата(juvf @ Dec 27 2017, 05:57) Пусть g... Dec 27 2017, 10:12          juvf Цитата(demiurg_spb @ Dec 27 2017, 15:12) ... Dec 27 2017, 10:49           demiurg_spb Цитата(juvf @ Dec 27 2017, 13:49) Изменил... Dec 27 2017, 10:53 Raven А разве не должен компилятор помещать глобальные и... Dec 22 2017, 16:53 demiurg_spb Цитата(Raven @ Dec 22 2017, 19:53) Нет не... Dec 22 2017, 16:56 k155la3 Цитата(Raven @ Dec 22 2017, 19:53) А разв... Dec 23 2017, 12:07 inventor то есть для того что бы константные данные
легли в... Dec 23 2017, 18:03 DASM еще как указание. статик в теле фции размещается н... Dec 25 2017, 07:31 juvf Цитата(DASM @ Dec 25 2017, 12:28) еще как... Dec 25 2017, 07:57  Kabdim Цитата(juvf @ Dec 25 2017, 10:57) его раз... Dec 25 2017, 08:02  DASM Цитата(juvf @ Dec 25 2017, 10:57) пф.... ... Dec 25 2017, 08:15   juvf Цитата(DASM @ Dec 25 2017, 13:15) вытекае... Dec 25 2017, 08:17 inventor наверное в следующих стандартах Си это
можно было... Dec 25 2017, 08:36 ViKo Все, что описал топикстартер в начале темы, верно.... Dec 25 2017, 09:46 Сергей Борщ Вообще-то в GCC в режиме С (без плюсов) уже года д... Dec 25 2017, 14:48 demiurg_spb Цитата(Сергей Борщ @ Dec 25 2017, 17:48) ... Dec 25 2017, 14:53 inventor Цитата(Сергей Борщ @ Dec 25 2017, 17:48) ... Dec 25 2017, 16:12 Kabdim Демиург, вы переоцниваете значимость техникал репо... Dec 27 2017, 13:23 demiurg_spb Время покажет. Факт есть факт - в gcc уже реализов... Dec 27 2017, 13:24 inventor мдя
задал простой вопрос
и как всегда разгорелся с... Dec 27 2017, 14:34 pnp_mechanic Вставлю и я свои 5 коп.
Inventor, всегда можно пос... Dec 27 2017, 15:14 aiwa Цитата(inventor @ Dec 25 2017, 10:36) ...... Dec 27 2017, 16:08 sigmaN Про применение volatile const для read only регист... Jan 1 2018, 18:44 Quasar Цитата(sigmaN @ Jan 1 2018, 21:44) Про пр... Jan 2 2018, 08:55  DASM Цитата(Quasar @ Jan 2 2018, 11:55) Я в св... Jan 25 2018, 17:09   esaulenka Цитата(DASM @ Jan 25 2018, 20:09) Еще бы... Jan 27 2018, 09:35    DASM Цитата(esaulenka @ Jan 27 2018, 12:35) Пр... Jan 27 2018, 11:25   Quasar ЦитатаПривидите плиз пример когда volatile const н... Jan 28 2018, 09:14    sidy Цитата(Quasar @ Jan 28 2018, 12:14) В C++... Jan 29 2018, 06:52 sigmaN Кодint f(int a )
{
const int c = 5;
return... Jan 3 2018, 10:53 razrab83 ЦитатаПеременная c вообще не займет никакой памяти... Jan 3 2018, 13:47 sigmaN Ну так мы же про размещение данных говорим вроде к... Jan 3 2018, 18:26 razrab83 Цитата(sigmaN @ Jan 3 2018, 18:26) Тоже с... Jan 4 2018, 08:50  Quasar Цитата(razrab83 @ Jan 4 2018, 11:50) 2Qua... Jan 4 2018, 21:57 inventor читаю pdf на IAR
такой забавный пример с константа... Jan 25 2018, 11:54 sigmaN Правильно, потому что это __ramfunc и никто не хоч... Jan 25 2018, 14:36 demiurg_spb Цитата(sigmaN @ Jan 25 2018, 17:36) Если ... Jan 25 2018, 15:26 krux IAR сделан не только под миниатюрные микроконтролл... Jan 25 2018, 16:40 demiurg_spb Цитата(krux @ Jan 25 2018, 19:40) приведе... Jan 26 2018, 11:12 sigmaN ЦитатаПравильно, потому что это __ramfunc и никто ... Jan 25 2018, 20:20 Сергей Борщ Не знаю, что он нынче делает в C, а в плюсах новый... Jan 27 2018, 20:24 DASM Цитата(Сергей Борщ @ Jan 27 2018, 23:24) ... Jan 27 2018, 20:38 Arlleex Ну, чтобы совсем подлить масла в огонь, можно вбро... Jan 28 2018, 17:09 DASM Цитата(Arlleex @ Jan 28 2018, 20:09) Ну, ... Jan 28 2018, 17:44 sigmaN Кодint arr[2] = {0, 1};
int i;
int pi;
in... Jan 28 2018, 19:50 gerber Цитата(sigmaN @ Jan 28 2018, 22:50) Брэйк... Jan 28 2018, 20:03  DASM Цитата(gerber @ Jan 28 2018, 23:03) Не ср... Jan 28 2018, 20:40 alx.bilous Цитата(sigmaN @ Jan 28 2018, 22:50) На мн... Jan 28 2018, 21:31 Kabdim Цитата(sigmaN @ Jan 28 2018, 22:50) Кто о... Jan 29 2018, 08:19  DASM Цитата(Kabdim @ Jan 29 2018, 11:19) Даже ... Jan 29 2018, 15:04   Quasar Цитата(DASM @ Jan 29 2018, 18:04) +++... Jan 30 2018, 05:16 sigmaN Я думаю стоит сконцентрироваться на работе с масси... Jan 28 2018, 20:51 Quasar Цитата(sigmaN @ Jan 28 2018, 23:51) Ответ... Jan 28 2018, 21:15 DASM Ну имя массива это не lvalue , нельзя записать ... Jan 28 2018, 21:34 alx.bilous Мне и правда нужно было упоминать что строка девят... Jan 28 2018, 21:38 Arlleex ЦитатаНа много интереснее попросить привести приме... Jan 29 2018, 05:42 _Sam_ Цитатав первом варианте в глобальной константе
это... Jan 29 2018, 07:45 juvf Цитата(_Sam_ @ Jan 29 2018, 12:45) Второй... Jan 29 2018, 09:14  ViKo Цитата(juvf @ Jan 29 2018, 12:14) Он в лю... Jan 29 2018, 12:21   juvf Цитата(ViKo @ Jan 29 2018, 17:21) Во флэш... Jan 29 2018, 16:01 sigmaN Кодint (*ptr)[2];
Скомпилится?
ptr... Jan 29 2018, 15:46 DASM Цитата(sigmaN @ Jan 29 2018, 18:46) Кодin... Jan 29 2018, 15:55 Arlleex Цитата(sigmaN @ Jan 29 2018, 18:46) Кодin... Jan 29 2018, 19:35 DASM delete Jan 29 2018, 16:37 sigmaN А вот это я расшифровать пока не могу
Озвучу мыс... Jan 29 2018, 21:07 Arlleex Цитата(sigmaN @ Jan 30 2018, 00:07) А вот... Jan 29 2018, 21:14  DASM Цитата(Arlleex @ Jan 30 2018, 00:14) Ну, ... Jan 29 2018, 21:20   Arlleex Цитата(DASM @ Jan 30 2018, 00:20) Ну блин... Jan 29 2018, 21:27    DASM Цитата(Arlleex @ Jan 30 2018, 00:27) Вам ... Jan 29 2018, 21:34     Arlleex Цитата(DASM @ Jan 30 2018, 00:34) Вот пос... Jan 29 2018, 21:57  dxp Цитата(Arlleex @ Jan 30 2018, 04:14) P.S.... Jan 30 2018, 05:14   Arlleex Цитата(dxp @ Jan 30 2018, 08:14) func - н... Jan 30 2018, 06:37    DASM Цитата(Arlleex @ Jan 30 2018, 09:37) логи... Jan 30 2018, 08:00    dxp Цитата(Arlleex @ Jan 30 2018, 13:37) Вы н... Jan 30 2018, 09:08     Arlleex Цитата(dxp @ Jan 30 2018, 12:08) char (*(... Jan 30 2018, 10:38  Quasar Цитата(Arlleex @ Jan 30 2018, 00:14) P.S.... Jan 30 2018, 09:11 sigmaN Цитатаfunc - это функция, не принимающая аргументо... Jan 29 2018, 21:31 DASM "кому-то еще и поддерживать." и 99 % это... Jan 29 2018, 22:09 ViKo Мудреные конструкции наподобие вышеприведенных раз... Jan 30 2018, 05:07 DASM "поплачИтесь" ,- непременно
Цитата(dxp ... Jan 30 2018, 06:04 Quasar Цитата(DASM @ Jan 30 2018, 09:04) "п... Jan 30 2018, 07:49
2 страниц
1 2 >
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|