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

 
 
> Кто как работает с битами?
amost
сообщение Jun 19 2010, 09:18
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 28-10-05
Из: Ukraine, Khmelnitsky
Пользователь №: 10 246



avr-gcc

раньше объявлял одну/несколько байтовых переменных, дефайнами называл их биты. обращаясь к биту, использовал имя переменной, и соответствующее имя бита. очевидно, вариант неудобен при наличии большого кол-ва битовых переменных, нужно же помнить какой бит в каком байте.

может наверняка есть какой-то более удобный метод. макрос, определяющий имя байта с флагами по имени бита, что-ли.

Сообщение отредактировал amost - Jun 19 2010, 09:19
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
zltigo
сообщение Jun 19 2010, 10:10
Сообщение #2


Гуру
******

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



QUOTE (amost @ Jun 19 2010, 11:18) *
avr-gcc
раньше....

Как Вам уже сказал Dog Pawlowa - так и продолжайте, только добавьте имя регистра. Типа:
CODE
#define SIS5_LIG(x)    (((x)&0x3)<<6)
#define SIS5_LIM        BIT5
#define SIS5_MCG(x)    (((x)&0x3)<<3)
#define SIS5_MCM        BIT2
#define SIS5_HIM        BIT1
#define SIS5_IIR        BIT0

......
    si_write( SIS5, SIS5_LIG(LIG_20DB)|SIS5_MCG(0)|SIS5_MCM|SIS5_HIM);    // Line Gain +20dB
    si_write( SIS6, SIS6_RXG(RXG_0DB)|SIS6_LO_ON);             // RX 0dB Line Out Active

......
void si_write( int reg, bint data )
{
    if( ( reg >= SIS1 )&&( reg <= SIS9 ) )
    {
        if( !xIsTimeout( si3000_time ) )
            vSmartDelay( 1 );
        fpga_cmd( FCMD_SI3000|FCMD_WR, (reg<<8)|(BYTE)data );
        si_reg[reg] = (BYTE)data;
        si3000_time = xGetTimeout( 1 );
    }
    else
        xprintf( "SI:Invalid REG:%2X\r", reg );
}

Проверено на собственной шкуре многими годами поисков и применения разных "извратов".


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jun 19 2010, 11:27
Сообщение #3


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



На платформах, не имеющих атомарного битового доступа к ОЗУ,
использовать битовые переменные нерационально если:
1. они volatile
2. их достаточно мало (не стоит жмотиться и выиграть аж целых 20-50 байт ОЗУ)
3. они не расположены в sfr области (см п.1).

Я в 99% случаев под флаги использую целую ячейку памяти (байт или даже крупнее) и в ус не дую...

Оптимизация ресурсов ОЗУ не должна быть самоцелью...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 19 2010, 12:00
Сообщение #4


Гуру
******

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



QUOTE (demiurg_spb @ Jun 19 2010, 13:27) *
Я в 99% случаев под флаги использую целую ячейку памяти (байт или даже крупнее) и в ус не дую...

Ну и зря, в тех-же 99 случаях флаги не используются отдельно, а "кучкуются" и лазить за каждым флагом в память, вместо работы с этими флагами в единожды загруженном одном регистре это уже не только растраты памяти, но и производительности. Естественно, случаи бывают разными. И железо бывает разным.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jun 20 2010, 10:30
Сообщение #5


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(zltigo @ Jun 19 2010, 16:00) *
Ну и зря, в тех-же 99 случаях флаги не используются отдельно, а "кучкуются" и лазить за каждым флагом в память, вместо работы с этими флагами в единожды загруженном одном регистре это уже не только растраты памяти, но и производительности. Естественно, случаи бывают разными. И железо бывает разным.

Конечно, они могут и кучковаться, а могут и нет. Это меня даже не сильно заботит.
Меня во всей этой ситуации всегда напрягала необходимость использования критической секции.
И даже если они (флаги) обрабатываются пачками по 3-5 штук ещё не известно что будет оптимальнее прочитать 3-5 байт из ОЗУ или вкрячить критичекую секцию, добавив при этом лишнюю латентность (пусть даже и копеечную).
Мне всегда ближе наиболее простой вариант. И код не засорён лишними временными промежуточными переменными.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 20 2010, 10:49
Сообщение #6


