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

 
 
5 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Сопоставление проектов С и АСМ, Немного цифр
SasaVitebsk
сообщение Feb 17 2008, 20:18
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Написал сначала проект на ASM в AVR Studio, а позже очень похожий на Си. И там и там вылизывал по скорости. Точнее особо не вылизывал. В обоих случаях камни с большим запасом. Естественно во втором проекте было всё намного грамотнее построено. Вопервых дробление шагов на основе ШИМ с большим коэффициентом, во вторых более красивое движение стрелок обеспечено. 18 скоростей с плавным переключением. Фильтрация более красивая. Обработка CAN некоторое место занимает. Тем не менее сравнивать можно

Результаты достаточно любопытны для неопределившихся. Попробовал свести в небольшую таблицу. smile.gif

Код
Камень       ! atmega8 ! at90can128 !
язык         !   asm   !    IAR C   !
-------------+---------+------------+
Число ШД     !    6    !     6      !
управл.      ! дрб 6   ! ШИМ дрб 16 !
Вх аналоговые!    6    !     3      !
Вх частотные !    0    !     1      !
Вх CAN       !    0    !     2      !
Цифр. флтр   !    +    ! + более слж!
Плавность    !    -    ! спец алг   !
Авар         !    +    !+ более слж !
-------------+---------+------------+
Размер кода  !  5019   !   6901     !
без доп табл !   -     !    672     !
Итого        !  5019   !   6229     !
Итого %      !   81    !    100     !
RAM          !  241    !    415     !
Итого %      !   58    !    100     !
-------------------------------------

Несколько попозже буду перетаскивать Этот проект на м8. То есть можно будет сопоставить практически 1 к 1 (с учётом значительных улучшений).
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 18 2008, 07:58
Сообщение #2


;
******

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



Для меня лично есть одно НО:
вот я использую мультипоточное программирование на асме, стек-фреймы и прочее - так проще и читабельнее выглядят программы. Диспетчеризация кооперативная. При переходе от потока к потоку в свопинге участвуют только содержимое PC и SP. Все крутится на минимальном наборе регистров, потому что большая их часть задействована в прерываниях, в которых тоже свопинга мало. И под такую Homebrew - ось я заточить "С" не смогу никак.
Вот вчера запустил ногодрыгалку на меге 640 по теме, которой я к Вам в личку напрашивался.
Из 15 возможных ШИМ используются все с частотой до 10кГц.
Из 16 АЦП используются все.
+ Дисплей 7 сегментный + клава + 2 модбаса + 1 RS232.
И рад бы я это на "С" написать, потому как времени на это немного, но прикинул, что с учетом неперенесенных наработок и определенной критической массы Time-critical sections, да еще и трудностей с мультипотоком, писанины будет раза в 3 больше.

А тут же параллельно силовая поделка на:
пульт на меге 8 (+модбас)
контроллер: мега48+PIC18f2431 общаются по I2C (+модбас)
Здесь без "С" вообще никуда.

А по качеству кода у меня и к Winavr претензий нет. И что самое приятное - чем тупее/тривиальнее/читабельнее код, тем лучше оптимизация.
Go to the top of the page
 
+Quote Post
KRS
сообщение Feb 18 2008, 08:32
Сообщение #3


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Это все не показатель.
Если код на С заточить например под IARовский компилер и использовать его фичи:
#pragma inline=forced
__z
__z_x и т.д.
посмотреть как компилятся определенные конструкции
у меня например есть макросы работы с кольцевым буфером в 256 байт выравненым, которые компилятся в
Код
  LDS ZL, Head
  LDI ZH, HIGH(Buf)
  LD r??, Z+
  STS Head, ZL

или если несколько байт надо вытащить

  LDS ZL, Head
  LDI ZH, HIGH(Buf)
  LD r??, Z+
  LDI ZH, HIGH(Buf)
  LD r??, Z+
  STS Head, ZL


использовать временные перменные
Код
    {
         uint8_t tmp;
         if (tmp = TIFR1 & (1<<OCF1A)) {
             TIFR = tmp;
             ....
         }
    }


