Проблема с примитивной функцией

Дык просто все, иду в DS, читаю, нахожу нужный регистр и его значащие биты, нахожу в заголовочном файле stm32f4xx названия этих бит, ну а там все уже сразу видно куда их пихать.
Буквально на днях, т к 4хх серией не работал, пришлось напрячся, с 3хх и 1хх серией отличаются настройки DMA. И примеров с dma stream cmsis не нашёл, все по datasheet взлетело.

1 лайк

Я выделил то, что делаю я. На том, что не выделило - экономлю.

Поднимал DMA на STM32F407, исключительно по дэйташиту, никакими cmsis не пользуюсь. И, кстати, взлетает практически всегда. Один раз, когда не взлетело, обнаружил причину в errata.
Но вариант второго источника информации для поиска имен, да еще если там надо тупо искать глазками, меня как-то не очень вдохновляет.
То есть - да, способ существует, но уж очень обременительный. И не факт, что универсальный.

Вы в #define BIT_MASK (1<<12) описываете маски. Это не сдвиги - это маска на 12-й разряд! И это нагляднее чем 0x1000 или 0b0001000000000000.
Как раз длинные наименования тяжело читаются. Всё должно быть в меру. TOIE1 - легко запоминающееся сокращение. Оно не от балды придумано в ДШ. И так всё остальное.

Но маска задается через сдвиг?
Посмотрите сами, что легче читается:
DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
или
(1 << DS_SETFONT) | (1 << DS_MODALFRAME) | (1 << DS_FIXEDSYS) | (1 << WS_POPUP) | (1 << WS_CAPTION) | (1 << WS_SYSMENU)

Да, но они хотя бы читаются. А аббревиатуры типа TOIE1 не читаются совсем!

Если оно одно - возможно. А если таких несколько сотен - то нет, нет и нет! Все не запомнишь.

Конечно, не от балды. Оно нужно, чтобы ссылаться на него в пределах одной главы дэйташита, посвященной конкретному устройству. Вот есть, например в дэйташите глава, которая называется “Таймеры”, как-то нужно в пределах этой главы для описания работы с таймерами ссылаться на их регистры и отдельные поля этих регистров. Вот для этого эти аббревиатуры и нужны. Кстати, даже аббревиатуры верхнего уровня вызывают вопросы. Например, TIMSK0 - это что за слово такое? Что оно обозначает?
Если бы предполагалось использование этих аббревиатур в коде, был бы придуман единый алгоритм записи имен специально для программирования. Или, как в Windows - пусть длинные, но осмысленные названия. Но этого нет, значит, предположение о том, что они должны быть использованы в коде, не соответствует действительности.

Вот вы все говорите “нужно использовать”, а как это технически реализовать, никто не говорит. Либо “запоминайте” несколько сот бессмысленных буквосочетаний, либо ищите в 500 к неструктурированного текста (притом, непонятно, что именно искать).

upd. Исправлена синтаксическая ошибка (вероятно, не последняя)

Если вам трудно - можете не использовать. В конце концов, клиент всегда прав.

1 лайк

в словосочетании

“вы” пишется с маленькой

Я и без даташита тебе скажу, что TIMSK- Timer Interrupt MaSK
И в эту “маску” надо пихать биты включающие те или иные прерывания.

Тут все дело в том, насколько часто ты с этим работаешь.
Если несколько раз самостоятельно по даташиту пинать регистры, то запоминается всё вполне быстро.

Не тот случай. Холивар о другом.

“Есть два мнения. Мое и ошибочное.”

3 лайка

Придумывайте. Каждый придумывает по своему. У нас есть те аббревиатуры, которые в ДШ, они же и хедере на чип. Никто их, при здравом уме, переписывать не будет. Но никто не мешает подняться чуть выше и завести свои - хоть макро, хоть инлайн функции, уже говорил. Типа:

#define rtc_init()        (TCCR1B = 1<<WGM12 | 1<<CS11 | 1<<CS10, OCR1A = F_CPU / DIV1)
#define get_rtc_tick()    (TIFR & 1<<OCF1A)

Это размещается в хедере, а после этого я в программе в упор не вижу все эти маски, биты, регистры… Используешь ПИК, меняешь только эти дефайны - саму программу не трогаешь. Хочешь сразу и то и это, пишешь для обоих и ставишь условия для препроцессора. Сама программа от этого не меняется.

2 лайка

Мне вот, например, очень не нравятся длинные записи типа

(1 << DS_SETFONT) | (1 << DS_MODALFRAME) | (1 << DS_FIXEDSYS) | (1 << WS_POPUP) | (1 << WS_CAPTION) | (1 << WS_SYSMENU)

я в них теряюсь.

Завёл себе “библиотеку:slight_smile: и с тех пор всегда и везде пишу короче, типа вот так:

bitMask(DS_SETFONT, DS_MODALFRAME, DS_FIXEDSYS, WS_POPUP, WS_CAPTION, WS_SYSMENU)

Но никому этого не навязываю. Каждый по своему с ума сходит.

2 лайка

C ума сходить нужно правильно, по уставу :slight_smile:

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

1 лайк

Исправил.

А CMS, OPM, AWD и DIR?

Естественно.
Исходить, как мне кажется, нужно из следующих условий:

  1. Это хобби.
  2. Это ни разу не вторая_работа/приработок.
  3. Приходится иметь дело с существенно различающимися архитектурами, имеющими различный набор периферии, причем, даже функционально близкие устройства управляются существенно по-разному.

И так же быстро забывается, стоит переключиться на другую архитектуру.

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

Это называется отсутствием стандарта. Имеет вполне очевидные последствие: читатели не понимают, что пишет писатель.

Ну сколько можно повторяться: этот тезис опровергнут еще в сообщении №52.

Мне они не нравятся еще больше. Первая причина - это неправильно. Ну а вторая - да, из-за сдвигов, которые загромождают код.

И еще: вместо такой конструкции:
bitMask(DS_SETFONT, DS_MODALFRAME, DS_FIXEDSYS, WS_POPUP, WS_CAPTION, WS_SYSMENU)
прекрасно работает:
DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU

Разговор о сдвигах шёл в контексте того, что DS_SETFONT, DS_MODALFRAME и т.д. – номера битов, а не готовые маски (что мы и имеем в подавляющем большинстве случаев на практике) и в этом случае, предлагаемый Вами код не работает ни прекрасно, ни даже удовлетворительно.

Я не верю в то, что Вы не понимали контекста, а, значит, Вы просто на ходу передёрнули предмет обсуждения, чтобы продолжить бессмысленный срач. Не ожидал от Вас.

И, да, кстати, в том посте, что Вы цитируете, я прямо написал:

Зачем Вы мне решили что-то навязать?

В общем, давайте прекращать, Вы меня сильно разочаровали.

Просто толчём воду в ступе. Надоело.

1 лайк

да ну))
вы же подискутировать хотели, еще вчера :rofl:

А где (и кем) определили вот эти ваши все

ODR, BSSR и так далее?

это другое, тут сдвигать ниче не надо.
я в #39 еще написал.

1 лайк

Оккам (с его знаменитой бритвой) говорил: не умножайте сущности без нужды. Поэтому удобнее юзать те обозначения, что обозначены в даташыте, не переименовывая их без нужды. Обычно они достаточно разумно сделаны, о чем тут уже говорили.

Повторюсь: весь этот побитных гемор как ни маскируй типа-умными дефайнами и тп он так и останется и побитным и гемором. Если заглючило - лезь в даташыт. Если другой проц - тем и более в разы больше.
Пока работает - все эти именования красивы; как заглючило - только мешают ахаха.