-
- Я не не просто задавал вопрос о кортексе. Эту операцию можно
осуществить по разному, можно проверить-наложить маску . Можно
сдвинуть. - IBAH(Вчера, 16:18)
- А для Cortex-M0 - танцы со сдвигами ! Zikon(1 знак., Вчера, 18:53, картинка)
- Компилятор одинаково компилирует 1 и 3 варианты, вот вариант к маской для Cortex-M3-M4, там есть инструкции с битовыми полями и получается всё просто Zikon(1 знак., Вчера, 18:49, картинка)
- Для RISC-V - тоже интересный вариант - если один операнд - маска - Zikon(125 знак., Вчера, 18:48, картинка)
- По моему опыту работы со свежими версиями GCC, если включены
оптимизации, коль скоро побочный эффект один, и тот же,
скомпилированные инструкции не зависит от способа выражения на Си. - Nikolay_Po(Вчера, 16:41)
- Хотелось бы верить... - IBAH(Вчера, 17:38)
- Больше разницы, когда указываешь компилятору, какие данные - волатильные, а какие - нет. Nikolay_Po(180 знак., Вчера, 17:57)
- Хотелось бы верить... - IBAH(Вчера, 17:38)
Третий от второго не отличается. Логическое "И" само даёт булево значение. Двойная инверсия пригодилась бы в случае битового "И". Но это не ваш случай.Товарищ розовый прав, и да, вариант с двумя инверсиями - подходит. Nikolay_Po(101 знак., 21.06.2025 17:12)- Второй неправильный - БeзPoзoвыxHикyдa(21.06.2025 14:59,
)
- Согласен. При записи значения в битовое поле компилятор использует бит 0, а после выполнения операции AND когда не ноль то там и не 1, а битовая маска порта и бит 0 равен опять 0. Провёл тестирование на godbolt и получил что варианты 1 и 3 компилируются одинаково. Zikon(1 знак., 21.06.2025 21:50, картинка)
- Согласен. - Nikolay_Po(21.06.2025 17:10)
- мнения разделились, спишем это на кавказский темперамент IBAH(1 знак., 21.06.2025 19:42, ссылка)
- Вот, по ссылке, ещё одно обсуждение темы битовых полей. А первый вариант можно записать компактнее: ЫЫyкпy(56 знак., 21.06.2025 14:17, ссылка)
- Второй вариант правильный: попытка записи в битовое поле любого ненулевого стола аналогична записи 1. Eddy_Em(70 знак., 21.06.2025 13:43)
- Зачем pack? Не нужен он. При чём тут Кортекс? Это Си, он в этом плане везде боль-мень одинаковый. Ну и битовые поля в регистрах - это на любителя. Мне больше по душе битовые маски в виде макросов, как сейчас принято в хедерах. - SciFi(21.06.2025 13:32)
- Еще вариант RegSost.Konc=(((PORTA->IDR)&(GPIO_IDR_IDR5))!=0); А еще надо в структуру добавить unsigned char :2; что бы предупреждений не было. - AlexBi(21.06.2025 13:23)
- 2-й вариант неправильный, остальные вроде ниче. il-2(160 знак., 21.06.2025 13:00)
- я тоже так нутром чую. Но нигде не нашел, что "Konc - это 1-битовая
числовая (не булевая!!!) переменная". То есть что одноразрядное
битовое поле не является булевой переменной. - IBAH(21.06.2025 13:09 - 13:14)
- она и не булевая. но ее разрядность ниже чем ты в нее пишешь. надо
добавлять !=0 или >0 чтобы результат был булевый и поместился в твою однобитную переменную. - POV(21.06.2025 13:14)
- В Си нет булевого типа, результат операций сравнения это int имеющий значение 0 или 1. Но если это С++ тогда булевый есть, но при неявном превращении в целочисленный опять получается 0 или 1 - AlexBi(21.06.2025 13:19)
- она и не булевая. но ее разрядность ниже чем ты в нее пишешь. надо
добавлять !=0 или >0 чтобы результат был булевый и поместился в твою однобитную переменную. - POV(21.06.2025 13:14)
- я тоже так нутром чую. Но нигде не нашел, что "Konc - это 1-битовая
числовая (не булевая!!!) переменная". То есть что одноразрядное
битовое поле не является булевой переменной. - IBAH(21.06.2025 13:09 - 13:14)
- не так! POV(122 знак., 21.06.2025 12:51)
- Это тавтология. Хотя, да - более наглядно, я тоже так пишу. - il-2(21.06.2025 13:04)
- Попал раз на то, что GCC (да, это был 6-я версия) под некоторые
битовые поля отвел отдельные ячейки. Больше так не делаю. - POV(21.06.2025 13:09)
- Дык, чтоб он так не делал #pragma pack(push,1). Обращение к байту
всяко быстрее чем к биту - IBAH(21.06.2025 13:12)
- тогда какой смысл в битовых полях? - POV(21.06.2025 13:13)
- Я хотел сказать, что компилятор, по умолчанию, размещает объекты, в
частности элементы структуры, в памяти так как ему удобно. Он лишь
гарантирует, что они будут расположены в памяти последовательно,
адрес следующего элемента будет больше предыдущего. - IBAH(21.06.2025 13:20)
- Я бы всё же "для гарантии" разместил поля в пределах одной переменной... POV(434 знак., 21.06.2025 13:30, картинка)
- Я хотел сказать, что компилятор, по умолчанию, размещает объекты, в
частности элементы структуры, в памяти так как ему удобно. Он лишь
гарантирует, что они будут расположены в памяти последовательно,
адрес следующего элемента будет больше предыдущего. - IBAH(21.06.2025 13:20)
- тогда какой смысл в битовых полях? - POV(21.06.2025 13:13)
- Дык, чтоб он так не делал #pragma pack(push,1). Обращение к байту
всяко быстрее чем к биту - IBAH(21.06.2025 13:12)
- Попал раз на то, что GCC (да, это был 6-я версия) под некоторые
битовые поля отвел отдельные ячейки. Больше так не делаю. - POV(21.06.2025 13:09)
- Это тавтология. Хотя, да - более наглядно, я тоже так пишу. - il-2(21.06.2025 13:04)
- Я не не просто задавал вопрос о кортексе. Эту операцию можно
осуществить по разному, можно проверить-наложить маску . Можно
сдвинуть. - IBAH(Вчера, 16:18)