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

 
 
> Сопоставление проектов С и АСМ, Немного цифр
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
 
Start new topic
Ответов
_Pasha
сообщение Feb 22 2008, 23:10
Сообщение #2


;
******

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



В общем, наигрался я с "С". Память заканчивается, а проект лежит. Теперь переписываю на асме. Размер кода обещает быть в 2 раза короче (к слову о больших проектах). Да и пишется все по-быстрому, если знаешь, что делаешь. После чего все эти компиляторы, расплодившиеся в последнее время у меня в компе, летят в корзину. То же самое, кстати, касается и pic18 и dspic30/33 и HCS08, коими я иногда страдаю. Компилятор-то, оказывается, в голове...
Go to the top of the page
 
+Quote Post
singlskv
сообщение Feb 22 2008, 23:55
Сообщение #3


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(_Pasha @ Feb 23 2008, 02:10) *
В общем, наигрался я с "С". Память заканчивается, а проект лежит. Теперь переписываю на асме. Размер кода обещает быть в 2 раза короче (к слову о больших проектах).

Такая разница может получиться ТОЛЬКО на вычислительных алгоритмах и в основном
в местах где при использовании С необходимо делать преобразование типов,
ну или для вариантов когда просто в С нет соответствующего размера типа,
например в С нет 3-байтовых переменных...

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


Цитата(defunct @ Feb 23 2008, 02:37) *
Совет для того чтобы память не заканчивалась в проектах на "C"
1. Делать стек большим, а глобальных переменных поменьше.
2. Использовать heap.
Вот здесь хотелось бы разъяснений и поподробнее...(без подколок...),
я не понимаю как уменьшить количество глобальных переменных.
Я не понимаю как можно использовать heap для уменьшения расхода памяти вместо
использования глобальных переменных...
Go to the top of the page
 
+Quote Post
defunct
сообщение Feb 23 2008, 00:10
Сообщение #4


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(singlskv @ Feb 23 2008, 01:55) *
Вот здесь хотелось бы разъяснений и поподробнее...(без подколок...),
я не понимаю как уменьшить количество глобальных переменных.

А что Вы храните в глобальных переменных?
Ведь кроме конфигурации там больше нечего хранить.
Под все остальное память можно выделить либо в стеке, либо в куче.

Цитата
Я не понимаю как можно использовать heap для уменьшения расхода памяти вместо
использования глобальных переменных...

это смотря под что у вас используются глобальные переменные.
Допустим имеем дело с неким протоколом где команды(пакеты) могут поступать не дожидаясь ответа на предыдущую команду(пакет). Предположим что глобально выделенно два буфера фиксированного размера (один обрабатывается, во второй принимается сл. команда). Попробуем сократить объем памяти.
Выделяем буфер из heap, ведем в него прием. По окончании приема, передаем указатель на этот буфер в функцию обработки, выделяем еще один буфер под прием сл. пакета и ведем прием дальше.
В функции обработки - перевыделяем память в соответсвии с реальным размером пакета (не всегда же пакет будет максимально возможной длины), или копируем во временный буфер в стеке, память освобождаем. Итого на лицо экономия памяти на 1 буфер в 99% времени работы нашего устройства (т.к. полных два буфера будет использоваться в очень короткий промежуток времени - только в момент между окончанием приема текущего пакета и запуском функции обработки).

Еще пример:
допустим по i2c раз в секунду надо что-то записать/прочитать.
Выделили буфер из heap - сказали i2c драйверу - читать/писать данные в него.
Все остальное время - эта память будет использоваться под что-то другое.

и так многие места где используются значительные объемы памяти можно разделять во времени с помощью heap'a - пользовать память эффективно (одну и ту же область для разных целей в разное время).
Go to the top of the page
 
