Easyelectronics.ru

Электроника для всех
Текущее время: 14 окт 2019, 16:31

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 24 ] 
Автор Сообщение
 Заголовок сообщения: Си. Макросы установки, сброса нескольких битов.
СообщениеДобавлено: 24 май 2015, 10:25 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3540
Откуда: Новосибирск
Есть у кого такие макросы?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си. Макросы установки, сброса нескольких битов.
СообщениеДобавлено: 24 май 2015, 10:42 
Старожил

Зарегистрирован: 19 окт 2012, 06:14
Сообщения: 234
машина, красная, переднее правое стекло, есть у кого?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си. Макросы установки, сброса нескольких битов.
СообщениеДобавлено: 24 май 2015, 10:44 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3540
Откуда: Новосибирск
pteriks писал(а):
машина, красная, переднее правое стекло, есть у кого?

Или по делу, или лесом.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си. Макросы установки, сброса нескольких битов.
СообщениеДобавлено: 24 май 2015, 10:45 
Старожил

Зарегистрирован: 19 окт 2012, 06:14
Сообщения: 234
ух епт, да это ж не про GPIO xD тогда я вообще помолчу в сторонке xD


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си. Макросы установки, сброса нескольких битов.
СообщениеДобавлено: 24 май 2015, 10:59 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3540
Откуда: Новосибирск
pteriks писал(а):
ух епт, да это ж не про GPIO xD тогда я вообще помолчу в сторонке xD

Вот и молчи в сторонке. Если по делу сказать нечего. Петросянов и прочих троллей итак полно в инете. Решил пополнить их ряды?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си. Макросы установки, сброса нескольких битов.
СообщениеДобавлено: 24 май 2015, 11:24 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 01 апр 2013, 19:45
Сообщения: 32
demiurg1978 писал(а):
Есть у кого такие макросы?
вот тут было


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си. Макросы установки, сброса нескольких битов.
СообщениеДобавлено: 24 май 2015, 11:24 
Старожил
Аватара пользователя

Зарегистрирован: 10 фев 2012, 18:04
Сообщения: 827
Откуда: Україна
Что-то не понял что Вам нужно?
Не это же:

Код:
#define Bit(b) (1 << Bit)
#define SetBits(byte, mask) byte |= (mask)
#define ClearBits(byte, mask) byte &= (~(mask))

SetBits(val, Bit(1) | Bit(5));

_________________
"Если вы такие умные, что ж вы строем не ходите?"

Легче зажечь одну маленькую свечу, чем постоянно жаловаться на тьму...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си. Макросы установки, сброса нескольких битов.
СообщениеДобавлено: 24 май 2015, 12:47 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2621
Откуда: Санкт-Петербург
На плюсах делается, даже тут статья была: http://easyelectronics.ru/rabota-s-port ... na-si.html
Но для вас это сложновато ;-)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си. Макросы установки, сброса нескольких битов.
СообщениеДобавлено: 05 июн 2015, 15:54 
Старожил
Аватара пользователя

Зарегистрирован: 17 июн 2013, 14:28
Сообщения: 1124
Откуда: Красноярск
Добрый день. Как изменить несколько произвольных бит, (но стоящих по порядку) на свои, не затрагивая остальных в числе A? То что установить надо могут быть 1 или 0, и представляют из себя число Б.

Имеется ввиду есть ли быстрая маска без сброса этого места с последующим применением ИЛИ с новым уже значением.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си. Макросы установки, сброса нескольких битов.
СообщениеДобавлено: 05 июн 2015, 16:21 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2862
А чем плохо две операции? Сначала чистим маской, потом устанавливем биты, если есть.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си. Макросы установки, сброса нескольких битов.
СообщениеДобавлено: 05 июн 2015, 17:56 
Старожил

Зарегистрирован: 27 мар 2015, 01:22
Сообщения: 1442
Annigilator писал(а):
Как изменить несколько произвольных бит, (но стоящих по порядку) на свои, не затрагивая остальных в числе A? То что установить надо могут быть 1 или 0, и представляют из себя число Б.

Имеется ввиду есть ли быстрая маска без сброса этого места с последующим применением ИЛИ с новым уже значением.

В си есть один фокус для этого:
Код:
volatile union {
    unsigned char byte;
    struct {
        unsigned char from0to0 : 1;
        unsigned char from1to2 : 2;
        unsigned char : 2;
        unsigned char from5to7 : 3;
    } bits;
} portA;

int main () {
    portA.byte = 123;
    portA.bits.from0to0 = 1;
    portA.bits.from1to2 = 2;
    portA.bits.from5to7 = 3;
}

