|
Последовательность действий - побитовая инверсия и сдвиг, (~PIND) >> 4 == ~(PIND >> 4) ??? |
|
|
|
 |
Ответов
|
Sep 30 2010, 09:05
|
Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
Sep 30 2010, 12:24
|
Профессионал
    
Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886

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

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

|
Цитата(Petka @ Sep 30 2010, 16:24)  Не бывает тупого следования стандарту.
Бывает либо соответствие стандарту, либо несоответствие стандарту. Если компилятор не соответствует стандарту, то одинаковый код на разных платформах будет давать разный результат. Все верно. Но бывают случаи, когда несоответствие стандарту дает лучшие результаты, чем соответствие. В частности, стандарт требует при выполнении операций приводить операнды к типу int. Может это и хорошо когда размер int соответствует естественному размеру переменной на данной платформе. Но в 8-разрядных процессорах это не так - int не может быть 8-битным, а выполнение операций в 16-разрядных переменных приводит к неэффективности кода. Другой пример - различные адресные пространства. Стандарт предназначен для машин фон-неймановской архитертуры и ничего не хочет знать о том, что указатель может указывать как на пространство кода, так и на пространство данных. А в кейле можно объявить указатель на нужное нам пространство и просто разыменовывать его *p безо всяких уродских pgm_read_byte и компилятор генерирует нужный код в зависимости от типа указателя.
|
|
|
|
|
Sep 30 2010, 16:00
|
Профессионал
    
Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886

|
Цитата(777777 @ Sep 30 2010, 19:51)  Но в 8-разрядных процессорах это не так - int не может быть 8-битным, а выполнение операций в 16-разрядных переменных приводит к неэффективности кода. int может быть 8ми битным, для этого надо указать gcc правильный ключик. Цитата Другой пример - различные адресные пространства. Стандарт предназначен для машин фон-неймановской архитертуры и ничего не хочет знать о том, что указатель может указывать как на пространство кода, так и на пространство данных. А в кейле можно объявить указатель на нужное нам пространство и просто разыменовывать его *p безо всяких уродских pgm_read_byte и компилятор генерирует нужный код в зависимости от типа указателя. Это ещё одна причина использовать архитектуры где флэш и оперативная память адресуются одинаково без ущерба для производительности (ARM, например).
|
|
|
|
|
Sep 30 2010, 16:58
|

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

|
Цитата(Petka @ Sep 30 2010, 20:00)  int может быть 8ми битным, для этого надо указать gcc правильный ключик. И что, от этого компиоятор будет генерировать вычисление выражений по-другому? Будет приводить к 8-битному int? Цитата(Petka @ Sep 30 2010, 20:00)  Это ещё одна причина использовать архитектуры где флэш и оперативная память адресуются одинаково без ущерба для производительности (ARM, например). Такое впечатление, что стандарт C для вас бог, а все остальное для него подстраиваться. Вообще-то первичным является железо, а все остальное делается для него (причем сначала появляются компиляторы, а потом стандарты для них). Поэтому и существуют до сих пор гарвардские процессоры, поскольку они удобнее в качестве микроконтроллеров, поэтому придумывают новые архитектуры - сигнальные процессоры, многопроцессорные системы. И если для кого-то из них не хватает возможностей языка - значит его надо расширять или менять.
Сообщение отредактировал 777777 - Sep 30 2010, 17:00
|
|
|
|
Сообщений в этой теме
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       Сергей Борщ Цитата(777777 @ Sep 30 2010, 18:51) Все в... Sep 30 2010, 20:19        777777 Цитата(Сергей Борщ @ Oct 1 2010, 00:19) (... Oct 1 2010, 05:01         xelax Цитата(777777 @ Oct 1 2010, 09:01) Какая ... Oct 1 2010, 06:03         _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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|