Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: HAL
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Страницы: 1, 2, 3
Baser
Цитата(Kabdim @ Apr 14 2016, 15:38) *
Последовательное присвоение полям нормальный компилятор должен оптимизировать в 1 команду.

Ключевое слово - должен. Но не обязан.

Цитата
Если очень надо именно определнную в старом стиле маску - есть тайпкасты.

Долго думал, что есть "тайпкасты" - это вы приведение типов имеете ввиду? sm.gif
Приведение типов можно применять только на свой страх и риск, когда точно знаешь что будет делать компилятор.
В части битовых полей это очень рисковано.
pitt
STM32. Just an example. Could be better for sure.

Код
enum DMA_ISR { DMA_ISR_FEIF = 0,   DMA_ISR_DMEIF = 2,    DMA_ISR_TEIF,  DMA_ISR_HTIF,  DMA_ISR_TCIF,
               DMA_ISR_FEIF0 = 0,  DMA_ISR_DMEIF0  = 2,  DMA_ISR_TEIF0, DMA_ISR_HTIF0, DMA_ISR_TCIF0,
               DMA_ISR_FEIF1,      DMA_ISR_DMEIF1  = 8,  DMA_ISR_TEIF1, DMA_ISR_HTIF1, DMA_ISR_TCIF1, };


#define ISR_ALL_FLAGS ((1<<DMA_ISR_FEIF)|(1<<DMA_ISR_DMEIF)|(1<<DMA_ISR_TEIF)|(1<<DMA_ISR_HTIF)|(1<<DMA_ISR_TCIF))


enum DMA_FIFO_TRESHOLD { DMA_DIRECT_MODE = 0, DMA_FIFO_1QTR_FULL, DMA_FIFO_HALF_FULL, DMA_FIFO_3QTR_FULL, DMA_FIFO_FULL };

#define DMA_FIFO_LESS_1QTR_FULL  
#define DMA_FIFO_LESS_HALF_FULL DMA_SxFCR_FS_0
#define DMA_FIFO_LESS_3QTR_FULL DMA_SxFCR_FS_1
#define DMA_FIFO_OVER_3QTR_FULL (DMA_SxFCR_FS_0 + DMA_SxFCR_FS_1)
#define DMA_FIFO_IS_EMPTY       DMA_SxFCR_FS_2
#define DMA_FIFO_IS_FULL        (DMA_SxFCR_FS_0 + DMA_SxFCR_FS_2)

#define DMA_FIFO_TH_1QTR_FULL   0
#define DMA_FIFO_TH_HALF_FULL   DMA_SxFCR_FTH_0
#define DMA_FIFO_TH_3QTR_FULL   DMA_SxFCR_FTH_1
#define DMA_FIFO_TH_FULL        DMA_SxFCR_TH

typedef struct {
  uint8_t threshold       : 2;
  uint8_t direct_mode_dis : 1;
  uint8_t status          : 3;
} dma_fifo_s;
Alechek
Цитата(Kabdim @ Apr 14 2016, 17:38) *
Последовательное присвоение полям нормальный компилятор должен оптимизировать в 1 команду.

Сделает, при включенной оптимизации.
Но вот только если переменная не volatile. Коими практически всегда являются регистры.
Сергей Борщ
QUOTE (Kabdim @ Apr 14 2016, 14:38) *
Последовательное присвоение полям нормальный компилятор должен оптимизировать в 1 команду.
Если переменная объявлена как volatile, то он не только не должен, а наоборот, не имеет права оптимизировать в одну команду.
Kabdim
Цитата(ViKo @ Apr 14 2016, 15:44) *
Потому что у битовых полей их расположение в слове не определено точно, с какого бита начинается - с младшего или старшего, и может оказаться не совпадающим с расположением битов в регистрах.

Это имеет значение только если менять компилятор или платформу с ABI. Если менять платформу - платформозависимый код с ковырянием в регистрах в любом случае придется выкинуть и написать с начала. Да и компиляторы кмк меняют туда-сюда редко. К тому же скорее всего компиляторы на одной платформе будут раскидывать бит филды одинаково. В противном случае да, определение структуры придется поправить. Но не используемых перечислений и т.д.
Цитата(Baser @ Apr 14 2016, 15:55) *
Ключевое слово - должен. Но не обязан.

На практике оптимизируют.
Цитата(Baser @ Apr 14 2016, 15:55) *
Долго думал, что есть "тайпкасты" - это вы приведение типов имеете ввиду? sm.gif
Приведение типов можно применять только на свой страх и риск, когда точно знаешь что будет делать компилятор.
В части битовых полей это очень рисковано.

Они самые. Почему опасней-то в глубине это указатель на регистр или на копию его содержимого. Всё что раньше работало с ними будет однозначно продолжать работать.
Цитата(Alechek @ Apr 14 2016, 16:44) *
Сделает, при включенной оптимизации.
Но вот только если переменная не volatile. Коими практически всегда являются регистры.

Ну да. Мне обычно нужно было менять одиночные поля, поэтому эта деталь кмк мало влияет на реальное применение. Для атомарности нужна временная переменная.
AlexandrY
Цитата(pitt @ Apr 14 2016, 16:27) *
STM32. Just an example. Could be better for sure.

Код
enum DMA_ISR { DMA_ISR_FEIF = 0,   DMA_ISR_DMEIF = 2,    DMA_ISR_TEIF,  DMA_ISR_HTIF,  DMA_ISR_TCIF,
               DMA_ISR_FEIF0 = 0,  DMA_ISR_DMEIF0  = 2,  DMA_ISR_TEIF0, DMA_ISR_HTIF0, DMA_ISR_TCIF0,
               DMA_ISR_FEIF1,      DMA_ISR_DMEIF1  = 8,  DMA_ISR_TEIF1, DMA_ISR_HTIF1, DMA_ISR_TCIF1, };

...


Любые хитроумные конструкции и мнемоники без комментариев всегда будут ахинеей.
Возможности текстового синтаксиса исходников ИМХО уже себя исчерпали в деле наглядности представления.
Нужно привлекать инструменты типа IntelliSense и смысл только имеет обсуждать возможности разных IDE в этом деле.
pitt
Цитата(AlexandrY @ Apr 14 2016, 10:00) *
Любые хитроумные конструкции и мнемоники без комментариев всегда будут ахинеей.
Возможности текстового синтаксиса исходников ИМХО уже себя исчерпали в деле наглядности представления.
Нужно привлекать инструменты типа IntelliSense и смысл только имеет обсуждать возможности разных IDE в этом деле.

Ахинеея - это собственное мнение возведенное в абсолют. Мнение можно иметь, разделять или не соглашаться, но вот навязывать собственное, как непреложную истину действительно ахинея, если говорить мягко...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.