‮Сдвиг по фазе (kincajou) wrote,
‮Сдвиг по фазе
kincajou

worklog: один макрос и поиск глубокого смысла

Наткнулся вот в одной библиотеке на конструкцию такого вида:

if ((reg & mask) == mask) {
...
}


при этом маска mask - это ОДИН бит, всегда.

Мне кажется, или сравнение == mask уже не нужно, ведь if() выполнится, если результат двоичного "&" ненулевой - и он будет таким, если в регистре установлен бит маски?

Я могу предположить, что такое может оказаться полезным, если в маске может быть установлено сразу несколько бит и нам требуется, чтобы в регистре они так же были взведены все, а не только некоторые какие-то, но я просмотрел весь код -- нигде ничего такое не тестируется, всегда строго "однобитная" маска, без вариантов.

А вообще это я полез разбираться в потрохах библиотеки USB для STM32. Это ад.
Я не ищу в ней ошибки или ещё что-то (хотя кое-что вызывает некотрое замешательство: например, когда в описании функции сказано, что параметр может принимать значения от 1 до 15, внутри функции проверки на выход за границу отсутствует, а саму эту функцию где-то вызывают с параметром 16), просто хочу разобраться и, по возможности, предельно упростить, избавившись хотя бы от конструкций типа "обработчик прерывания вызывает коллбэк, который не делает ничего кроме вызова ещё одной функции" -- эту вложенность можно развинтить на один уровень, ничего не потеряв.
Subscribe

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 13 comments