ส็็็็็็็็็็็็็็็็็็็็็็็็็༼ ຈل͜ຈ༽ส้้้้้้้้้้้้้้้้้้้้้้้
-
- Да ладно скорбеть, после того, что я видел в жизни, я стал считать себя экспертом в C :) Тут вопрос в другом Vladimir Ljaschko(481 знак., 22.09.2014 13:19,
)
- RXBUF0 скорее всего volatile, вот и предупреждают, что порядок обращения не определен. нужно прочитать из изменяющейся ячейки и положить по расчитываемому смещению - и то и другое может поменяться во времени, т.е. если не указать порядок явно, то Vit(100 знак., 22.09.2014 13:38)
- Первый же ответ был по делу и правильный. Про начальника я догадывался :-) Я скорее по поводу присоединившихся к обсуждению высказался. - SciFi(22.09.2014 13:22, ссылка)
- Как там поется:"не надо печалится, вся жизнь впереди ... надейся и жди". Я вот тоже только head объявляю volatile и ни разу проблем не поимел. Что Я Делаю Не Так? - Andreas(22.09.2014 11:40)
- по идее одного volatile хватать должно. arr[i] эквивалентно *(arr+i), и даже i[arr]. - Vit(22.09.2014 11:55)
- Теоретически компилятор может закэшировать весь массив в регистрах. Так что массив таки следует объявлять как volatile. - SciFi(22.09.2014 12:06)
- при i volatile расчет выражения arr+i должен выполняться. что-то не могу представить как запись по неизвестному на момент компиляции адресу может быть заменена записью в регистр. - Vit(22.09.2014 12:36)
- Легко. В том же C166 регистры процессора - это участок ОЗУ на чипе (адресуется обычным образом). Такшта легко представить кэширование маленького массива в регистрах, учитывая креативность компиляторостроителей. - SciFi(22.09.2014 12:41)
- перепутаем пальцы:) каким образом запись по неизвестному на момент компиляции адресу можно заменить записью по известному адресу? - Vit(22.09.2014 13:58)
- Я про чтение. Запись - в обработчике прерывания. Чтение - где-то в другом месте программы. Вот там кэширование вполне возможно. Логично? - SciFi(22.09.2014 14:01)
- при xxx = *(arr+i), где i volatile, нелогично - Vit(22.09.2014 14:05)
- Неправда. Или у нас разная "логика" :-) - SciFi(22.09.2014 14:09)
- ложь:) компиляторостроителю неизвестно, что будет лежать по неизвестному на момент компиляции адресу, потому он не сможет в регистр загнать константу. насчет выбросить присваивание - отдельный балет - Vit(22.09.2014 14:20)
- Пытаюсь включить телепатию. Регистр - фигура речи. На самом деле это "быстрая" память с известным фиксированным начальным адресом, способная вместить весь (небольшой) массив. Так понятнее? SciFi(185 знак., 23.09.2014 00:29)
- Вот реалистичный пример: SciFi(458 знак., 22.09.2014 14:37)
- i здесь не volatile. - Vit(22.09.2014 17:54)
- Это не важно. Если i будет volatile, ничего не изменится. - SciFi(22.09.2014 17:56)
- как раз именно это и важно. - Vit(22.09.2014 23:46)
- В каком именно месте? Со ссылками на нормативные документы, пожалуйста. Ибо на самом деле "не важно". - SciFi(22.09.2014 23:52)
- Вы утверждаете, что компиляторостроитель вправе заменить обращение по неизвестному на момент компиляции адресу обращением по фиксированному, да ещё и в регистрах. Полагаю, что натянуть сову на глобус несколько проще - Vit(23.09.2014 00:13)
- Чукча не читатель? Массив закеширован в регистрах ЦПУ (memory mapped) по адресу x. Обращение к элементу массива с индексом i происходит по адресу (x + i). Сова с глобусом идёт лесом. - SciFi(23.09.2014 00:17)
- адрес начала массива какая тварь на каком основании подменит в операции вычисления адреса со смещением? - Vit(23.09.2014 00:20)
- Вы меня потеряли. Нифига я не понял. - SciFi(23.09.2014 00:22)
- адрес начала массива какая тварь на каком основании подменит в операции вычисления адреса со смещением? - Vit(23.09.2014 00:20)
- Чукча не читатель? Массив закеширован в регистрах ЦПУ (memory mapped) по адресу x. Обращение к элементу массива с индексом i происходит по адресу (x + i). Сова с глобусом идёт лесом. - SciFi(23.09.2014 00:17)
- Вы утверждаете, что компиляторостроитель вправе заменить обращение по неизвестному на момент компиляции адресу обращением по фиксированному, да ещё и в регистрах. Полагаю, что натянуть сову на глобус несколько проще - Vit(23.09.2014 00:13)
- В каком именно месте? Со ссылками на нормативные документы, пожалуйста. Ибо на самом деле "не важно". - SciFi(22.09.2014 23:52)
- как раз именно это и важно. - Vit(22.09.2014 23:46)
- Это не важно. Если i будет volatile, ничего не изменится. - SciFi(22.09.2014 17:56)
- i здесь не volatile. - Vit(22.09.2014 17:54)
- ложь:) компиляторостроителю неизвестно, что будет лежать по неизвестному на момент компиляции адресу, потому он не сможет в регистр загнать константу. насчет выбросить присваивание - отдельный балет - Vit(22.09.2014 14:20)
- Неправда. Или у нас разная "логика" :-) - SciFi(22.09.2014 14:09)
- при xxx = *(arr+i), где i volatile, нелогично - Vit(22.09.2014 14:05)
- Я про чтение. Запись - в обработчике прерывания. Чтение - где-то в другом месте программы. Вот там кэширование вполне возможно. Логично? - SciFi(22.09.2014 14:01)
- Ну не знаю... Apтём(315 знак., 22.09.2014 13:08)
- Да не важно это всё. Если переменная (или массив) изменяется в прерывании, то она должна быть volatile. Точка. Порассуждать, каким именно образом это может сыграть на практике можно, конечно, но это другая тема. - SciFi(22.09.2014 13:44)
- А если переменная используется только в прерывании? Смысл её делать volatile? - Apтём(22.09.2014 13:48)
- Нет смысла, конечно. Но мы же уже преодолели младший школьный возраст, поэтому такие оговорки можно не рассматривать, правда? :-) - SciFi(22.09.2014 13:50)
- Ок...Не будем...:) - Apтём(22.09.2014 13:52)
- Нет смысла, конечно. Но мы же уже преодолели младший школьный возраст, поэтому такие оговорки можно не рассматривать, правда? :-) - SciFi(22.09.2014 13:50)
- А если переменная используется только в прерывании? Смысл её делать volatile? - Apтём(22.09.2014 13:48)
- Да не важно это всё. Если переменная (или массив) изменяется в прерывании, то она должна быть volatile. Точка. Порассуждать, каким именно образом это может сыграть на практике можно, конечно, но это другая тема. - SciFi(22.09.2014 13:44)
- перепутаем пальцы:) каким образом запись по неизвестному на момент компиляции адресу можно заменить записью по известному адресу? - Vit(22.09.2014 13:58)
- Легко. В том же C166 регистры процессора - это участок ОЗУ на чипе (адресуется обычным образом). Такшта легко представить кэширование маленького массива в регистрах, учитывая креативность компиляторостроителей. - SciFi(22.09.2014 12:41)
- Ну это очень уж теоретически... Apтём(145 знак., 22.09.2014 12:18)
- при i volatile расчет выражения arr+i должен выполняться. что-то не могу представить как запись по неизвестному на момент компиляции адресу может быть заменена записью в регистр. - Vit(22.09.2014 12:36)
- Теоретически компилятор может закэшировать весь массив в регистрах. Так что массив таки следует объявлять как volatile. - SciFi(22.09.2014 12:06)
- Можно ещё проще: "gcc -O0". Тогда никакой volatile не нужен. Писец, как обычно, подкрадётся незаметно. - SciFi(22.09.2014 11:43)
- по идее одного volatile хватать должно. arr[i] эквивалентно *(arr+i), и даже i[arr]. - Vit(22.09.2014 11:55)
- Видимо Си теряет актуальность... - Apтём(22.09.2014 11:31)
- Теряет в пользу асма? :-) Си ещё попляшет на наших могилах :-) - SciFi(22.09.2014 11:31)
- :) - Apтём(22.09.2014 11:40)
- Теряет в пользу асма? :-) Си ещё попляшет на наших могилах :-) - SciFi(22.09.2014 11:31)
- Да ладно скорбеть, после того, что я видел в жизни, я стал считать себя экспертом в C :) Тут вопрос в другом Vladimir Ljaschko(481 знак., 22.09.2014 13:19,