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

 
 
> Последовательность действий - побитовая инверсия и сдвиг, (~PIND) >> 4 == ~(PIND >> 4) ???
Dx!
сообщение Sep 28 2010, 16:15
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 108
Регистрация: 6-02-09
Из: Новочеркасск
Пользователь №: 44 469



Компилятор WinAVR-20090313

Неужели ((~PIND) >> 4) и (~(PIND >> 4)) должны давать одинаковый результат?

PIND у меня равен 0b1110????

~(PIND >> 4) получается 0b11110001 как и должно быть.

(~PIND) >> 4 получается тоже 0b11110001, хотя мне кажется должно быть 0b00000001

Я ошибаюсь?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Dx!
сообщение Sep 30 2010, 09:05
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 108
Регистрация: 6-02-09
Из: Новочеркасск
Пользователь №: 44 469



Как заключение - остановился на варианте
somevar = (uint8_t)(~PIND) >> 4;
ибо
Код
----------------------------------------------------
    PORTB = (~PIND) >> 4;
  80:    89 b1           in    r24, 0x09; 9
  82:    90 e0           ldi    r25, 0x00; 0
  84:    80 95           com    r24
  86:    90 95           com    r25
  88:    95 95           asr    r25
  8a:    87 95           ror    r24
  8c:    95 95           asr    r25
  8e:    87 95           ror    r24
  90:    95 95           asr    r25
  92:    87 95           ror    r24
  94:    95 95           asr    r25
  96:    87 95           ror    r24
  98:    85 b9           out    0x05, r24; 5
----------------------------------------------------
    PORTB = ((~PIND) >> 4)&0xf;
  80:    89 b1           in    r24, 0x09; 9
  82:    90 e0           ldi    r25, 0x00; 0
  84:    80 95           com    r24
  86:    90 95           com    r25
  88:    95 95           asr    r25
  8a:    87 95           ror    r24
  8c:    95 95           asr    r25
  8e:    87 95           ror    r24
  90:    95 95           asr    r25
  92:    87 95           ror    r24
  94:    95 95           asr    r25
  96:    87 95           ror    r24
  98:    8f 70           andi    r24, 0x0F; 15
  9a:    85 b9           out    0x05, r24; 5
----------------------------------------------------
    PORTB = ((~PIND)&0xff) >> 4;
  80:    89 b1           in    r24, 0x09; 9
  82:    80 95           com    r24
  84:    90 e0           ldi    r25, 0x00; 0
  86:    95 95           asr    r25
  88:    87 95           ror    r24
  8a:    95 95           asr    r25
  8c:    87 95           ror    r24
  8e:    95 95           asr    r25
  90:    87 95           ror    r24
  92:    95 95           asr    r25
  94:    87 95           ror    r24
  96:    85 b9           out    0x05, r24; 5
----------------------------------------------------
    PORTB = ((uint8_t)(~PIND)) >> 4;
  80:    89 b1           in    r24, 0x09; 9
  82:    80 95           com    r24
  84:    82 95           swap    r24
  86:    8f 70           andi    r24, 0x0F; 15
  88:    85 b9           out    0x05, r24; 5
----------------------------------------------------
    PORTB = (uint8_t)(~PIND) >> 4;
  80:    89 b1           in    r24, 0x09; 9
  82:    80 95           com    r24
  84:    82 95           swap    r24
  86:    8f 70           andi    r24, 0x0F; 15
  88:    85 b9           out    0x05, r24; 5
----------------------------------------------------
    uint8_t tmpD;
    tmpD = PIND;
  80:    89 b1           in    r24, 0x09; 9
    tmpD = ~tmpD;

    PORTB = tmpD >> 4;
  82:    80 95           com    r24
  84:    82 95           swap    r24
  86:    8f 70           andi    r24, 0x0F; 15
  88:    85 b9           out    0x05, r24; 5
----------------------------------------------------

Даже swap а не тупо сдвиг. Компиленно с -O2.

Сообщение отредактировал Dx! - Sep 30 2010, 09:12
Go to the top of the page
 
+Quote Post
rezident
сообщение Sep 30 2010, 10:47
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Dx! @ Sep 30 2010, 15:05) *
Как заключение - остановился на варианте
somevar = (uint8_t)(~PIND) >> 4;
Вы еще один вариант не проверили
Код
somevar = (PIND^0xFF) >> 4;

Go to the top of the page
 
+Quote Post
777777
сообщение Sep 30 2010, 10:53
Сообщение #4


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

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



Цитата(rezident @ Sep 30 2010, 14:47) *
Вы еще один вариант не проверили
Код
somevar = (PIND^0xFF) >> 4;

Какая разница? Все равно он приводит операнды к типу int
Go to the top of the page
 
+Quote Post
rezident
сообщение Sep 30 2010, 11:25
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(777777 @ Sep 30 2010, 16:53) *
Какая разница? Все равно он приводит операнды к типу int
Не обязательно. Зависит от платформы, компилятора и оптимизации. На MSP430, например, преобразуется в команды работы с байтами, а не словами.
Go to the top of the page
 
