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

 
 
> модификатор const. Как правильно использовать в Си
inventor
сообщение Dec 22 2017, 15:39
Сообщение #1


Знающий
****

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





Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Kabdim
сообщение Dec 22 2017, 16:01
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



rtfm, очень нужно почитать умную книжку по языку на котором разрабатываете.

Модификатор const = сообщение компилятору что бы он проследил что бы код в котором определена эта переменная не пытался менять эти данные. Никаких других гарантий просто const не даёт. А еще бывают такие случаи как например volatile const или const register или const - аргумент функции или преобразования типов при которых cv-модификаторы меняются.
Вместе с тем конкретные компиляторы и линкеры для ембеда размещают глобальные константы во флеше. Как они станут глобальными через объявление на верхнем уровне или через спецификатор static - не важно.

Всё увиденное - верное поведение.
Go to the top of the page
 
+Quote Post
inventor
сообщение Dec 22 2017, 16:21
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Цитата(Kabdim @ Dec 22 2017, 19:01) *
Вместе с тем конкретные компиляторы и линкеры для ембеда размещают глобальные константы во флеше. Как они станут глобальными через объявление на верхнем уровне или через спецификатор static - не важно.

Всё увиденное - верное поведение.



может ли компилятор поместить static const не во flash а в памяти данных?
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Dec 22 2017, 17:00
Сообщение #4


Знающий
****

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

А линкер может в соответствии со своим скриптом секцию запихнуть туда куда записано в скрипте.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Dec 22 2017, 17:07
Сообщение #5


неотягощённый злом
******

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

Это я к чему - крутить параметры в скриптах линкера надо не с шашой наголо, а очень и очень вдумчиво...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
juvf
сообщение Dec 24 2017, 17:36
Сообщение #6


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

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



Цитата(demiurg_spb @ Dec 22 2017, 22:07) *
Согласно стандарту языка Си константные данные обязаны лечь в основное адресное пространство - всё.
Что такое "основное адресное пространство"? В Си нет такого. В Си нет адресных пространств одно адресное пространство.

ps и в вашем авр нет основного адр. простр. В авр гарвардская архитектура, там есть адресное пространство памяти программ и адресное пространство памяти данных. Но к стандарту Си это отношения не имеет, т.к. Си абстрагирован от архитектуры.

Куда разместит - зависит от компилятора. А вообще мне тоже не понятно почему во 2-м случае в ОЗУ. Получается что эти данный размещены дважды - и в озу и в пзу. Если это авр - то это понятно, для авр все случаи должны быть в озу. Если арм - то вроде как все константы должны быть в флеше. Зачем их дублировать в ОЗУ?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Dec 25 2017, 14:08
Сообщение #7


неотягощённый злом
******

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


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
juvf
сообщение Dec 25 2017, 16:28
Сообщение #8


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

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Dec 26 2017, 12:03
Сообщение #9


неотягощённый злом
******

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



С вами бесполезно разговаривать - это Вы к AVR и flash привязались, не удосужившись прочесть представленные ссылки.
Всё о чём я написал напрямую относится к GCC в общем который, если Вы не в курсе, раньше всех коммерческих продуктов реализует новые возможности языка.
Мы используем в своих разработках GCC для множества архитектур, и по мере возможности делаем его и libc лучше. И мне очень странно слушать Ваши непонятные высказывания.
На этом с Вами разговор считаю законченным, пребывайте в осознании своего всезнания и далее.
Цитата
As an extension, GNU C supports named address spaces as defined in the N1275 draft of ISO/IEC DTR 18037. Support for named address spaces in GCC will evolve as the draft technical report changes. Calling conventions for any target might also change. At present, only the AVR, SPU, M32C, RL78, and x86 targets support address spaces other than the generic address space.

Address space identifiers may be used exactly like any other C type qualifier (e.g., const or volatile). See the N1275 document for more details.

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1275.pdf
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1005.pdf

Вдогонку: OpenCL основан на С99 и тоже использует схожие принципы что и Си для ембеда в части адресных пространств.
https://software.intel.com/en-us/articles/t...ce-in-opencl-20


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
juvf
сообщение Dec 27 2017, 02:57
Сообщение #10


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

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



Цитата(demiurg_spb @ Dec 26 2017, 17:03) *
написал всё что думаю о вас.... много букв.... удалил....

Вы видите/замечаете/понимаете разницу между "общий" и "основной", между "generic" и "general", между "Programming languages - C" и "Programming languages - C - Extensions to support embedded processors", между "gcc" и "си".


Цитата
принципы что и Си для ембеда
Ого!!! Уже не "Си", а "Си для ембеда". Исправляетесь, значит есть смысл от общения. wink.gif
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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   Цитата(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 страниц V   1 2 >


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

 


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


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