можно получить код не хуже чем на асме!
зато с большими функциями в которых используется много указателей и вычислений гемора не будет
(IAR прекрасно пересылает указатели movw ZL:ZH, .....)
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Feb 18 2008, 15:45
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



2 _pasha.
Да с наработками не хочется расставаться - согласен.
И, на небольшом проекте, действительно объём проги на ASMе меньше чем на Си. Особенно если писать грамотно.

Но вот такой вот пример. У меня там фильтрация цифровая есть, так вот при переходе с 8-ми битного режима АЦП на 10-ти битный изменилась:
1) Одна константа (KADMUX)
2) В двух местах заменил ADCH на ADC
3) После фильтрации сигнал поделил на 4. ((z0>>2)&0xff)

И всё!!!
Чтобы коэффициенты 16-ти битные были заменил одно объявление int8_t на int16_t.

На Си мне не приходится собираться с мыслями, чтобы решиться на координальную переделку проекта. Switec-овский алгоритм осилил за час
Go to the top of the page
 
+Quote Post
Rst7
сообщение Feb 18 2008, 16:19
Сообщение #5


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
и использовать его фичи:#pragma inline=forced__z__z_x и т.д.


На самом деле, с точки зрения написания оптимального кода, данными модификаторами мы немного регулируем распределение регистров компилятором между сохраняемыми/несохраняемыми. Конечно, в пределе, хорошо бы иметь возможность крутить этот параметр самостоятельно куда в более широких пределах. Но и так хорошо, приятная полезность.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
Qwertty
сообщение Feb 18 2008, 18:33
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Цитата(SasaVitebsk @ Feb 18 2008, 18:45) *
Switec-овский алгоритм осилил за час

Извиняюсь за оффтоп, но что такое "Switec-овский алгоритм"?
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Feb 18 2008, 20:17
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(Qwertty @ Feb 18 2008, 22:33) *
Извиняюсь за оффтоп, но что такое "Switec-овский алгоритм"?

Красивый алгоритм управления стрелками на ШД. Он обеспечивает плавность движения стрелок. Задача, на самом деле довольно сложная. Я реализовывал упрощённую модель.

Смысл в том чтобы плавно менять скорость движения стрелки в зависимости от ошибки по положению.
Go to the top of the page
 
+Quote Post
fmdost
сообщение Feb 18 2008, 23:25
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 479
Регистрация: 8-05-07
Из: г. Ставрополь. Северный Кавказ. Россия
Пользователь №: 27 606



ИМХО. Написать С код соизмеримый с асмом можно, но требует таких же трудозатрат.

А вот интеретно, использовали ли Вы такие приёмы?
Код
unsigned char a;
a = delay_key; //токмо для "оптимизации". Иар почему-то все переменные считает как volatile.
if (KEY_ON())
{
  if ( a != 255 )
    delay_key = a+1;
}
else if (a)
  delay_key = a-1
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Feb 19 2008, 06:37
Сообщение #9


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(Т.Достоевский @ Feb 19 2008, 01:25) *
...Иар почему-то все переменные считает как volatile...

В первый раз подобное слышу (обычно народ жалуется, что наоборот).
Наверное потому, что оптимизацию никогда не выключаю.
Go to the top of the page
 
+Quote Post
Igor26
сообщение Feb 19 2008, 06:45
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 521
Регистрация: 10-02-05
Пользователь №: 2 544



Цитата
Написать С код соизмеримый с асмом можно, но требует таких же трудозатрат.

...если толком не писал ни на том, ни на другом.
Go to the top of the page
 
+Quote Post
Rst7
сообщение Feb 19 2008, 06:50
Сообщение #11


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
А вот интеретно, использовали ли Вы такие приёмы?


Дык это совершенно правильный код для помогания компилятору. В общем случае структура любой функции для камня с большим количеством регистров должна стремиться к такому виду:
Код
foo()
{
regvar1=memvar1;
regvar2=memvar2;
....
regvarn=memvarn;
....
собственно вычисления
....
memvar1=regvar1;
memvar2=regvar2;
...
memvarn=regvarn;
}


