|
|
  |
модификатор const. Как правильно использовать в Си |
|
|
|
Dec 25 2017, 07:57
|

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

|
Цитата(DASM @ Dec 25 2017, 12:28)  еще как указание. статик в теле фции размещается не на стеке, а в общей куче (не путать с кучей malloc). пф.... утверждение осталось, только дополню... Более того, static - это всего лишь указание компилятору, что данные статические, а никак не указание компилятору что и как размещать, я имел в виду, указание не про кучу и стек, а указание про озу/флешь/еепром/внешнюю память и т.п. Цитата это самодеятельность компилера на его страх и риск. Согласен. В Си/С++ нет ни каких указаний на этот счет. Поэтому разработчики компиляторов на своё усмотрение делают реализацию. И поэтому, если важна область размещения, нужно компиллер контролировать и давать явные указания для размещения данных в нужную память. Цитата(DASM @ Dec 25 2017, 12:31)  А уж размещение статик не на стеке - прросто вытекает из этого Ни чего не вытекает. Статик можно разместить в ОЗУ, а можно разместить в флеше. Конст можно разместить в озу, а можно в флеше. Компилятор волен сам - где и что размещать (в озу или во флешь), и его размещения не поддаются логике.
|
|
|
|
|
Dec 25 2017, 08:15
|
Гуру
     
Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493

|
Цитата(juvf @ Dec 25 2017, 10:57)  пф.... утверждение осталось, только дополню...
Более того, static - это всего лишь указание компилятору, что данные статические, а никак не указание компилятору что и как размещать, я имел в виду, указание не про кучу и стек, а указание про озу/флешь/еепром/внешнюю память и т.п.
Согласен. В Си/С++ нет ни каких указаний на этот счет. Поэтому разработчики компиляторов на своё усмотрение делают реализацию. И поэтому, если важна область размещения, нужно компиллер контролировать и давать явные указания для размещения данных в нужную память.
Ни чего не вытекает. Статик можно разместить в ОЗУ, а можно разместить в флеше. Конст можно разместить в озу, а можно в флеше. Компилятор волен сам - где и что размещать (в озу или во флешь), и его размещения не поддаются логике. вытекает что не на стеке
|
|
|
|
|
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, 14:53
|

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

|
Цитата(Сергей Борщ @ Dec 25 2017, 17:48)  Я не про плюсы и говорю. И ступор не в плюсах. Код const char __flash* const __flash names[] = { "aaa", "bbb", "ccc" }; не работает, а по всей здравой логике должно. но народ упёрся и говорит, что нарушать стандарт не будем.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Dec 25 2017, 16:12
|
Знающий
   
Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748

|
Цитата(Сергей Борщ @ Dec 25 2017, 17:48)  А еще - бывают контроллеры вообще без набортного флеша, там и код и константы - все в ОЗУ живет. И к чему все эти споры? cc3200 но там все равно подрузамевается память только для чтения: CODE 45 190 bytes of readonly code memory 6 072 bytes of readonly data memory 138 267 bytes of readwrite data memory
|
|
|
|
|
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.
|
|
|
|
|
Dec 26 2017, 12:03
|

неотягощённый злом
     
Группа: Свой
Сообщений: 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.pdfhttp://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
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Dec 27 2017, 02:57
|

Профессионал
    
Группа: Свой
Сообщений: 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" и "си". Цитата принципы что и Си для ембеда Ого!!! Уже не "Си", а "Си для ембеда". Исправляетесь, значит есть смысл от общения.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|