Jump to content

    
Павел_Б

Вопрос по си

Recommended Posts

10 минут назад, one_eight_seven сказал:

Нет. Это значит доступно и исполняется. Недоступно - это если оно BusFault или HardFault вызовет.

Что "исполняется"?

Возьмём например LPC17xx и его UART: объясните - как прочитать из его TX-FIFO раз оно доступно?

Ну или любой другой МК с подобной организацией FIFO.

Share this post


Link to post
Share on other sites
2 часа назад, jcxz сказал:

Если часть ОЗУ запретить на чтение или на запись через MPU, оно перестанет быть ОЗУ???

Для компилятора - перестанет. Это будет особая область памяти с которой нужно явно указать что делать можно, а что нельзя. 

2 часа назад, jcxz сказал:

Если в ОЗУ контроллера имеется аппаратный контроль чётности например (или другой способ контроля содержимого) - это тоже по вашей логике не ОЗУ получается?

Если этот аппаратный контроллер начнет менять содержимое по своему усмотрению - несомненно держать там можно будет только volatile-переменные. Впрочем, аппаратный контроль четности этого не делает.

 

2 часа назад, jcxz сказал:

Если исходить из этого "определения", то ОЗУ во многих ARM-ах вообще не существует. :biggrin: Так как у них есть MPU, есть MMU, есть контроллеры динамической памяти, есть ОЗУ с контролем чётности и от всего этого там зависит содержимое ОЗУ.

Т.е. ты утверждаешь, что в ARMах любая переменная в ОЗУ в любой момент времени может сама произвольным образом изменить свое значение независимо от действий программы?:shok:

Share this post


Link to post
Share on other sites
19 часов назад, artemkad сказал:

аргумент как - "никто кроме функции её не поменяет".

Позвольте прояснить, это вы об аргументе этой функции: void foo(const char *p) ? Хотите сказать, что такое объявление функции говорит, что ничто в программе не изменит объект, адресуемый указателем р, кроме кода внутри тела самой функци? Я правильно понял? Или вы имели ввиду что-то другое?

Share this post


Link to post
Share on other sites
49 минут назад, Darth Vader сказал:

Позвольте прояснить, это вы об аргументе этой функции: void foo(const char *p) ? Хотите сказать, что такое объявление функции говорит, что ничто в программе не изменит объект, адресуемый указателем р, кроме кода внутри тела самой функци? Я правильно понял? Или вы имели ввиду что-то другое?

Не меняется во время работы этой функции. Да, естественно, меняться может, но компилятор будет строить код исходя их того, что не изменится и потому может как убрать кучу, с его точки зрения, лишнего кода, так и лишние чтения из памяти  удовлетворяясь временными копиями в регистрах.

 

Впрочем, если это CV для AVR ругается скорее всего потому, что передается адрес из другого адресного пространства. Т.е. функция ждет адрес на флешу, а ей дают адрес из оперативки. Если-же что-то иное и константные строки в оперативке, а ругается только на volatile, то достаточно привести тип, но иметь ввиду, что функция не ждет, что содержимое может вдруг само поменяться(ну или принудительно запретить прерывания на время работы функции что-бы гарантировать неизменность).

Share this post


Link to post
Share on other sites
9 часов назад, artemkad сказал:

Не меняется во время работы этой функции.

Т.е. таково ваше мнение. Я понял и принял к сведению.

А тогда как быть с мнением jcxz, что это значит, что функция гарантирует не изменять объект, адресуемый указателем р, который передан ей в качестве аргумента? Оно, по-вашему, ошибочное или нет?

Вы с этим согласны или нет?

 

Edited by Darth Vader

Share this post


Link to post
Share on other sites
1 час назад, Darth Vader сказал:

Т.е. таково ваше мнение. Я понял и принял к сведению.

А тогда как быть с мнением jcxz, что это значит, что функция гарантирует не изменять объект, адресуемый указателем р, который передан ей в качестве аргумента? Оно, по-вашему, ошибочное или нет?

Вы с этим согласны или нет?

Само собой раз функции передается указатель на константные строки она их менять не должна. При попытке вылезет уже не предупреждение, а ошибка.

Share this post


Link to post
Share on other sites
18 hours ago, jcxz said:

Возьмём например LPC17xx и его UART: объясните - как прочитать из его TX-FIFO раз оно доступно?

Вы связь с сутью разговора потеряли. Перечитайте и прийдите в себя.

Share this post


Link to post
Share on other sites
2 часа назад, one_eight_seven сказал:

Вы связь с сутью разговора потеряли. Перечитайте и прийдите в себя.

Я вроде вам не хамил...  

Всё с вами ясно - когда не хватает знаний и аргументов, персонажи вроде вас переходят на хамство. :negative:

Share this post


Link to post
Share on other sites
16 часов назад, artemkad сказал:

Не меняется во время работы этой функции. Да, естественно, меняться может,

Так меняется или не меняется? Уж определитесь... А то и меняется и не меняется одновременно; и ОЗУ и неОЗУ - тоже одновременно - винегрет какой-то!  :biggrin::biggrin::biggrin:

Вам уже выше дали точное толкование, а вы продолжаете свои вычурные определения изобретать на каком-то собственном птичьем языке. :unknw:

Share this post


Link to post
Share on other sites
8 часов назад, artemkad сказал:

Само собой раз функции передается указатель на константные строки она их менять не должна.

Этой функции можно передать указатель на не константу, и не будет ни предупреждений ни ошибок при компиляции:

Цитата

const char Space = 0x20;

char Symb;

void Foo(const char *p);

int main(void) {

    Foo(&Space);  // Нет ошибок

    Symb = 0x20;

    Foo(&Symb);  // Опять нет ошибок - почему?

}

С чего бы это, по-вашему?

Т.е. компилятор не требует передавать в функцию указатель на константу. И не видит никаких ошибок в коде. Хотя тип аргумента функции объявлен как указатель на константу.

Как вы это объясните?

Share this post


Link to post
Share on other sites
2 часа назад, Darth Vader сказал:

Т.е. компилятор не требует передавать в функцию указатель на константу.

Если компилятор не размещает константы во флеше, то не будет даже предупреждения. А с чего вдруг быть ошибке - тем более не ясно. Функция объявлена как указатель  на константную строку,  а значит она гарантированно не поменяет содержимое строки. Так с чего вдруг должна быть ошибка от указателя на переменную? Меняться-то эта строка будет за пределами функции, а не во время её работы. 

6 часов назад, jcxz сказал:

Так меняется или не меняется? Уж определитесь...

Читай внимательно, а не цитируй часть фразы ради хайпа. 

Share this post


Link to post
Share on other sites
8 hours ago, artemkad said:

Если компилятор не размещает константы во флеше,

Этим занимается линкер. Компилятору по барабану на адреса.

8 hours ago, artemkad said:

Читай внимательно, а не цитируй часть фразы ради хайпа. 

Вы не изволите выражаться технически грамотно, или, хотя бы, на принятом здесь русском языке. А то я читаю эту ветку, но не понимаю, что значит нерусское слово "хайп". Что-то молодёжное, вроде бы. Но мы-то люди взрослые.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.