Но в реальности это всё равно конечно будет две операции - И и ИЛИ:
Код:
  15 0000 8BE7            ldi r24,lo8(123)
  16 0002 8093 0000       sts portA,r24
  17 0006 8091 0000       lds r24,portA
  18 000a 8160            ori r24,lo8(1<<0)
  19 000c 8093 0000       sts portA,r24
  20 0010 8091 0000       lds r24,portA
  21 0014 897F            andi r24,lo8(-7)
  22 0016 8460            ori r24,lo8(4)
  23 0018 8093 0000       sts portA,r24
  24 001c 8091 0000       lds r24,portA
  25 0020 8F71            andi r24,lo8(31)
  26 0022 8066            ori r24,lo8(96)
  27 0024 8093 0000       sts portA,r24

_________________
less is more


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си. Макросы установки, сброса нескольких битов.
СообщениеДобавлено: 05 июн 2015, 19:49 
Старожил

Зарегистрирован: 07 фев 2011, 21:00
Сообщения: 494
Откуда: Ханты-Мансийск
Для какого процессора ищите алгоритм?
Или Вы хотите для всех? Тогда он для некоторых камней может оказаться не эффективным.
Например, возможности AVR и ARM в этой области существенно разнятся. Алгоритм предложенный для AVR будет работать на ARM он не оптимально (если только компилятор не доделает за Вас Вашу работу)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си. Макросы установки, сброса нескольких битов.
СообщениеДобавлено: 06 июн 2015, 09:07 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 01 апр 2013, 19:45
Сообщения: 32
judchin писал(а):
Для какого процессора ищите алгоритм?
Или Вы хотите для всех? Тогда он для некоторых камней может оказаться не эффективным.
Например, возможности AVR и ARM в этой области существенно разнятся. Алгоритм предложенный для AVR будет работать на ARM он не оптимально (если только компилятор не доделает за Вас Вашу работу)
о каком ядре ARM идёт речь? и что за инструкции ядра?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си. Макросы установки, сброса нескольких битов.
СообщениеДобавлено: 06 июн 2015, 23:44 
Старожил

Зарегистрирован: 06 фев 2011, 15:16
Сообщения: 617
Откуда: Челябинск
iNOP писал(а):
judchin писал(а):
Для какого процессора ищите алгоритм?
Или Вы хотите для всех? Тогда он для некоторых камней может оказаться не эффективным.
Например, возможности AVR и ARM в этой области существенно разнятся. Алгоритм предложенный для AVR будет работать на ARM он не оптимально (если только компилятор не доделает за Вас Вашу работу)
о каком ядре ARM идёт речь? и что за инструкции ядра?

Дело не в инструкциях ядра. Дело в наличии соответствующих регистрах у порта ВВ. В любом случае потребуется две инструкции, как минимум. Или нет?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си. Макросы установки, сброса нескольких битов.
СообщениеДобавлено: 07 июн 2015, 01:49 
Заглядывает иногда

Зарегистрирован: 07 фев 2012, 19:31
Сообщения: 118
На платформе ARM STM32 есть возможность атомарно установить и сбросить биты в выходном регистре данных контроллера PIO. например установка бита 0 и сброс бита 1:
PIOC->BSRR = (1 << 0)|(1 << (16+1));

_________________
Прерывание на хальте, осложненное ПДП циклом...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си. Макросы установки, сброса нескольких битов.
СообщениеДобавлено: 07 июн 2015, 19:20 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 01 апр 2013, 19:45
Сообщения: 32
Bill писал(а):
iNOP писал(а):
judchin писал(а):
Для какого процессора ищите алгоритм?
Или Вы хотите для всех? Тогда он для некоторых камней может оказаться не эффективным.
Например, возможности AVR и ARM в этой области существенно разнятся. Алгоритм предложенный для AVR будет работать на ARM он не оптимально (если только компилятор не доделает за Вас Вашу работу)
о каком ядре ARM идёт речь? и что за инструкции ядра?

Дело не в инструкциях ядра. Дело в наличии соответствующих регистрах у порта ВВ. В любом случае потребуется две инструкции, как минимум. Или нет?
eugene_e_n писал(а):
На платформе ARM STM32 есть возможность атомарно установить и сбросить биты в выходном регистре данных контроллера PIO. например установка бита 0 и сброс бита 1:
PIOC->BSRR = (1 << 0)|(1 << (16+1));
Как быть, если разрядность данных минимум 32 бита?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си. Макросы установки, сброса нескольких битов.
СообщениеДобавлено: 08 июн 2015, 09:16 
Старожил

Зарегистрирован: 07 фев 2011, 21:00
Сообщения: 494
Откуда: Ханты-Мансийск
Цитата:
Как быть, если разрядность данных минимум 32 бита?

