|
|
  |
HAL, сколько можно фиксить ? |
|
|
|
Apr 13 2016, 11:23
|

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

|
QUOTE (ViKo @ Apr 13 2016, 12:24)  Вот тогда на помощь приходит красивое решение - умножить младший бит. Не самое красивое решение, хотя я тоже с такого начинал. Сейчас пишу так: CODE 2 * (PWR_CR_PLS & -PWR_CR_PLS) У такой записи на лбу вырублено "я - битовое поле" и она работает даже если авторы заголовочного файла забыли определить отдельные биты. QUOTE (ViKo @ Apr 13 2016, 12:24)  Какие же упертые, эти латыши Если это был намек в мой адрес - то я не латыш, я русский. Но мы оба латвийцы, да. Точно также как не каждый россиянин является русским. С белорусами в этом плане сложнее
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Apr 13 2016, 11:46
|

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

|
Цитата(Сергей Борщ @ Apr 13 2016, 14:23)  Не самое красивое решение, хотя я тоже с такого начинал. Сейчас пишу так: Код 2 * (PWR_CR_PLS & -PWR_CR_PLS) У такой записи на лбу вырублено "я - битовое поле" и она работает даже если авторы заголовочного файла забыли определить отдельные биты. Можно поспорить, что красивее. Но не стоит. Ваше решение я помню. Применял именно там, где хидерописатели напутали с описанием битов латентности флэш. Цитата Если это был намек в мой адрес - то я не латыш, я русский. Но мы оба латвийцы, да. Точно также как не каждый россиянин является русским. С белорусами в этом плане сложнее  Тогда - латвийцы. В Беларуси тоже много национальностей. Я сам - космополит наполовину.
|
|
|
|
|
Apr 13 2016, 12:42
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (ViKo @ Apr 13 2016, 13:24)  Основано на изучении кейловского хидера. Пример: CODE #define PWR_CR_PLS_0 ((uint32_t)0x00000020) /*!< Bit 0 */ #define PWR_CR_PLS_1 ((uint32_t)0x00000040) /*!< Bit 1 */ #define PWR_CR_PLS_2 ((uint32_t)0x00000080) /*!< Bit 2 */ Тут как значения битов, а не только _0 с расчетом на умножение. Совершенно обыденно. QUOTE Если битов в поле больше трех, то описывать все их комбинации - мазохизм. Их и нет в хидере. Вот тогда на помощь приходит красивое решение - умножить младший бит. PWR_CR_PLS_0*7 для получения (PWR_CR_PLS_0|PWR_CR_PLS_1|PWR_CR_PLS_2) Что-то мне это нифига красивым не кажется. PWR_CR_PLS(7) - приемлимо. А лучше в таком выражении эту семерку задефинировать: #define PLS_OC4REF (7) И получим: PWR_CR_PLS(PLS_OC4REF) , что читабельнее и БЕЗОШИБОЧНЕЕ комментариев при изменениях. Причем расписывать все комбинации сразу нет никакой необходимости. Нужные режимы добавляются в процессе работы. Получается никак не более трудоемко, чем комментарии. QUOTE (Сергей Борщ @ Apr 13 2016, 14:23)  Не самое красивое решение, хотя я тоже с такого начинал. Сейчас пишу так: CODE 2 * (PWR_CR_PLS & -PWR_CR_PLS) У такой записи на лбу вырублено "я - битовое поле" и она работает даже если авторы заголовочного файла забыли определить отдельные биты. Такое нужно в дополнительную обертку заворачивать. Иначе ЧЕЛОВЕЧЕСКИЙ глаз таки режет
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 13 2016, 13:28
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(Сергей Борщ @ Apr 13 2016, 16:23)  Не самое красивое решение, хотя я тоже с такого начинал. Сейчас пишу так: Код 2 * (PWR_CR_PLS & -PWR_CR_PLS) У такой записи на лбу вырублено "я - битовое поле" и она работает даже если авторы заголовочного файла забыли определить отдельные биты. Ничего себе, "вырублено на лбу". Такую запись сходу поймут полтора человека из тысячи, а подумав - ещё человек десять
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Apr 13 2016, 13:43
|

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

