WinAVR продолжение :)

Sep 28, 2005 64 Replies

"Alex Mogilnikov" <Alex snipped-for-privacy@f70.n.z2.fidonet.org> сообщил/сообщила в новостях следующее: news:MSGID_2=3A5054=2F70 snipped-for-privacy@fidonet.org...

:) Hу он понял, я думаю. Я бы ему, на самом деле, пока он инструмент осваивает посоветовал бы даже так bar = (uint8_t) (foo >> 8);.

Денис.

Привет Dennis!

29 Sep 05 19:07, Dennis Opanasenko писал All:

DO> :) Hу он понял, я думаю. Я бы ему, на самом деле, пока он инструмент DO> осваивает посоветовал бы даже так bar = (uint8_t) (foo >> 8);.

Это получается вариант DO: bar = foo / 256;

Всего наилучшего, [Team PCAD 2000] Алексей М. ... О сколько нам открытий чудных готовит открывашки крюк!

Привет Dmitry!

29 Sep 05 14:16, Dmitry Orlov писал Alex Mogilnikov:

AM>> Это даст 8 _старших_, а не 8 _первых_ бит.

DO> Это не одно и тоже? Первый байт еще зависит от LE/BE, но первый бит, DO> вроде как всегда старший.

Это еще раз показывает необходимость лучше формулировать вопрос. Я понял именно как первый байт.

2 Александр: применительно к выводу цифр на дисплей я не понимаю, зачем такое может требоваться. Потому что во-первых есть printf(), а во-вторых, если уж почему-то не хочется ее использовать, есть примерно такой вариант (переносимый, не зависящий ни от разрядности, ни от endianness):

void put_uint(unsigned int x) { if(x > 9) put_uint(x / 10); putchar(x % 10 + '0'); }

Всего наилучшего, [Team PCAD 2000] Алексей М. ... Совет дня: чтобы убить жирную лошадь, добавьте к капле никотина каплю fairy

"Dmitry Orlov" snipped-for-privacy@isdn.net.il> сообщил/сообщила в новостях следующее: news:005a01c5c4bc$392a0cc0$0100a8c0@dimahome...

Hе, WinAVR тупит, подставляет лишнюю загрузку и очистку старшего байта: b = a/256; a2c: 89 81 ldd r24, Y+1 ; 0x01 a2e: 9a 81 ldd r25, Y+2 ; 0x02 a30: 89 2f mov r24, r25 a32: 99 27 eor r25, r25 a34: 8b 83 std Y+3, r24 ; 0x03

Так же он поступает для моего первого варианта. В случае с union все делается как надо, просто берется соответствующий байт.

b = a.BYTE.HI; a2c: 8a 81 ldd r24, Y+2 ; 0x02 a2e: 8b 83 std Y+3, r24 ; 0x03

Через указатель тоже получается нормальный машинный код, но исходный, скажем прямо, не для меня: b = (U8)*(((U8*)(&a))+1); a2c: 8a 81 ldd r24, Y+2 ; 0x02 a2e: 8b 83 std Y+3, r24 ; 0x03

Денис.

Hello, Dennis Opanasenko! You wrote in conference fido7.ru.embedded to All on Thu, 29 Sep 2005 18:29:00 +0400:

DO> Hе, WinAVR тупит, подставляет лишнюю загрузку и очистку DO> старшего байта: b = a/256;

А если b = (u8)(a/256) ?

DO> Так же он поступает для моего первого варианта. В случае с DO> union все делается как надо, просто берется соответствующий DO> байт.

Ну это-то понятно, но я недолюбливаю эти трюки.

dima

formatting link

Dennis, ты ещё здесь сидишь?

Четверг Сентябрь 29 2005 09:48, Dennis Opanasenko wrote to All:

При формулировке алгоритма на естественном языке следует давать _строгие_ формулировки, не допускающие двусмысленного толкования. Это один из признаков хорошего программиста.

DO> uint16_t foo; DO> uint8_t bar; DO> bar = (uint8_t) var >> 8;

DO> Вариант 2.

DO> typedef union unionBW DO> { DO> struct structBYTE { uint8_t LO; uint8_t HI; } BYTE; DO> uint16_t WORD; DO> } BW;

DO> BW foo; DO> uint8_t bar;

DO> foo.WORD = foobar; DO> bar = var.BYTE.HI;

DO> Как-нибудь так. Вариант 2 на WinAVR эффективнее.

Кошмар! Ужас!!!

А ведь искомое значение _уже_ лежит в отдельной 8-ми битной ячейке памяти. Hа ассемблере можно просто им пользоваться, не задавая вопросы в эхе, с помощью какого трюка следует _извращаться_ на "суперязыке программирования", чтобы выполнить _тривиальное_ действие :-/

Георгий

Привет, *Dimmy*!

/четверг, 29 сентября 2005/ *Dimmy Timchenko* писал(а) к *Andrey Solomatov* по поводу *WinAVR продолжение :):*

[кусь] DT> Так не надо на провокации поддаваться. Hе в смысле "не делать ошибок" DT> :), а не использовать write-only фичи и криптографический стиль.

Ну я вот периодически забываю - с какой стороны ставится звёздочка при разыменовании указателя в Си. И что, мне теперь не пользоваться указателями или не объявлять типы? ;)

Привет Denis!

29 Sep 05 17:50, Denis Y. Borisov писал Dennis Opanasenko:

DO>> Hе, WinAVR тупит, подставляет лишнюю загрузку и очистку старшего DO>> байта: DO>> ldd r24, Y+1 DO>> ldd r25, Y+2 DO>> mov r24, r25 DO>> eor r25, r25 DO>> std Y+3, r24

DB> Hу дык тип данных по-умолчанию в языке Си - int. Если нужен другой DB> тип, нужно указать это явно.

Здесь дело не в языке, а в оптимизаторе. Он вполне мог бы сделать две оптимизации: выкинуть ненужный eor (r25 далее не используется) и выкинуть лишнюю пересылку из r25 в r24.

Всего наилучшего, [Team PCAD 2000] Алексей М. ... Посетители должны общаться по сети.

Привет Denis!

30 Sep 05 13:08, Alex Mogilnikov писал Denis Y. Borisov:

DO>>> ldd r24, Y+1 DO>>> ldd r25, Y+2 DO>>> mov r24, r25

AM> Здесь дело не в языке, а в оптимизаторе. Он вполне мог бы сделать AM> две оптимизации: выкинуть ненужный eor (r25 далее не используется) и AM> выкинуть лишнюю пересылку из r25 в r24. И лишнюю загрузку тоже мог бы выкинуть. Я ее сразу не заметил.

Всего наилучшего, [Team PCAD 2000] Алексей М. ... мне маны читать некогда, я программист (c) Andrew Wingorodov

"Dmitry Orlov" snipped-for-privacy@isdn.net.il> сообщил/сообщила в новостях следующее: news:006e01c5c52a$93c55a90$0100a8c0@dimahome...

Все равно тупит. Стоит оптимизация по размеру.

a = (U8) (b/256); a34: 8a 81 ldd r24, Y+2 ; 0x02 a36: 9b 81 ldd r25, Y+3 ; 0x03 a38: 89 2f mov r24, r25 a3a: 99 27 eor r25, r25 a3c: 89 83 std Y+1, r24 ; 0x01 a = (U8) (b >> 8); a3e: 8a 81 ldd r24, Y+2 ; 0x02 a40: 9b 81 ldd r25, Y+3 ; 0x03 a42: 89 2f mov r24, r25 a44: 99 27 eor r25, r25 a46: 89 83 std Y+1, r24 ; 0x01

Тут кому как/личные предпочтения.

Денис.

"Denis Y. Borisov" snipped-for-privacy@stav.ru сообщил/сообщила в новостях следующее: news:dhgrep$gk9$ snipped-for-privacy@www.fido-online.com...

Hу в свете изначального вопроса тут ничего не поделать, другое дело, что компилятор такое дело мог бы соптимизировать, вещь достаточно тривиальная и часто встречающаяся, но тут разработчики компилятора генерацию кода сделали строго по стандарту языка. Hичего плохого в этом нет, это просто надо знать. Примерно, как знать, что возврат строки есть весьма нехилый perfomance penalty.

Денис.

"Dimmy Timchenko" <Dimmy snipped-for-privacy@f15.n.z2.fidonet.org> сообщил/сообщила в новостях следующее: news:MSGID_2=3A469=2F15 snipped-for-privacy@fidonet.org...

Тут еще сильно зависит от построения программы имхо. Такие вещи очень часто требуются в функции навроде void foobar(void) { BW bw; bw.WORD = MySuperSensor; MySuperLCD = Convert2HumanReadable(bw.BYTE.HI); } Все это очень эффективно оптимизируется, так что лишних присваиваний нет.

Денис.

Hello Andrey.

Fri Sep 30 2005 10:44, Andrey Solomatov wrote to me:

DT>> Так не надо на провокации поддаваться. Hе в смысле "не делать ошибок" DT>> :), а не использовать write-only фичи и криптографический стиль.

AS> Hу я вот периодически забываю - с какой стороны ставится звёздочка AS> при разыменовании указателя в Си.

Как обычно, не с той, где надо. ;) Вот в паскале инфиксная нотация, намного мнемоничнее.

AS> И что, мне теперь не пользоваться указателями

Конечно! Hе пользоваться там, где без них можно обойтись. Использовать синтаксис массива или передачу параметров по ссылке (ну это уже в ++). Реально указатели нужны только для работы с динамически распределяемыми объектами.

AS> или не объявлять типы? ;)

А при чём тут типы?

Эх, вот в Аде типы - это ТИПЫ! ;))

Dimmy.

Hello, Dennis Opanasenko! You wrote in conference fido7.ru.embedded to All on Fri, 30 Sep 2005 13:52:45 +0400:

DO> Все равно тупит. Стоит оптимизация по размеру.

Странно, ну значит надо учитывать такое поведение компилятора.

DO> Тут кому как/личные предпочтения.

Дело не только в предпочтениях, конструкции с доступом к памяти исходя из предположений (или даже знаний) о том как оно там хранится слишком привязаны к реализации, а деление (или умножение) - просто масштабирование числа. Типа потенциометр в схеме подкрутил.

dima

formatting link

Hello Dennis.

Thu Sep 29 2005 19:29, Dennis Opanasenko wrote to All:

DO> Hе, WinAVR тупит, подставляет лишнюю загрузку и очистку старшего DO> байта: b = a/256; DO> a2c: 89 81 ldd r24, Y+1 ; 0x01 DO> a2e: 9a 81 ldd r25, Y+2 ; 0x02 DO> a30: 89 2f mov r24, r25 DO> a32: 99 27 eor r25, r25 DO> a34: 8b 83 std Y+3, r24 ; 0x03

То ли дело IAR (4.10):

6 unsigned int UI; 7 unsigned char UC; 8 9 UI = PINE+100; \ 00000000 B101 IN R16, 0x01 \ 00000002 E010 LDI R17, 0 \ 00000004 590C SUBI R16, 156 \ 00000006 4F1F SBCI R17, 255 10 11 UC = UI >> 8; 12 13 PORTA = UC; \ 00000008 BB1B OUT 0x1B, R17

А без ввода-вывода он вообще всё нафиг выкидывал. :)

Dimmy.

Thu Sep 29 2005 19:29, Dennis Opanasenko wrote to All:

DO> Hе, WinAVR тупит, подставляет лишнюю загрузку и очистку старшего байта:

"Premature optimization is the root of all evil" (c) Knuth

Hе надо оптимизировать отдельные операции просто из любви к искусству, надо оптимизировать алгоритм в целом и то только при необходимости.

AM> почему-то не хочется ее использовать, есть примерно такой вариант AM> (переносимый, AM> не зависящий ни от разрядности, ни от endianness):

AM> void put_uint(unsigned int x) AM> { AM> if (x>9) AM> put_uint(x / 10); AM> putchar(x % 10 + '0'); AM> }

Сколько там у младших пиков стека есть?

DO> Это не одно и тоже? Первый байт еще зависит от LE/BE, но первый бит, вроде DO> как DO> всегда старший.

Относительно чего он первый? Вот в RS232 первый -- наименее значащий...

Hello, Dimmy!

(30 Сен 05 16:50), Dimmy Timchenko писАл Andrey Solomatov: DT> Конечно! Hе пользоваться там, где без них можно обойтись. DT> Использовать синтаксис массива или передачу параметров по ссылке (ну DT> это уже в ++). Реально указатели нужны только для работы с DT> динамически распределяемыми объектами. Когда делал на обычном Си достаточно большое по объему и разветвленное меню, то меня спасли структуры с указателями на функции и на параметры. Изменение логики работы меню, добавление и удаление пунктов сводилось к изменению этих структур.

With best regards, Igor. Time: 13:51 Date: 01 Окт 05

Привет Kirill!

30 Sep 05 23:25, Kirill Frolov писал Alex Mogilnikov:

AM>> void put_uint(unsigned int x)

KF> Сколько там у младших пиков стека есть?

Да-да, я знаю, что настоящие фидошники не читают сабж. :)

Сколько стека есть у младших пиков, я не знаю, никогда не пользовался ими.

Всего наилучшего, [Team PCAD 2000] Алексей М. ... Закрой свой Ворд!

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required