+Quote Post
singlskv
сообщение Feb 23 2008, 00:43
Сообщение #5


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(defunct @ Feb 23 2008, 03:10) *
А что Вы храните в глобальных переменных?
Ведь кроме конфигурации там больше нечего хранить.
Как это нечего ?
Вот вполне реальный пример, нужно по 4 каналам АЦП делать скользящее среднее по 8 измерениям,
ИТОГО:
4 * 8 * 2(байта на измерение) = 64 байта
+ 4(канала) * 2(байта) = 8 байт для хранения суммы
+ 1 байт на хранение номера канала
+ пару байт на всякие сервисные штучки
ИТОГО: ~75 байт глобальных переменных..

Пример N2:
Есть ~250байт которые есть суть текущее состояние системы, эти параметры могут быть запрошены
в любой момент например по протоколу модбас,
допустим что модбас работает на скорости 345600, можем ли мы хранить где-нить кроме глобальных
переменных эти данные ?
Go to the top of the page
 
+Quote Post
defunct
сообщение Feb 23 2008, 01:10
Сообщение #6


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(singlskv @ Feb 23 2008, 02:43) *
Как это нечего ?
Вот вполне реальный пример, нужно по 4 каналам АЦП делать скользящее среднее по 8 измерениям,
ИТОГО:
4 * 8 * 2(байта на измерение) = 64 байта

Я конечно не знаю вашей задачи полностью и возможно у вас есть некие строгие требования к сохранению фазы сигнала поэтому нужен КИХ, а я не брезгую БИХ'ом - ибо эффективней с т.з. памяти..
У меня скользящее по восьми измерениям занимает 2* U16 данных и кот наплакал кода.
итого 4 канала - 16 байт:
код для усреднения по 8-ми точкам:

Код
pChan->vAverage = (pChan->vSum + 4) >> 3;
pChan->vSum += val - pChan->vAverage;

но я не меняя размер данных могу и по 16-ти точкам усреднять и по 32-м и по 1024.
меняться будет только формула..
Конечно, это не тот случай когда heap чем-то помог, но все же думать об экономии там где это возможно - стоит.

Цитата
Пример N2:
Есть ~250байт которые есть суть текущее состояние системы, эти параметры могут быть запрошены
в любой момент например по протоколу модбас,
допустим что модбас работает на скорости 345600, можем ли мы хранить где-нить кроме глобальных
переменных эти данные ?

Статистика / параметры системы - это есть конфигурация...
Стало быть легально делать их глобальными.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Feb 24 2008, 18:47
Сообщение #7


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(defunct @ Feb 23 2008, 04:10) *
Я конечно не знаю вашей задачи полностью и возможно у вас есть некие строгие требования к сохранению фазы сигнала поэтому нужен КИХ, а я не брезгую БИХ'ом - ибо эффективней с т.з. памяти..
У меня скользящее по восьми измерениям занимает 2* U16 данных и кот наплакал кода.
итого 4 канала - 16 байт:
код для усреднения по 8-ми точкам:
Я тоже пользуюсь разными вариантами... иногда честное скользящее среднее
иногда экспоненциальный фильтр.
Цитата
Код
pChan->vAverage = (pChan->vSum + 4) >> 3;
pChan->vSum += val - pChan->vAverage;
и так тоже пользуюсь, тока для уменьшения рассчетов, я в таких случаях считаю что,
все вычисляется с коэфициентом (8 ну или сколько мы там решили),
тогда никагого оверхеда не происходит в принципе...
Цитата
Конечно, это не тот случай когда heap чем-то помог, но все же думать об экономии там где это возможно - стоит.
Ну вот я и хочу увидеть эту экономию, и особенно в сравнении с асм,
не, я конечно понимаю что для моих задач никакой экономии просто не будет,

Скажем так, хочу увидеть задачи (все таки контроллерные... хоть чуть...)
где использование heap будет нужным/оправданным..
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Feb 24 2008, 19:50
Сообщение #8


Гуру
******

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



Цитата(singlskv @ Feb 24 2008, 22:47) *
Скажем так, хочу увидеть задачи (все таки контроллерные... хоть чуть...)
где использование heap будет нужным/оправданным..


