|
Кто как работает с битами? |
|
|
|
Jun 19 2010, 09:18
|

Участник

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

|
avr-gcc
раньше объявлял одну/несколько байтовых переменных, дефайнами называл их биты. обращаясь к биту, использовал имя переменной, и соответствующее имя бита. очевидно, вариант неудобен при наличии большого кол-ва битовых переменных, нужно же помнить какой бит в каком байте.
может наверняка есть какой-то более удобный метод. макрос, определяющий имя байта с флагами по имени бита, что-ли.
Сообщение отредактировал amost - Jun 19 2010, 09:19
|
|
|
|
|
 |
Ответов
|
Jun 19 2010, 10:10
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Jun 19 2010, 12:00
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Jun 20 2010, 10:30
|

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

|
Цитата(zltigo @ Jun 19 2010, 16:00)  Ну и зря, в тех-же 99 случаях флаги не используются отдельно, а "кучкуются" и лазить за каждым флагом в память, вместо работы с этими флагами в единожды загруженном одном регистре это уже не только растраты памяти, но и производительности. Естественно, случаи бывают разными. И железо бывает разным. Конечно, они могут и кучковаться, а могут и нет. Это меня даже не сильно заботит. Меня во всей этой ситуации всегда напрягала необходимость использования критической секции. И даже если они (флаги) обрабатываются пачками по 3-5 штук ещё не известно что будет оптимальнее прочитать 3-5 байт из ОЗУ или вкрячить критичекую секцию, добавив при этом лишнюю латентность (пусть даже и копеечную). Мне всегда ближе наиболее простой вариант. И код не засорён лишними временными промежуточными переменными.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Jun 20 2010, 22:44
|

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

|
Цитата(zltigo @ Jun 20 2010, 14:49)  А зачем приплетать всуе слова "критическая секция". Эта сущность в общем случае совершенно отдельная. Если Вы не задумываясь щедрой рукой разбрасываете volatile да critical, и знаете только одну систему команд, то это не значит, что все должны следовать Вашему "примеру" и разбрасываться ресурсами  . Пусть хоть один флаг волатилен, он и всех собратьев (из одного байта) сделает таковыми. Оно надо? Да я даю реально упрощающий жизнь пример. Когда не надо помнить ни про волатильность ни про то что особо умный и жадный программист разделил волатильные флаги от неволатильных, а потом забыл об этом ненароком он сам или наследники его таланта. Зачем закладывать грабли когда можно и нужно без них обходиться. Просто. Надёжно. Без геморроя. Быстро и не требует лишней писанины (я об описании через дефайны мути в виде масок, что вообще применимо лишь для описании периферии). Хочется воскликнуть: Ау! мы пишем на Си а не на я языке препроцессора в конце то концов... А Вы всё о какой-то мифической экономии ресурсов печётесь. Не здесь блох ловить стоит 20 байт озу и 5-20 тиков тактовой. Не мне Вам объяснять где. Вы сами прекрасно знаете про вынесение из цикла всякой чуши, про их разворачивание, про правильный (нативный) выбор типов данных и про уместное использование volatile да и вообще о культуре программирования. А то право смешно даже становится как Вы упираетесь и особо смешно, что даже немного грустно, от того что Ваша привычка домысливать и додумывать об умениях и интеллекте Ваших собеседников крепчает с годами... Радует что пока до обсуждения ближайших родственников оппонентов дело не доходит... Цитата(MALLOY2 @ Jun 20 2010, 20:34)  Совершенно зря, у Cortex есть фича упрощающая работу с битами называется она "Bit Banding"Все ваши флаги можно было упаковать в одно слово, а там работай хоть через маски хоть через Bit Banding. Это отлично! Через пару месяцев ему потребуется портировать проект под процессор XXX с адресным пространством чуть меньшим чем 4Gb без Bit Banding... "О сколько нам открытий чудных готовит просвещения дух!" - это я не к тому чтобы не использовать новую полезную фичу, а к тому что и старая даёт сопоставимый результат. Ну нет в Си полноценного типа данных меньшего чем uint_fast8_t!
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Jun 21 2010, 06:09
|

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

|
QUOTE (demiurg_spb @ Jun 21 2010, 00:44)  Да я даю реально упрощающий жизнь пример. Когда не надо помнить ни.... Если не хочется помнить, знать, отвечать, то надо идти в дворники, ну или программисты 1C - там всякие бездумные действия порядке вещей. QUOTE и про уместное использование volatile да и вообще о культуре программирования. Вот именно по этой причине меня и задевает пропаганда "реально упрощающий жизнь пример. Когда не надо помнить" подход к программированию  .
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jun 21 2010, 08:09
|

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

|
Цитата(zltigo @ Jun 21 2010, 10:09)  Если не хочется помнить, знать, отвечать, то надо идти в дворники, ну или программисты 1C - там всякие бездумные действия порядке вещей. Опять 25... Обобщаем обобщаемое... Еще забыли сказать, что всю Россию пропили... А моих доводов ЗА так и не увидели. Я ваш единственный довод об увеличении производительности парировал своими доводами. А Вы всё юлите и в общемировые проблемы уходите и проблемы частного индивида. Цитата Вот именно по этой причине меня и задевает пропаганда "реально упрощающий жизнь пример. Когда не надо помнить" подход к программированию  . Ну не хотите Вы понять что прозрачно написанная программа это благо как ни крути. А любое привнесённое - это муть в чистой воде. Все я с Вами в такой манере больше не желаю общаться. И на том спасибо! Цитата(MALLOY2 @ Jun 21 2010, 09:49)  и какие проблемы ? Все зависит как вы опишете Bit Banding, так вы его и портируете. Никаких проблем нет. Также как и явных преимуществ перед нативным типом. И тем что надо портировать и описывать. Цитата Использовать 8-битный тип для флагов это двойной геморой, первое это расход памяти, второе это компилятор всегда расширяет 8 бит до 32 бит, а это для кортекса 1 лишняя команда. Где вы увидели что я предлагал использовать "жёсткий" 8-ми битный тип? Да будет перерасход памяти. Это действительно плохо и ужасно. Сколько сейчас в среднем ставят на кортексах 8, 16К? Для ликбеза: как там в кортексе устроен механизм записи 32-битного регистра в ОЗУ атомарно? И бывает ли иначе?
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
Сообщений в этой теме
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      Herz Цитата(demiurg_spb @ Jun 21 2010, 01:44) ... Jun 21 2010, 09:06       demiurg_spb stdint.h часть С99
http://en.wikipedia.org/wiki/C... Jun 21 2010, 11:14        Herz Цитата(demiurg_spb @ Jun 21 2010, 14:14) ... Jun 21 2010, 15:03         rezident Цитата(Herz @ Jun 21 2010, 21:03) ?Не чит... Jun 21 2010, 15:14          zltigo QUOTE (rezident @ Jun 21 2010, 18:14) ста... Jun 21 2010, 16:51 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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|