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

 
 
5 страниц V  < 1 2 3 4 5 >  
Reply to this topicStart new topic
> Вопрос по си
Палыч
сообщение Aug 10 2011, 11:28
Сообщение #31


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(ветерок @ Aug 10 2011, 15:14) *
(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.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Aug 10 2011, 16:22
Сообщение #32


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



bb-offtopic.gif
а как в С сделать именно "roll" битов?
при операциях << и >> дополняются нулями, а roll ? roll с флагом? Или, в очередной раз, отдаем на откуп оптимизатору?
операнд, разумеется, имеет разрядность МК
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Aug 10 2011, 16:57
Сообщение #33


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(toweroff @ Aug 10 2011, 20:22) *
bb-offtopic.gif
а как в С сделать именно "roll" битов?
при операциях << и >> дополняются нулями, а roll ? roll с флагом? Или, в очередной раз, отдаем на откуп оптимизатору?
операнд, разумеется, имеет разрядность МК

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


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
toweroff
сообщение Aug 10 2011, 17:04
Сообщение #34


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(MrYuran @ Aug 10 2011, 20:57) *
А никак. Инлайнить асм только. И это в принципе правильно. Слишком уж аппаратнозависимо.

ну и посему оффтопику офф sm.gif
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Aug 10 2011, 17:39
Сообщение #35


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(MrYuran @ Aug 10 2011, 20:57) *
А никак. Инлайнить асм только. И это в принципе правильно. Слишком уж аппаратнозависимо.


Да бросьте вы только про 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));
}

Go to the top of the page
 
+Quote Post
toweroff
сообщение Aug 10 2011, 17:52
Сообщение #36


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(sergeeff @ Aug 10 2011, 21:39) *
Для примера:


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

кстати, а как оно там с флагом?
Go to the top of the page
 
+Quote Post
ARV
сообщение Aug 11 2011, 04:27
Сообщение #37


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(sergeeff @ Aug 10 2011, 20:39) *
Для примера:

Код
__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)))


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
Smoky
сообщение Aug 11 2011, 16:42
Сообщение #38


Местный
***

Группа: Свой
Сообщений: 401
Регистрация: 7-05-10
Из: Оренбург
Пользователь №: 57 135



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


--------------------
Лень, оттвори дверь, сгоришь - а хоть и сгорю, но не оттворю.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 11 2011, 17:33
Сообщение #39


Гуру
******

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



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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Flexz
сообщение Aug 11 2011, 19:36
Сообщение #40


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 9-10-08
Из: Московская обл.
Пользователь №: 40 797



Возможно, если архитектура поддерживает bit-banding.
Go to the top of the page
 
+Quote Post
Smoky
сообщение Aug 13 2011, 15:31
Сообщение #41


Местный
***

Группа: Свой
Сообщений: 401
Регистрация: 7-05-10
Из: Оренбург
Пользователь №: 57 135



Цитата(zltigo @ Aug 11 2011, 23:33) *
Для начала задумайтесь над тем, что Вы называете "битовой переменной". В зависимости от этого Вы сами сможете ответить на свой вопрос отрицательно, или положительно.


Забыл сказать что я использую 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

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


--------------------
Лень, оттвори дверь, сгоришь - а хоть и сгорю, но не оттворю.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Aug 13 2011, 15:38
Сообщение #42


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(дымок @ Aug 13 2011, 18:31) *
Уважаемые коллеги, если можно скажите в чём суть этих предупреждений, не могу понять. Хотя компиляция прошла успешно, всё же лучьше чтобы их небыло. Верхня строка прототип функции, следующая её вызов.

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

Сообщение отредактировал _Pasha - Aug 13 2011, 15:38
Go to the top of the page
 
+Quote Post
Smoky
сообщение Aug 13 2011, 16:56
Сообщение #43


Местный
***

Группа: Свой
Сообщений: 401
Регистрация: 7-05-10
Из: Оренбург
Пользователь №: 57 135



Цитата(_Pasha @ Aug 13 2011, 21:38) *
&akk1.ucon имеет тип void *
Параметры же другого типа.
Если указать в параметрах вызова функции (byte *)&akk1.ucon, матюк касательно первого параметра исчезнет, итд
Это, межпрочим, не пустые вопли, они влияют на оптимизацию и на обращения к volatile переменным, если таковые в списке параметров.


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

Сообщение отредактировал дымок - Aug 13 2011, 16:58


--------------------
Лень, оттвори дверь, сгоришь - а хоть и сгорю, но не оттворю.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 13 2011, 20:11
Сообщение #44


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(дымок @ Aug 13 2011, 20:56) *
их было аж 42.

Кабы их было 1-2 осознанно внесенных, тогда можно было бы сказать, что исправили. А так - просто вбили костыль sad.gif
Go to the top of the page
 
+Quote Post
Smoky
сообщение Aug 14 2011, 10:18
Сообщение #45


Местный
***

Группа: Свой
Сообщений: 401
Регистрация: 7-05-10
Из: Оренбург
Пользователь №: 57 135



Цитата(aaarrr @ Aug 14 2011, 02:11) *
Кабы их было 1-2 осознанно внесенных, тогда можно было бы сказать, что исправили. А так - просто вбили костыль sad.gif


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


--------------------
Лень, оттвори дверь, сгоришь - а хоть и сгорю, но не оттворю.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 10:40
Рейтинг@Mail.ru


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