Видете ли. Совершенно вам не в пику пишу. Это просто вопрос подходов. Вы его не приемлете (...хоть чуть..), а я считаю использование HEAP вполне оправданным.

Начнём с того, что использование HEAP на Си практически не увеличивает загрузку процессора. Поэтому вреда от этого никакого. А отсюда следует что его применение возможно везде. Теперь второе. В Си, в отличие от ASM, вы не контролируете память. Не знаю как правильнее выразится. Давайте лучше на примере.

Представьте, что вы пишите проект на ASM для которого чем больше свободной памяти - тем лучше. Вы его пишете и распределяете память вручную. Выделяете кусок в виде .byte, смотрите на стек и так далее. Задачу эту вы написали например на м64. Через некоторое время вы переползли на м640 где памяти вдвое больше. Вам придётся минимум пересчитать остаток свободной памяти и поменять одну константу. Можно так поступить и на Си. А можно использовать HEAP и тогда при переносе вам ничего менять не придётся. Не придётся ничего менять и пересчитывать также и при внесении изменений в проект . Но это пример, где можно или так или так.

Приведу пример, где я примененяю HEAP.

Представьте себе что контролер выполняет команды. Каждая команда имеет разную длину. От десятка байт до нескольких килобайт. Имеется очередь активных команд состоящая из 10 команд. Каждая команда имеет время старта и время смерти (начала и конца исполнения). То есть находящаяся в очереди команда может исполняться а может не исполняться, но после смерти удаляется из очереди и соответственно подгружается новая команда. Источник поступления команд может быть разный (причём одновременно) RS485, SD, Ethernet, Rf, EEPROM.

