|
|
  |
HAL, сколько можно фиксить ? |
|
|
|
Apr 14 2016, 12:17
|
Знающий
   
Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842

|
Я извиняюсь, но почему бы не использовать структуры с битовыми полями? В них можно запихивать и энумы. Код #include <iostream> using namespace std; enum BOOL { f=0, t=1 }; struct A { BOOL b:1; }; int main() { A a; a.b = t; if (a.b == t) { cout << "bit fields"; } return 0; }
|
|
|
|
|
Apr 14 2016, 12:37
|

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

|
Цитата(Kabdim @ Apr 14 2016, 15:17)  Я извиняюсь, но почему бы не использовать структуры с битовыми полями? В них можно запихивать и энумы. Битовые поля хороши всем, кроме невозможности получить реальный номер бита, где это поле расположено. Битовое поле и было придумано, чтобы скрыть эту якобы ненужную информацию. Как результат, проблематично одной командой сбросить/установить несколько битовых полей одновременно. Многие фирмы сейчас предоставляют хидеры для МК, где регистры расписаны как в виде битовых полей, так и в виде обычных дефайнов с номерами или масками битов.
|
|
|
|
|
Apr 14 2016, 12:38
|
Знающий
   
Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842

|
Цитата(AlexandrY @ Apr 14 2016, 15:30)  Потому что имена уже определены в хидерах. Большинство тут пытается манипулировать с уже придуманными производителями HAL-ов именами. Это же не взаимоисключающие способы. То что не критично, с тем использовать HAL (причем на уровне оберток и автогенератора) и не париться. А для того блока для которого стоит задача высосать все соки и небольшой кусок хедеров переписать не зазорно. Всё равно своя библиотечка с нужным функционалом будет писаться дольше этого переписывания уже существующего, но при этом она будет значительно яснее. Цитата(Baser @ Apr 14 2016, 15:37)  Битовое поле и было придумано, чтобы скрыть эту якобы ненужную информацию. Как результат, проблематично одной командой сбросить/установить несколько битовых полей одновременно. Многие фирмы сейчас предоставляют хидеры для МК, где регистры расписаны как в виде битовых полей, так и в виде обычных дефайнов с номерами или масками битов. Последовательное присвоение полям нормальный компилятор должен оптимизировать в 1 команду. Если очень надо именно определнную в старом стиле маску - есть тайпкасты. Да и опять же к регистрам можно обращаться одновременно и как к структурам и как описано в хидере производителя.
|
|
|
|
|
Apr 14 2016, 12:55
|

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

|
Цитата(Kabdim @ Apr 14 2016, 15:38)  Последовательное присвоение полям нормальный компилятор должен оптимизировать в 1 команду. Ключевое слово - должен. Но не обязан. Цитата Если очень надо именно определнную в старом стиле маску - есть тайпкасты. Долго думал, что есть "тайпкасты" - это вы приведение типов имеете ввиду?  Приведение типов можно применять только на свой страх и риск, когда точно знаешь что будет делать компилятор. В части битовых полей это очень рисковано.
|
|
|
|
|
Apr 14 2016, 13:27
|
Местный
  
Группа: Участник
Сообщений: 328
Регистрация: 1-06-06
Из: USA
Пользователь №: 17 672

|
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;
--------------------
|
|
|
|
|
Apr 14 2016, 13:44
|
Профессионал
    
Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882

|
Цитата(Kabdim @ Apr 14 2016, 17:38)  Последовательное присвоение полям нормальный компилятор должен оптимизировать в 1 команду. Сделает, при включенной оптимизации. Но вот только если переменная не volatile. Коими практически всегда являются регистры.
|
|
|
|
|
Apr 14 2016, 13:56
|
Знающий
   
Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842

|
Цитата(ViKo @ Apr 14 2016, 15:44)  Потому что у битовых полей их расположение в слове не определено точно, с какого бита начинается - с младшего или старшего, и может оказаться не совпадающим с расположением битов в регистрах. Это имеет значение только если менять компилятор или платформу с ABI. Если менять платформу - платформозависимый код с ковырянием в регистрах в любом случае придется выкинуть и написать с начала. Да и компиляторы кмк меняют туда-сюда редко. К тому же скорее всего компиляторы на одной платформе будут раскидывать бит филды одинаково. В противном случае да, определение структуры придется поправить. Но не используемых перечислений и т.д. Цитата(Baser @ Apr 14 2016, 15:55)  Ключевое слово - должен. Но не обязан. На практике оптимизируют. Цитата(Baser @ Apr 14 2016, 15:55)  Долго думал, что есть "тайпкасты" - это вы приведение типов имеете ввиду?  Приведение типов можно применять только на свой страх и риск, когда точно знаешь что будет делать компилятор. В части битовых полей это очень рисковано. Они самые. Почему опасней-то в глубине это указатель на регистр или на копию его содержимого. Всё что раньше работало с ними будет однозначно продолжать работать. Цитата(Alechek @ Apr 14 2016, 16:44)  Сделает, при включенной оптимизации. Но вот только если переменная не volatile. Коими практически всегда являются регистры. Ну да. Мне обычно нужно было менять одиночные поля, поэтому эта деталь кмк мало влияет на реальное применение. Для атомарности нужна временная переменная.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|