Палыч 10 10 августа, 2011 Опубликовано 10 августа, 2011 · Жалоба (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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 1 10 августа, 2011 Опубликовано 10 августа, 2011 · Жалоба :bb-offtopic: а как в С сделать именно "roll" битов? при операциях << и >> дополняются нулями, а roll ? roll с флагом? Или, в очередной раз, отдаем на откуп оптимизатору? операнд, разумеется, имеет разрядность МК Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 29 10 августа, 2011 Опубликовано 10 августа, 2011 · Жалоба :bb-offtopic: а как в С сделать именно "roll" битов? при операциях << и >> дополняются нулями, а roll ? roll с флагом? Или, в очередной раз, отдаем на откуп оптимизатору? операнд, разумеется, имеет разрядность МК А никак. Инлайнить асм только. И это в принципе правильно. Слишком уж аппаратнозависимо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 1 10 августа, 2011 Опубликовано 10 августа, 2011 · Жалоба А никак. Инлайнить асм только. И это в принципе правильно. Слишком уж аппаратнозависимо. ну и посему оффтопику офф :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 10 августа, 2011 Опубликовано 10 августа, 2011 · Жалоба А никак. Инлайнить асм только. И это в принципе правильно. Слишком уж аппаратнозависимо. Да бросьте вы только про 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)); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 1 10 августа, 2011 Опубликовано 10 августа, 2011 · Жалоба Для примера: во-во, я про эти конструкции и говорил. То есть, все нормально ляжет в асм? но проверить надо ) кстати, а как оно там с флагом? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ARV 1 11 августа, 2011 Опубликовано 11 августа, 2011 · Жалоба Для примера: __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))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Smoky 0 11 августа, 2011 Опубликовано 11 августа, 2011 · Жалоба Уважаемые коллеги, возможно ли использование указателей на битовые переменные? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 11 августа, 2011 Опубликовано 11 августа, 2011 · Жалоба Для начала задумайтесь над тем, что Вы называете "битовой переменной". В зависимости от этого Вы сами сможете ответить на свой вопрос отрицательно, или положительно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flexz 0 11 августа, 2011 Опубликовано 11 августа, 2011 · Жалоба Возможно, если архитектура поддерживает bit-banding. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Smoky 0 13 августа, 2011 Опубликовано 13 августа, 2011 · Жалоба Для начала задумайтесь над тем, что Вы называете "битовой переменной". В зависимости от этого Вы сами сможете ответить на свой вопрос отрицательно, или положительно. Забыл сказать что я использую 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 Уважаемые коллеги, если можно скажите в чём суть этих предупреждений, не могу понять. Хотя компиляция прошла успешно, всё же лучьше чтобы их небыло. Верхня строка прототип функции, следующая её вызов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 13 августа, 2011 Опубликовано 13 августа, 2011 (изменено) · Жалоба Уважаемые коллеги, если можно скажите в чём суть этих предупреждений, не могу понять. Хотя компиляция прошла успешно, всё же лучьше чтобы их небыло. Верхня строка прототип функции, следующая её вызов. &akk1.ucon имеет тип void * Параметры же другого типа. Если указать в параметрах вызова функции (byte *)&akk1.ucon, матюк касательно первого параметра исчезнет, итд Это, межпрочим, не пустые вопли, они влияют на оптимизацию и на обращения к volatile переменным, если таковые в списке параметров. Изменено 13 августа, 2011 пользователем _Pasha Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Smoky 0 13 августа, 2011 Опубликовано 13 августа, 2011 (изменено) · Жалоба &akk1.ucon имеет тип void * Параметры же другого типа. Если указать в параметрах вызова функции (byte *)&akk1.ucon, матюк касательно первого параметра исчезнет, итд Это, межпрочим, не пустые вопли, они влияют на оптимизацию и на обращения к volatile переменным, если таковые в списке параметров. Большое Вам спасибо, исправил и все предупреждения исчезли, а их было аж 42. Изменено 13 августа, 2011 пользователем дымок Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 13 августа, 2011 Опубликовано 13 августа, 2011 · Жалоба их было аж 42. Кабы их было 1-2 осознанно внесенных, тогда можно было бы сказать, что исправили. А так - просто вбили костыль :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Smoky 0 14 августа, 2011 Опубликовано 14 августа, 2011 · Жалоба Кабы их было 1-2 осознанно внесенных, тогда можно было бы сказать, что исправили. А так - просто вбили костыль :( Спасибо Вам за профессиональный "костыль". Просто у меня в программе около около десятка таких функций с подобными аргументами, потому и столько предупреждений. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться