Перейти к содержанию
    

(1 << 2)

то есть такой сдвиг двигает единичку а после себя ноль оставляет ?

Да, загляните уж в какой нибудь учебник по языку С!

 

DDRD &= ~(1 << 2);

1. Десятичная константа 1. Двоичное представление 00000001

2. (1<<2) Сдвиг константы влево на 2. Получаем 00000100

3. ~(1<<2) Побитовая инверсия = 11111011

4. DDRD &= ~(1 << 2) Это эквивалентно такой записи DDRD = DDRD & ( ~(1 << 2)). Если значение битов DDRD равно

(х7)(х6)(х5)(х4)(х3)(х2)(х1)(х0), то после побитового логического умножения на 11111011 получаем результат

(х7)(х6)(х5)(х4)(х3)(0)(х1)(х0), который и заносится в DDRD.

 

Т.е. фактически - сбрасывается в ноль второй бит регистра DDRD.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

:bb-offtopic:

а как в С сделать именно "roll" битов?

при операциях << и >> дополняются нулями, а roll ? roll с флагом? Или, в очередной раз, отдаем на откуп оптимизатору?

операнд, разумеется, имеет разрядность МК

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

:bb-offtopic:

а как в С сделать именно "roll" битов?

при операциях << и >> дополняются нулями, а roll ? roll с флагом? Или, в очередной раз, отдаем на откуп оптимизатору?

операнд, разумеется, имеет разрядность МК

А никак. Инлайнить асм только. И это в принципе правильно. Слишком уж аппаратнозависимо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А никак. Инлайнить асм только. И это в принципе правильно. Слишком уж аппаратнозависимо.

ну и посему оффтопику офф :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А никак. Инлайнить асм только. И это в принципе правильно. Слишком уж аппаратнозависимо.

 

Да бросьте вы только про asm inline. Для примера:

 

__inline BYTE RotateByteLeft(BYTE n, unsigned long i)
{
  return (n << i) | (n >> (8 - i));
}

__inline BYTE RotateByteRight(BYTE n, unsigned long i)
{
  return (n >> i) | (n << (8 - i));
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для примера:

 

во-во, я про эти конструкции и говорил. То есть, все нормально ляжет в асм?

но проверить надо )

 

кстати, а как оно там с флагом?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для примера:

 

__inline BYTE RotateByteLeft(BYTE n, unsigned long i)
{
  return (n << i) | (n >> (8 - i));
}

__inline BYTE RotateByteRight(BYTE n, unsigned long i)
{
  return (n >> i) | (n << (8 - i));
}

или так:
#define ROR(x,y) (((x) >> (y)) | ((x) << ((sizeof(x)*8 - (y)))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Уважаемые коллеги, возможно ли использование указателей на битовые переменные?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для начала задумайтесь над тем, что Вы называете "битовой переменной". В зависимости от этого Вы сами сможете ответить на свой вопрос отрицательно, или положительно.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для начала задумайтесь над тем, что Вы называете "битовой переменной". В зависимости от этого Вы сами сможете ответить на свой вопрос отрицательно, или положительно.

 

Забыл сказать что я использую WinAVR. Жаль что Вы уклонились от ответа, в принципе я пробовал, не получилось. Потому мой ответ на мой вопрос отрицательный.

 

void detect_akk(byte *flag_prm,byte *indakk_prm,word *cloc_prm);

 

1064: case 1: detect_akk(&akk1.ucon,&akk1.index,&akk1.cloc1);break;

 

../Mcuzuaa.c:1064: warning: passing argument 1 of 'detect_akk' discards qualifiers from pointer target type

../Mcuzuaa.c:1064: warning: passing argument 2 of 'detect_akk' discards qualifiers from pointer target type

../Mcuzuaa.c:1064: warning: passing argument 3 of 'detect_akk' discards qualifiers from pointer target type

 

Уважаемые коллеги, если можно скажите в чём суть этих предупреждений, не могу понять. Хотя компиляция прошла успешно, всё же лучьше чтобы их небыло. Верхня строка прототип функции, следующая её вызов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Уважаемые коллеги, если можно скажите в чём суть этих предупреждений, не могу понять. Хотя компиляция прошла успешно, всё же лучьше чтобы их небыло. Верхня строка прототип функции, следующая её вызов.

&akk1.ucon имеет тип void *

Параметры же другого типа.

Если указать в параметрах вызова функции (byte *)&akk1.ucon, матюк касательно первого параметра исчезнет, итд

Это, межпрочим, не пустые вопли, они влияют на оптимизацию и на обращения к volatile переменным, если таковые в списке параметров.

Изменено пользователем _Pasha

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

&akk1.ucon имеет тип void *

Параметры же другого типа.

Если указать в параметрах вызова функции (byte *)&akk1.ucon, матюк касательно первого параметра исчезнет, итд

Это, межпрочим, не пустые вопли, они влияют на оптимизацию и на обращения к volatile переменным, если таковые в списке параметров.

 

Большое Вам спасибо, исправил и все предупреждения исчезли, а их было аж 42.

Изменено пользователем дымок

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

их было аж 42.

Кабы их было 1-2 осознанно внесенных, тогда можно было бы сказать, что исправили. А так - просто вбили костыль :(

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кабы их было 1-2 осознанно внесенных, тогда можно было бы сказать, что исправили. А так - просто вбили костыль :(

 

Спасибо Вам за профессиональный "костыль". Просто у меня в программе около около десятка таких функций с подобными аргументами, потому и столько предупреждений.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...