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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Несимметрия конечного результата vinavr компилятора
=GM=
сообщение Nov 16 2012, 21:46
Сообщение #1


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Всем привет.
Такой вопрос. Почему код
Код
  while(pph!=&ph[8])
  {
   *(pph++)=~(*(pph-4));
  },

в котором берётся часть массива, инвертируется и записывается в другое место, компилируется в такой несимметричный код?
Код
  while(pph!=&ph[8])
  {
   *(pph++)=~(*(pph-4));
  94:    fd 01           movw    r30, r26
  96:    34 97           sbiw    r30, 0x04; 4
  98:    80 81           ld    r24, Z
  9a:    80 95           com    r24
  9c:    8c 93           st    X, r24
  9e:    80 91 71 00     lds    r24, 0x0071
  a2:    80 95           com    r24
  a4:    11 96           adiw    r26, 0x01; 1
  a6:    8c 93           st    X, r24
  a8:    11 97           sbiw    r26, 0x01; 1
  aa:    90 91 72 00     lds    r25, 0x0072
  ae:    89 2f           mov    r24, r25
  b0:    80 95           com    r24
  b2:    12 96           adiw    r26, 0x02; 2
  b4:    8c 93           st    X, r24
  b6:    12 97           sbiw    r26, 0x02; 2
  b8:    80 91 73 00     lds    r24, 0x0073
  bc:    80 95           com    r24
  be:    13 96           adiw    r26, 0x03; 3
  c0:    8c 93           st    X, r24
  }

Казалось бы чего проще, для всех 4-х байт сделать одно и тоже действие: загрузить байт
в регистр, а лучше бы воспользоваться регистровой парой Z, инвертировать и записать в
новое место, указываемое парой Х. Дальше, почему бы не использовать постинкремент Х+
вместо двух команд adiw и st? Может, кто-то знает, как переделать си-код в нечто подобное?


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Nov 16 2012, 23:19
Сообщение #2


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

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



-Os, gcc 4.7.2
Код
000066a2 <testfn>:
    66a2:       e2 e9           ldi     r30, 0x92    ; 146
    66a4:       f3 e0           ldi     r31, 0x03    ; 3
    66a6:       df 01           movw    r26, r30
    66a8:       14 97           sbiw    r26, 0x04    ; 4
    66aa:       8c 91           ld      r24, X
    66ac:       80 95           com     r24
    66ae:       81 93           st      Z+, r24
    66b0:       83 e0           ldi     r24, 0x03    ; 3
    66b2:       ea 39           cpi     r30, 0x9A    ; 154
    66b4:       f8 07           cpc     r31, r24
    66b6:       b9 f7           brne    .-18         ; 0x66a6 <testfn+0x4>
    66b8:       08 95           ret


Код
static unsigned char ph [8];
void
__attribute__ ((used))
testfn(void)
{
unsigned char * pph = ph;
  while(pph!=&ph[8])
  {
   *(pph++)=~(*(pph-4));
  };
}


Цитата
vinavr компилятора

Отвечая на Ваш вопрос... Меня давно удивляла неоптимальность применявшихся конструкций в winavr. В этом году, к счастью, появились компиляторы из более новых версий gcc. winavr (проект с таким именем на соурсфоргеекс) последний рз обновлялся тогда, когда такие оптимизайии для avr не делались - потому для вашей задачи как переделать си-код в нечто подобное используйте компилятор поновее.

Сообщение отредактировал Genadi Zawidowski - Nov 16 2012, 23:26
Go to the top of the page
 
+Quote Post
zombi
сообщение Nov 16 2012, 23:44
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Писать на CИ и надеятся что какие то "дяди" должны за Вас выполнить оптимизацию??? наивно!!!
Пишу на асме всегда сам всё оптимизирую и всегда знаю что и за какое время выполняется.

Цитата(=GM= @ Nov 17 2012, 00:46) *
Может, кто-то знает, как переделать си-код в нечто подобное?

biggrin.gif На ассемблере писать!
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Nov 17 2012, 06:14
Сообщение #4


;
******

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