|
QUOTE (AHTOXA @ Apr 13 2016, 15:28)  Ничего себе, "вырублено на лбу". Такую запись сходу поймут полтора человека из тысячи, а подумав - ещё человек десять  Я в том смысле, что такая запись позвляет отличать битовое поле от одиночных битов: CODE RCC->BDCR = 0 | 0 * RCC_BDCR_BDRST | 0 * RCC_BDCR_RTCEN | 3 * (RCC_BDCR_RTCSEL &-RCC_BDCR_RTCSEL) // 0 - no clk, 1 - LSE, 2 - LSI, 3 - HSE | 0 * RCC_BDCR_LSEBYP | 0 * RCC_BDCR_LSEON ;
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Apr 13 2016, 16:09
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(Сергей Борщ @ Apr 13 2016, 18:43)  Я в том смысле, что такая запись позвляет отличать битовое поле от одиночных битов: Сейчас пришла в голову мысль: можно завернуть это в constexpr-функцию, и пользовать её. Причём (это моё личное предпочтение) лучше сделать не маску, а номер бита, чтоб было не умножение, а сдвиг. То есть, где-то в заголовочнике: Код constexpr uint32_t CountTrailing0(uint32_t mask) { return mask ? __builtin_ctz(mask) : sizeof(mask) * __CHAR_BIT__; } И где угодно: Код RCC->BDCR = 0 | 0 * RCC_BDCR_BDRST | 0 * RCC_BDCR_RTCEN | (3 << CountTrailing0(RCC_BDCR_RTCSEL)) // 0 - no clk, 1 - LSE, 2 - LSI, 3 - HSE | 0 * RCC_BDCR_LSEBYP | 0 * RCC_BDCR_LSEON ; Так, возможно, число понявших немножко увеличится  С другой стороны, это только C++, причём C++11. Но я, наверное, буду пользовать.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Apr 13 2016, 16:17
|
Местный
  
Группа: Участник
Сообщений: 328
Регистрация: 1-06-06
Из: USA
Пользователь №: 17 672

|
Цитата(Tanya @ Apr 13 2016, 11:41)  Вот еще добавлю... Вдруг после очередного обновления пресловутого КУБа обнаружилось, что после старта АЦП с ДМА второй АЦП уже не стартует нормально. Подробнее. При пошаговом прохождении в отладчике все как бы нормально, что еще противнее. Лень было разбираться. Если запустить первый АЦП с внешним запуском, а потом второй АЦП, то так можно обойти проблему. Где еще зарыли ОНИ подводные камни? А в старом - я его предусмотрительно оставила, - все нормально идет. Конечно, основной плюс КУБа в скорости создания инициализации. Особенно для особенно ленивых. К сожалению, железо развивается быстрее, чем мы накапливаем знания. Документация STM отвратительная и подручная Индия есть не у всех... Короче, слишком часто скорость перевешивает качество и это, по-видимому, чем дальше, тем больше будет основным фактором. C'est la vie.
--------------------
|
|
|
|
|
Apr 13 2016, 16:22
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Цитата Код 2 * (PWR_CR_PLS & -PWR_CR_PLS) У такой записи на лбу вырублено "я - битовое поле" и она работает даже если авторы заголовочного файла забыли определить отдельные биты. Цитата(AHTOXA @ Apr 13 2016, 16:28)  Ничего себе, "вырублено на лбу". Такую запись сходу поймут полтора человека из тысячи, а подумав - ещё человек десять  Думаю, даже меньше  Это чисто математический трюк, не зная который в его смысл нужно въезжать. Я вот так и не придумал, почему дополнение до машинного слова маски поля бит всегда дает единицу внутри этого поля. Однако это так  Так что такая запись будет "вырублена на лбу" только после её осмысления. А стороннего бедолагу разработчика, которому нужно будет подправить этот код может ввести в глубокий ступор. Цитата(pitt @ Apr 13 2016, 16:36)  de gustibus non est disputandum Абсолютно согласен, что начался спор о вкусах. Результат то все равно будет одинаковым.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|