+Quote Post
777777
сообщение Sep 30 2010, 12:00
Сообщение #6


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

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



Цитата(rezident @ Sep 30 2010, 15:25) *
Не обязательно. Зависит от платформы, компилятора и оптимизации. На MSP430, например, преобразуется в команды работы с байтами, а не словами.

Да, кейл тоже творчески подходит к стандарту и знает где можно от него отойти ради более эффективного кода. А гцц слишком тупо ему следует.
Go to the top of the page
 
+Quote Post
Petka
сообщение Sep 30 2010, 12:24
Сообщение #7


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

Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886



Цитата(777777 @ Sep 30 2010, 16:00) *
Да, кейл тоже творчески подходит к стандарту и знает где можно от него отойти ради более эффективного кода. А гцц слишком тупо ему следует.

Не бывает тупого следования стандарту.

Бывает либо соответствие стандарту, либо несоответствие стандарту.
Если компилятор не соответствует стандарту, то одинаковый код на разных платформах будет давать разный результат.
Go to the top of the page
 
+Quote Post
777777
сообщение Sep 30 2010, 15:51
Сообщение #8


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

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



Цитата(Petka @ Sep 30 2010, 16:24) *
Не бывает тупого следования стандарту.

Бывает либо соответствие стандарту, либо несоответствие стандарту.
Если компилятор не соответствует стандарту, то одинаковый код на разных платформах будет давать разный результат.

Все верно. Но бывают случаи, когда несоответствие стандарту дает лучшие результаты, чем соответствие. В частности, стандарт требует при выполнении операций приводить операнды к типу int. Может это и хорошо когда размер int соответствует естественному размеру переменной на данной платформе. Но в 8-разрядных процессорах это не так - int не может быть 8-битным, а выполнение операций в 16-разрядных переменных приводит к неэффективности кода.
Другой пример - различные адресные пространства. Стандарт предназначен для машин фон-неймановской архитертуры и ничего не хочет знать о том, что указатель может указывать как на пространство кода, так и на пространство данных. А в кейле можно объявить указатель на нужное нам пространство и просто разыменовывать его *p безо всяких уродских pgm_read_byte и компилятор генерирует нужный код в зависимости от типа указателя.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 30 2010, 20:19
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(777777 @ Sep 30 2010, 18:51) *
Все верно. Но бывают случаи, когда несоответствие стандарту дает лучшие результаты, чем соответствие. В частности, стандарт требует при выполнении операций приводить операнды к типу int. Может это и хорошо когда размер int соответствует естественному размеру переменной на данной платформе. Но в 8-разрядных процессорах это не так - int не может быть 8-битным, а выполнение операций в 16-разрядных переменных приводит к неэффективности кода.
Стандарт не запрещает компилятору выкинуть в процессе оптимизации действия, не влияющие на результат. Что мы и видели на примере выражения PORTB = (PIND^0xFF) >> 4; То, что он не пришел к такому же коду на других выражениях - говорит лишь о несовершенстве оптимизатора, но никак не о кривости стандарта. Если компиляторы соответствуют стандарту - результат работы скомпилированного на любом из них кода будет одинаков (оптимальность кода стандарт не оговаривает). А вот если компиляторы нарушают стандарт - счастливой отладки и забудьте о переносимости.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
777777
сообщение Oct 1 2010, 05:01
Сообщение #10


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

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



Цитата(Сергей Борщ @ Oct 1 2010, 00:19) *
(оптимальность кода стандарт не оговаривает).

Вот и плохо! Можкт для обычных программ оптимальность и не важна, но для микроконтроллеров это самый главный параметр.
Цитата(Сергей Борщ @ Oct 1 2010, 00:19) *
А вот если компиляторы нарушают стандарт - счастливой отладки

Я некоторое время программировал на кейле для 51-го - очень приятный компилятор несмотря на несоответствие стандарту. Просто к нарушению стандарта нужно подходить с умом.
Цитата(Сергей Борщ @ Oct 1 2010, 00:19) *
и забудьте о переносимости.

Какая переносимость, о чем вы?! Все носятся с этим флагом, хотя прекрасно понимают, что никакой переносимости сейчас нет и она никому не нужна. Даже перенести с WinAVR на IAR вы не сможете - библиотеки, специфичные для контроллера, никто не стандартизировать не собирается. Да и куча мелких фич типа обращения к программной памяти или к отдельным битам порта у всех делается по-разному. Или может вы собираетесь в некотором устройстве поменять AVR на ARM и перенести туда свою программу? Это еще смешнее. Тут вообще о переносимости нет смысла говорить, это будет совершенно другая программа.
Давайте уж честно скажем себе: единственное, для чего нужен язык высокого уровня - для облегчения программирования. Чтобы при программировании думать об алгоритме, а не о регистрах, методах адресации и их ограничениях. А раз так, то он должет быть максимально приспособлен под платформу, а не под абстрактный стандарт.
Go to the top of the page
 