Текст, взятый у Геннадия, дает
CODE
static unsigned char ph [8];
void
__attribute__ ((used))
testfn(void)
{
7e: ec e5 ldi r30, 0x5C; 92
80: f0 e0 ldi r31, 0x00; 0
unsigned char * pph = ph;
while(pph!=&ph[8])
{
*(pph++)=~(*(pph-4));
82: 81 91 ld r24, Z+
84: 80 95 com r24
86: 83 83 std Z+3, r24; 0x03
void
__attribute__ ((used))
testfn(void)
{
unsigned char * pph = ph;
while(pph!=&ph[8])
88: 80 e0 ldi r24, 0x00; 0
8a: e4 36 cpi r30, 0x64; 100
8c: f8 07 cpc r31, r24
8e: c9 f7 brne .-14 ; 0x82 <testfn+0x4>
{
*(pph++)=~(*(pph-4));
};
}
90: 08 95 ret

-Os
avr-gcc 4.5.3 линух

Сообщение отредактировал _Pasha - Nov 17 2012, 06:15
Go to the top of the page
 
+Quote Post
С_Ч
сообщение Nov 17 2012, 06:57
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 22-10-12
Из: г. Москва
Пользователь №: 74 038



Цитата(zombi @ Nov 17 2012, 02:44) *
Писать на CИ и надеятся что какие то "дяди" должны за Вас выполнить оптимизацию??? наивно!!!
Пишу на асме всегда сам всё оптимизирую и всегда знаю что и за какое время выполняется.


biggrin.gif На ассемблере писать!

Золотые слова!
Go to the top of the page
 
+Quote Post
=GM=
сообщение Nov 17 2012, 07:30
Сообщение #6


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Да, слова золотые, целиком и полностью поддерживаю. Только они никак не отвечают на мой вопрос.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Nov 17 2012, 07:57
Сообщение #7


;
******

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



Возьмите Клёновскую сборку, не обязательно крайнюю. Все-таки уже почти два года сабжу...
UPD: даже не два, а три года!

Сообщение отредактировал _Pasha - Nov 17 2012, 09:49
Go to the top of the page
 
+Quote Post
ReAl
сообщение Nov 17 2012, 09:02
Сообщение #8


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(_Pasha @ Nov 17 2012, 09:57) *
Возьмите Клёновскую сборку, не обязательно крайнюю. Все-таки уже почти два года сабжу...
Или её, или, для win32, отсюда

Тот же тест, что выше.
Ubuntu 10.04, avr-gcc v 4.3.4 (т.е. тоже не слишком новая версия) -- код как у 4.5.3 выше.
avr-gcc -Os -S -mmcu=atmega8 testfn.c
Код
testfn:
    ldi r30,lo8(ph-4)
    ldi r31,hi8(ph-4)
    rjmp .L2
.L3:
    ld r24,Z
    com r24
    std Z+4,r24
    adiw r30,1
.L2:
    ldi r24,hi8(ph+4)
    cpi r30,lo8(ph+4)
    cpc r31,r24
    brne .L3
    ret

В той же убунте 4.7.0 (Klen-20110813) и 4.7.1 код как у Геннадия выше.

-O2 не отличается от -Os для всех вариантов.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
polyname
сообщение Nov 17 2012, 12:31
Сообщение #9


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

Группа: Участник
Сообщений: 147
Регистрация: 18-05-12
Пользователь №: 71 915



Цитата
На ассемблере писать!
не, лучше прямо в бинарник
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Nov 17 2012, 12:47
Сообщение #10


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(ReAl @ Nov 17 2012, 13:02) *
Или её, или, для win32, отсюда
+1 Использую avr-gcc-4.7.2. Очень доволен. Есть масса вкусностей: LTO, uint24, __flash и много-много другого...
тыц
тыц2
тыц3


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Nov 17 2012, 12:51
Сообщение #11


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

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Код
*(pph++)=~(*(pph-4));
  94:    fd 01           movw    r30, r26
  96:    34 97           sbiw    r30, 0x04; 4
  98:    80 81           ld    r24, Z
  9a:    80 95           com    r24
  9c:    8c 93           st    X, r24
  9e:    80 91 71 00     lds    r24, 0x0071
  a2:    80 95           com    r24
  a4:    11 96           adiw    r26, 0x01; 1
  a6:    8c 93           st    X, r24
  a8:    11 97           sbiw    r26, 0x01; 1
  aa:    90 91 72 00     lds  .....

Взять всю эту бурду выкинуть , написать на asm и вставить на место . А компилировать hex уже из asm


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
С_Ч
сообщение Nov 17 2012, 13:27
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 22-10-12
Из: г. Москва
Пользователь №: 74 038



Цитата(polyname @ Nov 17 2012, 15:31) *
не, лучше прямо в бинарник

А чем лучше? А то я чего-то отстал от жизни.
Для топикстартера. Вы же сами описали алгоритм. вот и напишите его на ассемблере и сделайте втавку. А если у вас не критично время выполнения, так и пусть процессор петляет. Вы думаете это единственное такое место? Не надо заглядывать в коды, работает и ладно. biggrin.gif
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Nov 17 2012, 14:11
Сообщение #13


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

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата
А то я чего-то отстал от жизни.
нет , просто человек не любит asm


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
=GM=
сообщение Nov 17 2012, 15:28
Сообщение #14


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Это я всё могу сделать на асме и сделаю, здесь проблем нет, хотя инлайновый асм в винавре это нечто. Приведенный в первом посте код - это часть прерывания, которая формирует фазы ЖКИ. Скорости там небольшие, но хотелось бы, чтобы все фазы были симметричны по длительности исполнения, иначе возникнет постоянный микроток через ЖК, который в итоге приведёт к разрушению ЖК. Опять же, 3-4 года назад мне здесь же на форуме все уши прожужжали, как хорошо писать на си, я проникся, стал писать, вот результат. Теперь опять призывают писать на асме. Ну, надо быть последовательными, граждане-братцы...


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Nov 17 2012, 15:43
Сообщение #15


;
******

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



Цитата(=GM= @ Nov 17 2012, 18:28) *
Ну, надо быть последовательными, граждане-братцы...

А Вы не слушайте кого ни попадя! sm.gif
Go to the top of the page
 
+Quote Post

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

 


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


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