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

 
 
8 страниц V  « < 2 3 4 5 6 > »   
Reply to this topicStart new topic
> модификатор const. Как правильно использовать в Си
Quasar
сообщение Jan 3 2018, 22:06
Сообщение #46


Местный
***

Группа: Свой
Сообщений: 257
Регистрация: 2-12-06
Из: Default City
Пользователь №: 23 021



Цитата(razrab83 @ Jan 3 2018, 13:26) *
Локальная const переменная на стадии сборки известна.



Тогда подумайте и попробуйте собрать этот код:

Код
#include <inttypes.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

void foo ( uint32_t in ) {
    const uint32_t test = in;
    const uint32_t *pTest = &test;

    printf ( "%d, %p\n", test, pTest );

}

int main ( void ) {
    time_t t;
    
    srand((unsigned) time(&t));

    foo ( 55 );
    foo ( 77 );

    foo ( rand() % 100 );

    return 0;
}
Go to the top of the page
 
+Quote Post
razrab83
сообщение Jan 4 2018, 08:50
Сообщение #47


Участник
*

Группа: Участник
Сообщений: 52
Регистрация: 5-05-17
Пользователь №: 96 902



Цитата(sigmaN @ Jan 3 2018, 18:26) *
Тоже скажете, что константа во флеше?
Да. С точки зрения Си константа есть, а как там её компилятор реализовал - это уже дело компилятора.

2Quasar
Код
const uint32_t test = in;
убедили. такая константа инитится во время выполнения. Но "const uint32_t test = 5;" инитится известна при компиляции.
Go to the top of the page
 
+Quote Post
Quasar
сообщение Jan 4 2018, 21:57
Сообщение #48


Местный
***

Группа: Свой
Сообщений: 257
Регистрация: 2-12-06
Из: Default City
Пользователь №: 23 021



Цитата(razrab83 @ Jan 4 2018, 11:50) *
2Quasar
Код
const uint32_t test = in;
убедили. такая константа инитится во время выполнения. Но "const uint32_t test = 5;" инитится известна при компиляции.


Конкретно ваша "const uint32_t test = 5" соптимизируется непонятно во что. Но компилятор действует "в общем". А "в общем", модификатор const - гарант того, что конструкция "a = 5" вне блока инициализации невалидна. Остальное - следствие здравого смысла. Если можно const переменную убрать в rodata (FLASH или ro ОЗУ), её туда уберут, если нельзя - то нет, не уберут.
Go to the top of the page
 
+Quote Post
inventor
сообщение Jan 25 2018, 11:54
Сообщение #49


Знающий
****

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



читаю pdf на IAR
такой забавный пример с константами:
Цитата
String literals and other constants can be avoided by using initialized variables. For
example, the following lines:

CODE

__ramfunc void test()
{
/* myc: initializer in ROM */
const int myc[] = { 10, 20 };
/* string literal in ROM */
msg("Hello");
}

Цитата
can be rewritten to:

CODE

__ramfunc void test()
{
/* myc: initialized by cstartup */
static int myc[] = { 10, 20 };
/* hello: initialized by cstartup */
static char hello[] = "Hello";
msg(hello);
}
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Jan 25 2018, 14:36
Сообщение #50


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Правильно, потому что это __ramfunc и никто не хочет чтоб "Hello" занимало оперативку


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jan 25 2018, 15:26
Сообщение #51


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

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



Цитата(sigmaN @ Jan 25 2018, 17:36) *
Если __ramfunc, то как раз все данные должны быть только в оперативке...
Например бутлоадер, который пишет во flash, не должен затрагивать данных из того-же flash.
Поэтому проще было убрать в приведённом примере слово static и слово const вовсе - результат был бы такой же, а буков меньше.


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


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

Группа: Свой
Сообщений: 1 700
Регистрация: 2-07-12
Из: дефолт-сити
Пользователь №: 72 596



IAR сделан не только под миниатюрные микроконтроллеры, а документация у него общая.
приведенный выше пример справедлив, например, когда есть тормозная флешка и быстрая и большая внешняя DDR. тогда cstartup как раз скопирует константу, к которой нужен быстрый и частый доступ в DDR.


--------------------
провоцируем неудовлетворенных провокаторов с удовольствием.
Go to the top of the page
 
+Quote Post
DASM
сообщение Jan 25 2018, 17:09
Сообщение #53


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Цитата(Quasar @ Jan 2 2018, 11:55) *
Я в свое время добавил вопрос о const в список вопросов для соискателей на собеседовании. Удивительно было то, что порой люди с опытом 5 лет и более, ничего кроме "const это константа неизменяемая" сказать не могут. А случай когда регистр периферии volatile const они обычно называют каким-то искусственным и притянутым за уши.

а он и есть приятнут за уши. Привидите плиз пример когда volatile const необходим и заоодно выдержку из стандарта где поведение этой конструкции описывается. Реально раздражают такие собеседователи с дебильными "что значит const char * const blavbla". Еще бы про auto спрашивали, который не впился ни в одно место эмеддерам ни в эпоху С, ни в эпоху С++ 14 когда он стал значить совершенно иное
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Jan 25 2018, 20:20
Сообщение #54


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Цитата
Правильно, потому что это __ramfunc и никто не хочет чтоб "Hello" занимало оперативку