+Quote Post
xelax
сообщение Oct 1 2010, 06:03
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035



Цитата(777777 @ Oct 1 2010, 09:01) *
Какая переносимость, о чем вы?! Все носятся с этим флагом, хотя прекрасно понимают, что никакой переносимости сейчас нет и она никому не нужна. Даже перенести с WinAVR на IAR вы не сможете - библиотеки, специфичные для контроллера, никто не стандартизировать не собирается. Да и куча мелких фич типа обращения к программной памяти или к отдельным битам порта у всех делается по-разному. Или может вы собираетесь в некотором устройстве поменять AVR на ARM и перенести туда свою программу? Это еще смешнее. Тут вообще о переносимости нет смысла говорить, это будет совершенно другая программа.
Давайте уж честно скажем себе: единственное, для чего нужен язык высокого уровня - для облегчения программирования. Чтобы при программировании думать об алгоритме, а не о регистрах, методах адресации и их ограничениях. А раз так, то он должет быть максимально приспособлен под платформу, а не под абстрактный стандарт.


Полнейшая чушь.

Переносимость не то что ВАЖНА, а без неё в принципе никак нельзя. Слишком узко мыслите, в рамках своих локальных задач. Посмотрите на успешные проекты различных кроссплатформенных операционок, различных сетевых стеков, всевозможных библиотек и т.д.. Без стандарта реализация подобных проектов была бы немыслима. Если следовать стандарту С и писать код на чистом как слеза С, то 99% вероятностью, код скомпилируется и заработает на любой платформе (1% на hardware features). Например мы сейчас имеем код который работает на 5 различных архитектурах (AVR, AVR32, ARM7, Cortex, x086) и собирается без проблем двумя компиляторами IAR и GCC.
А ещё забыл, на писишке ещё в Visual Stidio всё собирается, но это так баловство было, для теорет. исследований.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Dx!   Последовательность действий - побитовая инверсия и сдвиг   Sep 28 2010, 16:15
- - IgorKossak   Как определён Ваш PIND?   Sep 28 2010, 16:20
|- - Dx!   Цитата(IgorKossak @ Sep 28 2010, 20:20) К...   Sep 28 2010, 18:10
|- - rezident   Цитата(Dx! @ Sep 29 2010, 00:10) И чт...   Sep 28 2010, 18:54
- - 777777   Цитата(Dx! @ Sep 28 2010, 20:15) PIND...   Sep 28 2010, 16:53
- - IgorKossak   Под ???? подразумевались недостающие четыре бита?   Sep 28 2010, 17:35
- - rezident   Нормальные компиляторы на такой оператор выдают пр...   Sep 28 2010, 17:35
- - Petka   Цитата(Dx! @ Sep 28 2010, 20:15) Комп...   Sep 28 2010, 19:04
|- - IgorKossak   Цитата(Petka @ Sep 28 2010, 22:04) Если э...   Sep 28 2010, 19:15
|- - Petka   Цитата(IgorKossak @ Sep 28 2010, 23:15) В...   Sep 28 2010, 19:18
|- - Petka   Цитата(Petka @ Sep 28 2010, 23:18) Код#de...   Sep 28 2010, 19:24
- - Dx!   Да, всё так, большое спасибо. Теперь всё встало на...   Sep 28 2010, 19:21
- - Dx!   Просто мы же в разделе AVR, мне казалось что особо...   Sep 28 2010, 19:32
|- - Petka   Цитата(Dx! @ Sep 28 2010, 23:32) Прос...   Sep 28 2010, 19:33
- - IgorKossak   Не прошло и полгода! И хоть после драки кулака...   Sep 28 2010, 19:42
- - Dx!   Неужели в IAR или кейле этот (или любой другой ста...   Sep 28 2010, 20:01
- - _Pasha   Люди! Радуйтесь, что сдвиг вправо знакового чи...   Sep 28 2010, 20:14
|- - Сергей Борщ   Цитата(_Pasha @ Sep 28 2010, 23:14) Люди...   Sep 28 2010, 22:31
|- - Petka   Цитата(Сергей Борщ @ Sep 29 2010, 02:31) ...   Sep 29 2010, 04:50
|- - rezident   Цитата(Petka @ Sep 30 2010, 18:24) Не быв...   Sep 30 2010, 13:13
|- - Petka   Цитата(777777 @ Sep 30 2010, 19:51) Но в ...   Sep 30 2010, 16:00
||- - 777777   Цитата(Petka @ Sep 30 2010, 20:00) int мо...   Sep 30 2010, 16:58
||- - Petka   Цитата(777777 @ Sep 30 2010, 20:58) И что...   Sep 30 2010, 18:30
|- - _Pasha   Цитата(777777 @ Oct 1 2010, 08:01) Просто...   Oct 1 2010, 06:28
- - Dx!   КодPORTB = (PIND^0xFF) >> 4; 80...   Sep 30 2010, 11:02
- - IgorKossak   Всё это очень интересно, но обсуждалось уже многок...   Oct 1 2010, 07:05


Closed TopicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


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


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