Здесь, на мой взгляд HEAP очень органично вписывается. Я делаю дефрагментацию (удаление дырки от выполненной команды), храню буфер активных команд (переменной длины) и буфер загружаемых команд (дабы к моменту когда понадобится новая команда - она уже находилась в контроллере - синхронизация загрузки и исполнения) тоже переменной длины. Чем более мощные команды я могу исполнять, тем больше возможности устройства. А это зависит от синхронизации загрузки и, соответственно от оптимальности распределения буферов внутри контроллера.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Feb 24 2008, 22:23
Сообщение #9


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(SasaVitebsk @ Feb 24 2008, 22:50) *
Начнём с того, что использование HEAP на Си практически не увеличивает загрузку процессора.
Поэтому вреда от этого никакого. А отсюда следует что его применение возможно везде.
Увеличивает и очень прилично...
Я как бы понимаю необходимость использования heap например при загрузке картинки или
приеме пакета неизвестной длинны через Ethernet...
но для реалтайма непонимаю...
Цитата
Теперь второе. В Си, в отличие от ASM, вы не контролируете память. Не знаю как правильнее выразится.
Как это не контролирую ? Лично я контролирую, и это не сильно отличается от асм,
ну конечно printf, итд я просто не пользуюсь.
Цитата
Представьте, что вы пишите проект на ASM для которого чем больше свободной памяти - тем лучше. Вы его пишете и распределяете память вручную. Выделяете кусок в виде .byte, смотрите на стек и так далее. Задачу эту вы написали например на м64. Через некоторое время вы переползли на м640 где памяти вдвое больше. Вам придётся минимум пересчитать остаток свободной памяти и поменять одну константу. Можно так поступить и на Си. А можно использовать HEAP и тогда при переносе вам ничего менять не придётся. Не придётся ничего менять и пересчитывать также и при внесении изменений в проект . Но это пример, где можно или так или так.
Эээ..., ну просто стараюсь писать так чтобы перенос c одного чипа на другой заключался
только в переназначении пинов контроллера, обычно получаеться, правда иногда при переходе с более "старшего" чипа на младший приходится таймеры перенастраивать...
Цитата
Приведу пример, где я примененяю HEAP.
Представьте себе что контролер выполняет команды. Каждая команда имеет разную длину. От десятка байт до нескольких килобайт. Имеется очередь активных команд состоящая из 10 команд. Каждая команда имеет время старта и время смерти (начала и конца исполнения). То есть находящаяся в очереди команда может исполняться а может не исполняться, но после смерти удаляется из очереди и соответственно подгружается новая команда. Источник поступления команд может быть разный (причём одновременно) RS485, SD, Ethernet, Rf, EEPROM
Вот и я о том же, примерно, вопрос в том где это (использование heap) применимо/эфективно,
Вот для EEPROM, ИМХО, применимо/эфективно, только это не совместимо с использованием
стандартного для IAR _flash...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- SasaVitebsk   Сопоставление проектов С и АСМ   Feb 17 2008, 20:18
- - _Pasha   Для меня лично есть одно НО: вот я использую мульт...   Feb 18 2008, 07:58
|- - Dog Pawlowa   Цитата(_Pasha @ Feb 18 2008, 11:58) Для м...   Feb 19 2008, 06:54
|- - _Pasha   Цитата(Dog Pawlowa @ Feb 19 2008, 09:54) ...   Feb 19 2008, 07:59
|- - Dog Pawlowa   Цитата(_Pasha @ Feb 19 2008, 11:59) Продо...   Feb 19 2008, 10:42
|- - _Pasha   Цитата(Dog Pawlowa @ Feb 19 2008, 13:42) ...   Feb 19 2008, 10:57
- - KRS   Это все не показатель. Если код на С заточить напр...   Feb 18 2008, 08:32
- - SasaVitebsk   2 _pasha. Да с наработками не хочется расставаться...   Feb 18 2008, 15:45
|- - Qwertty   Цитата(SasaVitebsk @ Feb 18 2008, 18:45) ...   Feb 18 2008, 18:33
|- - SasaVitebsk   Цитата(Qwertty @ Feb 18 2008, 22:33) Изви...   Feb 18 2008, 20:17
- - Rst7   Цитатаи использовать его фичи:#pragma inline=force...   Feb 18 2008, 16:19
- - Т.Достоевский   ИМХО. Написать С код соизмеримый с асмом можно, но...   Feb 18 2008, 23:25
|- - IgorKossak   Цитата(Т.Достоевский @ Feb 19 2008, 01:25...   Feb 19 2008, 06:37
|- - SasaVitebsk   Цитата(Т.Достоевский @ Feb 19 2008, 03:25...   Feb 19 2008, 11:42
|- - _Pasha   Цитата(SasaVitebsk @ Feb 19 2008, 14:42) ...   Feb 19 2008, 12:04
- - Igor26   ЦитатаНаписать С код соизмеримый с асмом можно, но...   Feb 19 2008, 06:45
- - Rst7   ЦитатаА вот интеретно, использовали ли Вы такие пр...   Feb 19 2008, 06:50
- - forever failure   Цитата(SasaVitebsk @ Feb 19 2008, 16:42) ...   Feb 19 2008, 13:13
|- - SasaVitebsk   Цитата(forever failure @ Feb 19 2008, 17...   Feb 19 2008, 17:00
- - _Pasha   Теперь немного о другом. Рискую утомить читателя, ...   Feb 20 2008, 08:15
|- - defunct   Цитата(_Pasha @ Feb 20 2008, 10:15) Могу ...   Feb 20 2008, 14:51
- - SasaVitebsk   Не могу сказать, что я точно понял смысл, но попро...   Feb 20 2008, 16:25
- - _Pasha   Цитата(defunct @ Feb 20 2008, 17:51) Стил...   Feb 20 2008, 18:49
|- - SasaVitebsk   Цитата(_Pasha @ Feb 20 2008, 22:49) Пробл...   Feb 20 2008, 21:06
- - _Pasha   Вот это совсем другое дело! Че-то WINAVR торм...   Feb 21 2008, 01:19
|- - AHTOXA   Цитата(_Pasha @ Feb 21 2008, 06:19) Вот э...   Feb 21 2008, 07:20
||- - _Pasha   Цитата(AHTOXA @ Feb 21 2008, 10:20) WINAV...   Feb 21 2008, 07:34
||- - defunct   Цитата(_Pasha @ Feb 21 2008, 09:34) Блин,...   Feb 21 2008, 11:52
||- - _Pasha   Вернемся к нашей баранине. "Не умеешь-научим,...   Feb 21 2008, 16:57
||- - singlskv   Цитата(_Pasha @ Feb 21 2008, 19:57) Кодvo...   Feb 21 2008, 17:49
||- - _Pasha   Цитата(singlskv @ Feb 21 2008, 20:49) Нес...   Feb 22 2008, 07:41
|- - ReAl   Цитата(_Pasha @ Feb 21 2008, 03:19) Вот э...   Feb 21 2008, 08:43
|- - singlskv   Цитата(ReAl @ Feb 21 2008, 11:43) Ну изви...   Feb 21 2008, 22:37
|- - Petka   Цитата(singlskv @ Feb 22 2008, 01:37) Воп...   Feb 22 2008, 07:25
|- - singlskv   Цитата(Petka @ Feb 22 2008, 10:25) Велоси...   Feb 22 2008, 09:45
- - _Pasha   Цитата(defunct @ Feb 21 2008, 14:52) стил...   Feb 21 2008, 19:09
- - Artak   Ребята, может бить мой вопрос покажетса смехотwорн...   Feb 21 2008, 23:25
|- - ReAl   Цитата(Artak @ Feb 22 2008, 01:25) На C п...   Feb 22 2008, 15:27
- - Rst7   ЦитатаА есть вообще грамотный способ решения таких...   Feb 22 2008, 06:29
|- - Artak   Цитата(Rst7 @ Feb 22 2008, 10:29) В IAR...   Feb 26 2008, 20:26
- - _Pasha   Теперь про асм. В контексте многопоточного програм...   Feb 22 2008, 10:47
|- - defunct   Цитата(_Pasha @ Feb 23 2008, 01:10) В общ...   Feb 22 2008, 23:37
|- - Alex B._   Цитата(singlskv @ Feb 23 2008, 02:55) я н...   Feb 23 2008, 00:03
||- - singlskv   Цитата(Alex B._ @ Feb 23 2008, 03:03) хм,...   Feb 23 2008, 00:08
||- - SasaVitebsk   Цитата(singlskv @ Feb 25 2008, 02:23) Уве...   Feb 25 2008, 13:23
|- - defunct   Цитата(singlskv @ Feb 24 2008, 20:47) Ска...   Feb 24 2008, 21:03
- - SasaVitebsk   А мне просто супер нравится С. По-моему, для МК эт...   Feb 23 2008, 00:58
- - SasaVitebsk   Из приведенного мной первого поста видно, что прои...   Feb 23 2008, 11:09
- - Rst7   ЦитатаpChan->vAverage = (pChan->vSum + 4) ...   Feb 23 2008, 20:18
|- - defunct   Цитата(Rst7 @ Feb 23 2008, 22:18) Мне дру...   Feb 24 2008, 04:54
- - Rst7   Все... Туплю. Уже и ответ пространный написал, хор...   Feb 24 2008, 10:40
- - Непомнящий Евгений   По-моему, с heap основная проблема в том, как расс...   Feb 26 2008, 09:29
- - singlskv   Цитата(Непомнящий Евгений @ Feb 26 2008, 12...   Feb 26 2008, 10:39
|- - SasaVitebsk   Цитата(singlskv @ Feb 26 2008, 14:39) Про...   Feb 26 2008, 11:50
- - defunct   Цитата(Непомнящий Евгений @ Feb 26 2008, 11...   Feb 26 2008, 11:21


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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 15:38
Рейтинг@Mail.ru


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