Гуру
******

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



QUOTE (demiurg_spb @ Jun 20 2010, 12:30) *
И даже если они (флаги) обрабатываются пачками по 3-5 штук ещё не известно что будет оптимальнее прочитать 3-5 байт из ОЗУ или вкрячить критичекую секцию, добавив при этом лишнюю латентность (пусть даже и копеечную).

А зачем приплетать всуе слова "критическая секция". Эта сущность в общем случае совершенно отдельная. Если Вы не задумываясь щедрой рукой разбрасываете volatile да critical, и знаете только одну систему команд, то это не значит, что все должны следовать Вашему "примеру" и разбрасываться ресурсами sad.gif.



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jun 20 2010, 22:44
Сообщение #7


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(zltigo @ Jun 20 2010, 14:49) *
А зачем приплетать всуе слова "критическая секция". Эта сущность в общем случае совершенно отдельная. Если Вы не задумываясь щедрой рукой разбрасываете volatile да critical, и знаете только одну систему команд, то это не значит, что все должны следовать Вашему "примеру" и разбрасываться ресурсами sad.gif.
Пусть хоть один флаг волатилен, он и всех собратьев (из одного байта) сделает таковыми.
Оно надо? Да я даю реально упрощающий жизнь пример. Когда не надо помнить ни про волатильность ни про то что особо умный и жадный программист разделил волатильные флаги от неволатильных, а потом забыл об этом ненароком он сам или наследники его таланта.
Зачем закладывать грабли когда можно и нужно без них обходиться.
Просто. Надёжно. Без геморроя. Быстро и не требует лишней писанины (я об описании через дефайны мути в виде масок, что вообще применимо лишь для описании периферии). Хочется воскликнуть: Ау! мы пишем на Си а не на я языке препроцессора в конце то концов...

А Вы всё о какой-то мифической экономии ресурсов печётесь.
Не здесь блох ловить стоит 20 байт озу и 5-20 тиков тактовой.
Не мне Вам объяснять где. Вы сами прекрасно знаете про вынесение из цикла всякой чуши, про их разворачивание, про правильный (нативный) выбор типов данных и про уместное использование volatile да и вообще о культуре программирования.

А то право смешно даже становится как Вы упираетесь и особо смешно, что даже немного грустно,
от того что Ваша привычка домысливать и додумывать об умениях и интеллекте Ваших собеседников крепчает с годами...
Радует что пока до обсуждения ближайших родственников оппонентов дело не доходит...

Цитата(MALLOY2 @ Jun 20 2010, 20:34) *
Совершенно зря, у Cortex есть фича упрощающая работу с битами называется она "Bit Banding"
Все ваши флаги можно было упаковать в одно слово, а там работай хоть через маски хоть через Bit Banding.
Это отлично! Через пару месяцев ему потребуется портировать проект под процессор XXX с адресным пространством чуть меньшим чем 4Gb без Bit Banding... "О сколько нам открытий чудных готовит просвещения дух!" - это я не к тому чтобы не использовать новую полезную фичу, а к тому что и старая даёт сопоставимый результат.

Ну нет в Си полноценного типа данных меньшего чем uint_fast8_t!


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Herz
сообщение Jun 21 2010, 09:06
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 10 983
Регистрация: 23-11-05
Пользователь №: 11 287



Цитата(demiurg_spb @ Jun 21 2010, 01:44) *
Ну нет в Си полноценного типа данных меньшего чем uint_fast8_t!

Простите, что влезаю в интеллигентный разговор, но я в С не видел такого типа. Наверное, речь не об ANSI C?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jun 21 2010, 11:14
Сообщение #9


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



stdint.h часть С99

http://en.wikipedia.org/wiki/C_library


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Herz
сообщение Jun 21 2010, 15:03
Сообщение #10


Гуру
******

Группа: Модераторы
Сообщений: 10 983
Регистрация: 23-11-05
Пользователь №: 11 287



Цитата(demiurg_spb @ Jun 21 2010, 14:14) *

[attachment=45192:Clipboard02.jpg] ?
Go to the top of the page
 
