реклама на сайте
подробности

 
 
8 страниц V  « < 5 6 7 8 >  
Reply to this topicStart new topic
> HAL, сколько можно фиксить ?
ViKo
сообщение Apr 13 2016, 19:36
Сообщение #91


Универсальный солдатик
******

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



Скажите уже, что мой способ - и простой, и красивый.
Таня, разбираться надо не с Кубом, а с регистрами. Регистры описывали творцы, а Куб создали ремесленники (изучившие регистры).
Go to the top of the page
 
+Quote Post
ViKo
сообщение Apr 13 2016, 20:56
Сообщение #92


Универсальный солдатик
******

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



Цитата(AHTOXA @ Apr 13 2016, 20:28) *
Речь не об этом, а о:
0x30 & -0x30 = 0x10

Ага. Это есть трюк. Понятный, когда прикинешь к носу. Но даже автор (Сергей Борщ) в одной из тем описАлся, выдав nnn & ~nnn вместо nnn & -nnn.
Go to the top of the page
 
+Quote Post
Obam
сообщение Apr 14 2016, 09:08
Сообщение #93


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Цитата(ViKo @ Apr 14 2016, 00:56) *
Ага. Это есть трюк.


Hacker's Delight by Henry S. Warren, "Алгоритмические трюки для программистов".


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 14 2016, 09:27
Сообщение #94


Гуру
******

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



QUOTE (ViKo @ Apr 13 2016, 22:56) *
Ага. Это есть трюк. Понятный, когда прикинешь к носу.
2 + 2 = 4. Тоже трюк. Не использовать?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Apr 14 2016, 10:45
Сообщение #95


фанат дивана
******

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



Цитата(Сергей Борщ @ Apr 14 2016, 14:27) *
2 + 2 = 4. Тоже трюк. Не использовать?

Тут простая математика. А там - именно что трюк. Насколько я понимаю, он базируется на том, что числа представлены в дополнительном коде. И единичка получается из-за несимметричности представления положительных и отрицательных чисел. Если же числа будут не в дополнительном коде, то трюк не сработает.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Apr 14 2016, 12:17
Сообщение #96


Знающий
****

Группа: Свой
Сообщений: 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;
    }
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Apr 14 2016, 12:30
Сообщение #97


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(Kabdim @ Apr 14 2016, 15:17) *
Я извиняюсь, но почему бы не использовать структуры с битовыми полями? В них можно запихивать и энумы.


Потому что имена уже определены в хидерах.
Большинство тут пытается манипулировать с уже придуманными производителями HAL-ов именами.

Go to the top of the page
 
+Quote Post
Baser
сообщение Apr 14 2016, 12:37
Сообщение #98


Просто Che
*****

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



Цитата(Kabdim @ Apr 14 2016, 15:17) *
Я извиняюсь, но почему бы не использовать структуры с битовыми полями? В них можно запихивать и энумы.

Битовые поля хороши всем, кроме невозможности получить реальный номер бита, где это поле расположено.
Битовое поле и было придумано, чтобы скрыть эту якобы ненужную информацию.
Как результат, проблематично одной командой сбросить/установить несколько битовых полей одновременно.
Многие фирмы сейчас предоставляют хидеры для МК, где регистры расписаны как в виде битовых полей, так и в виде обычных дефайнов с номерами или масками битов.
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Apr 14 2016, 12:38
Сообщение #99


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



Цитата(AlexandrY @ Apr 14 2016, 15:30) *
Потому что имена уже определены в хидерах.
Большинство тут пытается манипулировать с уже придуманными производителями HAL-ов именами.

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

Последовательное присвоение полям нормальный компилятор должен оптимизировать в 1 команду. Если очень надо именно определнную в старом стиле маску - есть тайпкасты. Да и опять же к регистрам можно обращаться одновременно и как к структурам и как описано в хидере производителя.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Apr 14 2016, 12:44
Сообщение #100


Универсальный солдатик
******

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



Потому что у битовых полей их расположение в слове не определено точно, с какого бита начинается - с младшего или старшего, и может оказаться не совпадающим с расположением битов в регистрах.
Go to the top of the page
 
+Quote Post
Baser
сообщение Apr 14 2016, 12:55
Сообщение #101


Просто Che
*****

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



Цитата(Kabdim @ Apr 14 2016, 15:38) *
Последовательное присвоение полям нормальный компилятор должен оптимизировать в 1 команду.

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

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

Долго думал, что есть "тайпкасты" - это вы приведение типов имеете ввиду? sm.gif
Приведение типов можно применять только на свой страх и риск, когда точно знаешь что будет делать компилятор.
В части битовых полей это очень рисковано.
Go to the top of the page
 
+Quote Post
pitt
сообщение Apr 14 2016, 13:27
Сообщение #102


Местный
***

Группа: Участник
Сообщений: 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;


--------------------
Прокричал немой глухому:"...Спасибо за внимание!"
http://www.youtube.com/watch?v=3Nnj4ky4Z_g
Go to the top of the page
 
+Quote Post
Alechek
сообщение Apr 14 2016, 13:44
Сообщение #103


Профессионал
*****

Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



Цитата(Kabdim @ Apr 14 2016, 17:38) *
Последовательное присвоение полям нормальный компилятор должен оптимизировать в 1 команду.

Сделает, при включенной оптимизации.
Но вот только если переменная не volatile. Коими практически всегда являются регистры.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 14 2016, 13:52
Сообщение #104


Гуру
******

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



QUOTE (Kabdim @ Apr 14 2016, 14:38) *
Последовательное присвоение полям нормальный компилятор должен оптимизировать в 1 команду.
Если переменная объявлена как volatile, то он не только не должен, а наоборот, не имеет права оптимизировать в одну команду.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Apr 14 2016, 13:56
Сообщение #105


Знающий
****

Группа: Свой
Сообщений: 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) *
Долго думал, что есть "тайпкасты" - это вы приведение типов имеете ввиду? sm.gif
Приведение типов можно применять только на свой страх и риск, когда точно знаешь что будет делать компилятор.
В части битовых полей это очень рисковано.

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

Ну да. Мне обычно нужно было менять одиночные поля, поэтому эта деталь кмк мало влияет на реальное применение. Для атомарности нужна временная переменная.
Go to the top of the page
 
+Quote Post

8 страниц V  « < 5 6 7 8 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 16:39
Рейтинг@Mail.ru


Страница сгенерированна за 0.01498 секунд с 7
ELECTRONIX ©2004-2016