Другое дело, что сам компилятор должен стремиться к этому. Но не грех и помогать ручками. Конечно, пример вырожденный, но, я думаю, мысль мою описывает правильно...


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Feb 19 2008, 06:54
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(_Pasha @ Feb 18 2008, 11:58) *
Для меня лично есть одно НО:
вот я использую мультипоточное программирование на асме, стек-фреймы и прочее - так проще и читабельнее выглядят программы. ...

А что такое стек-фреймы?
Меня первый же безусловный переход вводит в ступор, а второй - в ярость.
Это я так, нисколько не собираясь споров затевать.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 19 2008, 07:59
Сообщение #13


;
******

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



Цитата(Dog Pawlowa @ Feb 19 2008, 09:54) *
А что такое стек-фреймы?
Меня первый же безусловный переход вводит в ступор, а второй - в ярость.
Это я так, нисколько не собираясь споров затевать.

Ну, я сразу все не напишу.
Модель вкратце, остальное по уточняющим вопросам.
Код
.dseg
Entry_Point:   .byte 2
Save_SP:      .byte 2
Local_SP:      .byte 2
Local_Stack:  .byte my_Stack_Size

Var1:            .byte 1
;..............................
VarN:            .byte 2

.set Local_Var_Org = Var1


Это по данным.
Предположим, у нас уже Y адресует начало этого блока данных
Тогда пролог процедуры:
Код
ld zL,Y+
ld zh,Y+; load entry point
in r0,spl
in r1,sph
st Y+,r0; store stack pointer
st Y+,r1

ld r0,Y+
ld r1,Y+
cli
out spL,r0
out sph,r1
sei
; at this line Y points to LOCAL DATA
ijmp; resume procedure execution

Эпилог соответственно восстанавливает все обратно
Очень полезный макрос
Код
.macro leave; <new_entry_point_addr>
  ldi zL,low(@0)
  ldi zh,high(@0)
  jmp Epilogue
.endm

Итого в нашу пользу:
1. Имеем реентерабельные процедуры. Могу выложить пример, где 4 одинаковых процесса крутятся таким образом, выдают инфу каждый на свой индикатор (7-сегм), обрабатывают энкодер как орган управления (правда, плохонько, но претензий нет, я и не работаю над собой)
2. Читабельность зашкаливает
Вместо приснопамятных переменных State мы переопределяем точку входа в процедуру.
Что-нить проверили, кое-какое условие, затем просто пишем leave addr вместо rjmp
Код
Label1:
            call Test_Some_Conditions;
            breq  Label2;
            leave Label1; exits here, but next entry point will be Label1
Label2:; continue program execution


3. Если глубина локального стека позволяет, можно вызывать другие подпрограммы, и если в них использовать leave, все еще интереснее. Т.е. с точки зрения программиста нормальная логика выполнения программ не нарушается.
4. Локальные данные адресуются с помощью yL:yH, намертво закрепленных за указателем
Продолжать ?
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Feb 19 2008, 10:42
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(_Pasha @ Feb 19 2008, 11:59) *
Продолжать ?

Нет, спасибо.
Интересно, конечно, но я уже перешел на 'C' и возвращаться не имеет смысла.
Однажды видел проект (система продажи билетов на ЖД эпохи начала перестройки), в котором использование макросов и условной компиляции поражало воображение, но для этого нужна свежая молодая голова.
Too late smile.gif


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 19 2008, 10:57
Сообщение #15


;
******

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



Цитата(Dog Pawlowa @ Feb 19 2008, 13:42) *
для этого нужна свежая молодая голова.
Too late smile.gif

Извиняюсь, не могу смолчать.
1. У меня голова уже точно не молодая и не свежая - сын в институте...
2. У атмелов-то правильных макросредств только недавно появилось smile.gif

3. Немножко все-таки продолжу про минусы того,чего написал выше.
Главный минус - это как детский вопрос : "Можно ли прикрутить туда 1-wire ?" smile.gif
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 12:18
Рейтинг@Mail.ru


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