давайте все-таки определимся на каких контроллерах, на каких областях памяти это будет использоваться. еще хотелось бы язык написания уточнить. А то получается "сделайте то, не зная что"!
Для переменных в памяти или для регистров общего назначения обычно в системе команд есть битовые операции.
Если для портов I/O, то надо сначала, чтобы у контроллера был 32-х разрядный порт, а потом проанализировать возможные операции для работы с портами
Например: ARM семейство LPC2000. Там есть регистры IOxSET и IOxCLR. Просто отправляем в них маску.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си. Макросы установки, сброса нескольких битов.
СообщениеДобавлено: 08 июн 2015, 11:55 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 01 апр 2013, 19:45
Сообщения: 32
judchin писал(а):
Цитата:
Как быть, если разрядность данных минимум 32 бита?

давайте все-таки определимся на каких контроллерах, на каких областях памяти это будет использоваться. еще хотелось бы язык написания уточнить. А то получается "сделайте то, не зная что"!
Прочтите название темы, и первые четыре поста...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си. Макросы установки, сброса нескольких битов.
СообщениеДобавлено: 08 июн 2015, 14:13 
Старожил

Зарегистрирован: 07 фев 2011, 21:00
Сообщения: 494
Откуда: Ханты-Мансийск
iNOP ткни меня носом где в названии темы и первых четырех постах указан язык макроса, тип контроллера и область памяти.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си. Макросы установки, сброса нескольких битов.
СообщениеДобавлено: 08 июн 2015, 14:41 
Старожил

Зарегистрирован: 07 фев 2011, 21:00
Сообщения: 494
Откуда: Ханты-Мансийск
Макрос удовлетворяет всем предъявленным требованиям
Код:
Setbits MACRO var, maska 
   or var, maska
ENDM 

пример вызова:
Код:
Setbits A, 55555555h

P.S. архитектура x86, ассемблер MASM32


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си. Макросы установки, сброса нескольких битов.
СообщениеДобавлено: 08 июн 2015, 14:59 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 01 апр 2013, 19:45
Сообщения: 32
judchin писал(а):
Макрос удовлетворяет всем предъявленным требованиям
Код:
Setbits MACRO var, maska 
   or var, maska
ENDM 

пример вызова:
Код:
Setbits A, 55555555h

P.S. архитектура x86, ассемблер MASM32
опять всё свелось к побитовыми инструкциям OR и AND.

А если у меня данных превышают 32 бита??


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си. Макросы установки, сброса нескольких битов.
СообщениеДобавлено: 10 июн 2015, 00:44 
Старожил

Зарегистрирован: 07 фев 2011, 21:00
Сообщения: 494
Откуда: Ханты-Мансийск
Цитата:
пять всё свелось к побитовыми инструкциям OR и AND.

Какой вопрос, такой ответ.
Эти инструкции поддерживают все процессоры. Укажите семейство процессоров и будем конкретно думать об оптимальных (альтернативных) алгоритмах.
Цитата:
А если у меня данных превышают 32 бита??

Сами не знают, что хотят. Формализуйте четко задачу. Где будут храниться переменные?

Формально правильный макрос для данных шириной 64 бита
Код:
Setbits MACRO var, maska
   lea    ESI, var
   lea    EDI, maska
   movq MM0, qword ptr [ESI]
   por    MM0,  qword ptr [EDI]
   movq qword ptr [ESI], MM0
ENDM 

Макрос для архитектуры x86 с применением MMX
P.S. Жду требования на установку/сброс битов в массиве произвольной длины


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си. Макросы установки, сброса нескольких битов.
СообщениеДобавлено: 22 сен 2015, 21:18 
Старожил

Зарегистрирован: 05 фев 2013, 00:58
Сообщения: 3519
А кто знает, как в AVR быстро инвертировать флажок C?
В 51 была команда CPL C, а в АВРе ее нету, что вызывает у меня сильные душевные страдания.

ЗЫ. Все остальные флажки в SREG - не должны измениться.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си. Макросы установки, сброса нескольких битов.
СообщениеДобавлено: 22 сен 2015, 23:09 
Старожил
Аватара пользователя

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 742
Annigilator писал(а):
Добрый день. Как изменить несколько произвольных бит, (но стоящих по порядку) на свои, не затрагивая остальных в числе A? То что установить надо могут быть 1 или 0, и представляют из себя число Б.

Имеется ввиду есть ли быстрая маска без сброса этого места с последующим применением ИЛИ с новым уже значением.


Сброс по маске это в реальности девять тиков, но можно сократить до семи, заменив маску на команду. В кортексе можно сбросить n битов стоящих по порядку командой на асме: BFC{cond} Rd, #lsb, #width
/ cond условие, rd регистр обработки, #lsb это наименьший значащий бит, который должен быть очищен , #width количество бит.

http://infocenter.arm.com/help/index.js ... gchif.html
Асму можно легко обернуть в макрос static inline функции, тогда потерь в скорости будет минимум.
Про пики и авр - ничего хорошего сказать не могу, там такого нету.

_________________
Потоковая OS


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 24 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB