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

"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);.

Денис.

Reply to
Dennis Opanasenko
Loading thread data ...

Привет Dennis!

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

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

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

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

Reply to
Alex Mogilnikov

Привет 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

Reply to
Alex Mogilnikov

"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

Денис.

Reply to
Dennis Opanasenko

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

Reply to
Dmitry Orlov

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а ассемблере можно просто им пользоваться, не задавая вопросы в эхе, с помощью какого трюка следует _извращаться_ на "суперязыке программирования", чтобы выполнить _тривиальное_ действие :-/

Георгий

Reply to
George Shepelev

Привет, *Dimmy*!

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

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

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

Reply to
Andrey Solomatov

Привет 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] Алексей М. ... Посетители должны общаться по сети.

Reply to
Alex Mogilnikov

Привет 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

Reply to
Alex Mogilnikov

"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

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

Денис.

Reply to
Dennis Opanasenko

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

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

Денис.

Reply to
Dennis Opanasenko

"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); } Все это очень эффективно оптимизируется, так что лишних присваиваний нет.

Денис.

Reply to
Dennis Opanasenko

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.

Reply to
Dimmy Timchenko

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

Reply to
Dmitry Orlov

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.

Reply to
Dimmy Timchenko

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е надо оптимизировать отдельные операции просто из любви к искусству, надо оптимизировать алгоритм в целом и то только при необходимости.

Reply to
Yuriy K

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> }

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

Reply to
Kirill Frolov

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

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

Reply to
Kirill Frolov

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

Reply to
Igor Ulanov

Привет Kirill!

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

AM>> void put_uint(unsigned int x)

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

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

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

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

Reply to
Alex Mogilnikov

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.