+Quote Post
rezident
сообщение Jun 21 2010, 15:14
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Herz @ Jun 21 2010, 21:03) *
?
Не читайте советских газет перед обедом не ориентируйтесь на Википедию как на истину в последней инстанции. Справляйтесь у оригинала стандарта ISO/IEC 9899:1999 (E).

Цитата
7.18.1.3 Fastest minimum-width integer types
1Each of the following types designates an integer type that is usually fastest
216)
to operate
with among all integer types that have atleast the specified width.
2The typedef name int_fastN_t designates the fastest signed integer type with a width
of at least N.The typedef name uint_fastN_t designates the fastest unsigned integer
type with a width of at least N.
3The following types are required:
int_fast8_t
int_fast16_t
int_fast32_t
int_fast64_t
uint_fast8_t
uint_fast16_t
uint_fast32_t
uint_fast64_t
All other types of this form are optional.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 21 2010, 16:51
Сообщение #12


Гуру
******

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



QUOTE (rezident @ Jun 21 2010, 18:14) *
стандарта ISO/IEC 9899:1999 (E)

Ну свежие драфты не забывать ISO/IEC 9899:201x Крайний August 11, 2008. В них тоже уже изменений накопилось.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- amost   Кто как работает с битами?   Jun 19 2010, 09:18
- - Dog Pawlowa   Цитата(amost @ Jun 19 2010, 12:18) может ...   Jun 19 2010, 09:27
|- - M_Andrey   Код</P><P>union char_by_bit { st...   Jun 19 2010, 09:54
|- - MrYuran   Цитата(zltigo @ Jun 19 2010, 16:00) Естес...   Jun 19 2010, 13:40
||- - rezident   Цитата(MrYuran @ Jun 19 2010, 19:40) Или,...   Jun 19 2010, 15:20
||- - zltigo   QUOTE (MrYuran @ Jun 19 2010, 15:40) А ес...   Jun 19 2010, 17:08
||- - Serj78   Цитата(zltigo @ Jun 19 2010, 21:08) Вы хо...   Jun 19 2010, 18:03
|||- - zltigo   QUOTE (Serj78 @ Jun 19 2010, 20:03) Я не ...   Jun 19 2010, 19:15
||- - MrYuran   Цитата(zltigo @ Jun 19 2010, 21:08) Вы хо...   Jun 20 2010, 08:11
||- - MrYuran   Цитата(MrYuran @ Jun 20 2010, 12:11) Комп...   Jun 21 2010, 06:25
||- - demiurg_spb   Цитата(MrYuran @ Jun 21 2010, 10:25) Поэт...   Jun 21 2010, 08:50
|- - zltigo   QUOTE (demiurg_spb @ Jun 21 2010, 00:44) ...   Jun 21 2010, 06:09
||- - demiurg_spb   Цитата(zltigo @ Jun 21 2010, 10:09) Если ...   Jun 21 2010, 08:09
||- - zltigo   QUOTE (demiurg_spb @ Jun 21 2010, 10:09) ...   Jun 21 2010, 08:19
||- - Tanya   А я вот... делаю и так и эдак. Если быстро флаги (...   Jun 21 2010, 08:37
- - MALLOY2   ЦитатаЯ при переносе проекта на STM32 с avr решил ...   Jun 20 2010, 16:34
- - MALLOY2   ЦитатаЭто отлично! Через пару месяцев ему потр...   Jun 21 2010, 05:49
|- - Serj78   Цитата(MALLOY2 @ Jun 21 2010, 09:49) и ка...   Jun 21 2010, 17:39
|- - romez777   QUOTE (Serj78 @ Jun 21 2010, 21:39) А мож...   Jun 22 2010, 00:03
- - ViKo   Если определить несколько переменных типа bool, ко...   Jun 21 2010, 13:20
|- - rezident   Цитата(ViKo @ Jun 21 2010, 19:20) Если оп...   Jun 21 2010, 14:48
- - Herz   Ясно, спасибо. Но вроде как и int8_t, и uint8_t га...   Jun 21 2010, 17:02
|- - demiurg_spb   Цитата(Herz @ Jun 21 2010, 21:02) Ясно, с...   Jun 22 2010, 09:08
- - MALLOY2   ЦитатаА можно по подробнее, КАК он расширяет? Ког...   Jun 22 2010, 08:40


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 18:49
Рейтинг@Mail.ru


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