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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> STM32F207, Проверить USART_SR_RXNE и DR
ViKo
сообщение Mar 3 2015, 13:31
Сообщение #1


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Могу ли я задать вместо (сначала первое, затем второе)
if (USART3->SR & USART_SR_RXNE) {
if (USART3->DR == 24) {
Задать сразу
if (USART3->SR & USART_SR_RXNE && USART3->DR == 24) {
В этом случае гарантии, что сначала прочитается статус, а потом данные, нет, правильно?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 3 2015, 13:45
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(ViKo @ Mar 3 2015, 16:31) *
В этом случае гарантии, что сначала прочитается статус, а потом данные, нет, правильно?

Нет: && всегда обрабатывается слева направо.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 3 2015, 13:58
Сообщение #3


Гуру
******

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



И его выполнение прекращается как только получен однозначный результат. Т.е. если USART3->SR & USART_SR_RXNE не равно true, то USART3->DR == 24 проверяться не будет, так как уже не влияет на результат.


--------------------
На любой вопрос даю любой ответ
"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
ViKo
сообщение Mar 3 2015, 14:00
Сообщение #4


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(aaarrr @ Mar 3 2015, 16:45) *
Нет: && всегда обрабатывается слева направо.

То есть, гарантия есть. И могу так писать? Спасибо ответившим, и Кернигану с Ричи!
А вот если бы было (a + x) - (c + d)? Там тоже попорядку? Вроде, в книжках, наоборот, обращают внимание, что никакой определенной последовательности нет.
Go to the top of the page
 
+Quote Post
scifi
сообщение Mar 3 2015, 14:05
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



А вот не надо хитромудрый код плодить.
Написать в явном виде, и точка.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Mar 3 2015, 14:07
Сообщение #6


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(scifi @ Mar 3 2015, 17:05) *
А вот не надо хитромудрый код плодить.
Написать в явном виде, и точка.

Это который? Мне второй вариант симпатичнее, меньше скобок в конце.
Go to the top of the page
 
+Quote Post
Obam
сообщение Mar 3 2015, 14:18
Сообщение #7


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Цитата(ViKo @ Mar 3 2015, 18:00) *
То есть, гарантия есть. И могу так писать? Спасибо ответившим, и Кернигану с Ричи!
А вот если бы было (a + x) - (c + d)? Там тоже попорядку? Вроде, в книжках, наоборот, обращают внимание, что никакой определенной последовательности нет.


Сначала скобочки, а потом разность


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Mar 3 2015, 14:28
Сообщение #8


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Obam @ Mar 3 2015, 17:18) *
Сначала скобочки, а потом разность

Вопрос, какие скобочки сначала, а какие потом.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 3 2015, 14:33
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(ViKo @ Mar 3 2015, 17:28) *
Вопрос, какие скобочки сначала, а какие потом.

А вот тут никаких гарантий.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Mar 3 2015, 14:42
Сообщение #10


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Для полного просветления: а если я возьму проверку DR в скобки, во втором варианте? Все равно пойдет слева направо?
Go to the top of the page
 
+Quote Post
Obam
сообщение Mar 3 2015, 14:53
Сообщение #11


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Цитата(ViKo @ Mar 3 2015, 18:28) *
Вопрос, какие скобочки сначала, а какие потом.


(a + x) - (c + d) переменные все разные => всё равно


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 3 2015, 14:56
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(ViKo @ Mar 3 2015, 17:42) *
Для полного просветления: а если я возьму проверку DR в скобки, во втором варианте? Все равно пойдет слева направо?

Все равно.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Mar 3 2015, 14:58
Сообщение #13


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Obam @ Mar 3 2015, 17:53) *
(a + x) - (c + d) переменные все разные => всё равно

Представьте, что эти переменные обновляются в прерывании. Или это содержимое таймеров. Портов. Volatile.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Mar 3 2015, 17:44
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



ну какая разница?
если у вас значение может смениться в любой момент, сначала сделайте не меняемую копию, а потом вычисляйте.

Потому что, что вам даст в какой последовательности будут выполняться скобки, если при любой последовательности у вас будут любые данные на входе?...

Вот если запрос первых данных, как то меняет вторые, то тогда надо написать в явном виде что за чем и не придумывать.


Потому что мировой запас скобок, строчек, пробелов и переносов строки в целом не ограничен!

Я бы даже вот так
if (USART3->SR & USART_SR_RXNE && USART3->DR == 24)
не написал, потому что читать неудобно,
вот так лучше
if ((USART3->SR & USART_SR_RXNE) && (USART3->DR == 24))
а еще лучше вот так
if (
((USART3->SR & USART_SR_RXNE) != 0) && //проверяем то-то
(USART3->DR == 24) //проверяем сё-то
)

явно указанные условия и коменты повышают читаемость, ИМХО. Опять же написание явных условий еще раз заставляет их обдумать и уменьшает число ошибок вынесенных на тесты.

проверяем что флаг приемник не пуст - стоит - тут явно надо != 0
проверяем что флаг фифо переполнено - нет - тут надо == 0
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 3 2015, 19:03
Сообщение #15


Гуру
******

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



Для операторов && и || порядок вычисления операндов четко определен. Для остальных операторов - нет. Поэтому если в выражении с другими операторами более одной volatile-перменной, то многие компиляторы выдадут предупреждение о неопределенном порядке вычисления подвыражений. Дальше программист волен сам решать - положиться на случай или разбить выражение на несколько с явным порядком вычисления.


--------------------
На любой вопрос даю любой ответ
"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

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

 


RSS Текстовая версия Сейчас: 17th June 2025 - 15:34
Рейтинг@Mail.ru


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