Упс. Не заметил, что в примере локальные статики без const. Действительно hello будет в RAM, что действительно логично для __ramfunc.


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jan 26 2018, 11:12
Сообщение #55


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

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



Цитата(krux @ Jan 25 2018, 19:40) *
приведенный выше пример справедлив, например, когда есть тормозная флешка и быстрая и большая внешняя DDR. тогда cstartup как раз скопирует константу, к которой нужен быстрый и частый доступ в DDR.
В таких система обычно весь flash без разбора копируется в ОЗУ задолго да cstartup.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Jan 27 2018, 09:35
Сообщение #56


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

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Цитата(DASM @ Jan 25 2018, 20:09) *
Еще бы про auto спрашивали, который не впился ни в одно место эмеддерам


Прошу заменять все Ваши сентенции "никому не нужен ..." на "мне не нужен".
Спасибо.


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
DASM
сообщение Jan 27 2018, 11:25
Сообщение #57


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Цитата(esaulenka @ Jan 27 2018, 12:35) *
Прошу заменять все Ваши сентенции "никому не нужен ..." на "мне не нужен".
Спасибо.

хорошо, мне не нужен auto в С. Вам нужен?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 27 2018, 20:24
Сообщение #58


Гуру
******

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



Не знаю, что он нынче делает в C, а в плюсах новый auto использую очень часто и нахожу очень удобным.


--------------------
На любой вопрос даю любой ответ
"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
DASM
сообщение Jan 27 2018, 20:38
Сообщение #59


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Цитата(Сергей Борщ @ Jan 27 2018, 23:24) *
Не знаю, что он нынче делает в C, а в плюсах новый auto использую очень часто и нахожу очень удобным.

Да, я про С имел в виду более. В С++ и const собственно гораздо важнее и нужнее. Просто само использование плюсов в эмбеддед ранее было сильно ограничено так сказать, свободно с STL стало писать можно относительно недавно, когда ОЗУ достаточно (256 К и более)
Go to the top of the page
 
+Quote Post
Quasar
сообщение Jan 28 2018, 09:14
Сообщение #60


Местный
***

Группа: Свой
Сообщений: 257
Регистрация: 2-12-06
Из: Default City
Пользователь №: 23 021



Цитата
Привидите плиз пример когда volatile const необходим и заоодно выдержку из стандарта где поведение этой конструкции описывается.


Поведение volatile описано, поведение const тоже. Дерзайте, соединяйте вместе.

Участок одного из заголовочных файлов к STM32. Определение для __I и для __IO найдете сами. Хотя естественно можно с const не заморачиваться, также, как и с осмысленными именами функций, например.

Можно развить ваш вопрос: "приведите пример, когда const необходим и без него никак"?

Код
typedef struct
{
  __IO uint32_t POWER;          /*!< SDIO power control register,    Address offset: 0x00 */
  __IO uint32_t CLKCR;          /*!< SDI clock control register,     Address offset: 0x04 */
  __IO uint32_t ARG;            /*!< SDIO argument register,         Address offset: 0x08 */
  __IO uint32_t CMD;            /*!< SDIO command register,          Address offset: 0x0C */
  __I uint32_t  RESPCMD;        /*!< SDIO command response register, Address offset: 0x10 */
  __I uint32_t  RESP1;          /*!< SDIO response 1 register,       Address offset: 0x14 */
  __I uint32_t  RESP2;          /*!< SDIO response 2 register,       Address offset: 0x18 */
  __I uint32_t  RESP3;          /*!< SDIO response 3 register,       Address offset: 0x1C */
... etc

} SDIO_TypeDef;


Цитата(DASM @ Jan 25 2018, 20:09) *
а он и есть приятнут за уши.


А какие вопросы вы считаете не притянутыми за уши для программиста встроенных систем с опытом хотя бы более 5 лет?

Мне всегда интересно понять, как человек думает. Даже если умный человек столкнулся первый раз с такой конструкцией (а это вполне возможно), он задумается, постарается понять, о чем речь. Неумный начнет доказывать, разбрасывая слюни в разные стороны, что оно не надо, вы все тут идиоты, так никто не программирует! Но этот человек пришел к нам, решать наши задачи за деньги. Сейчас задача понять, что значит volatile const, вот и все.

Бывают и совсем волшебные кандидаты, которые даже вопрос не понимают, а пишут опыт 100500 лет и более.


Цитата(Сергей Борщ @ Jan 27 2018, 23:24) *
Не знаю, что он нынче делает в C, а в плюсах новый auto использую очень часто и нахожу очень удобным.


В C++ крайне нужная весчЬ.

Хотя в C++ я не использую это слово по старой привычке, и опираясь на логику некоторых местных товарищей, могу утверждать, что оно не нужно :-)
Go to the top of the page
 
+Quote Post

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

 


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


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