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

 
 
> Сопоставление проектов С и АСМ, Немного цифр
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 20 2008, 08:15
Сообщение #2


;
******

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



Теперь немного о другом. Рискую утомить читателя, поэтому-кратко.
0. Код под Winavr

1. В EEPROM имеется несколько наборов параметров, активный набор обозначен селектором:

Код
uint8_t EEMEM Selector=0x00;

#define Max_Applicable_Paramsets 4
typedef struct {
    uint16_t Cap_Chg_Time;         // ==0 then continuous mode
    uint16_t Cap_Charge_Volt;     // chg to volt
    uint16_t Cap_Discharge_Volt;     // disch downto this value (volts)
    uint16_t Operating_Current;    // ==0 then voltage mode
    uint8_t     Amplitude;        // used for voltage mode boost
    uint16_t PWMfreq;
    uint16_t Expose_Time;        // in 10ms step
    uint8_t  Rly_Mode;        // ==0 none rly is turned on at selection

    } App_Param_Record;
// eeprom implementation
App_Param_Record EEMEM Parameter_set[Max_Applicable_Paramsets] =
{{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0}};


2. В памяти программ есть дескрипторы этих параметров, но только для активной страницы

Код
//дескриптор параметра
typedef struct {
                      uint8_t xcmd; // параметр соответствует некоторой команде, получаемой извне
                      void *ojaddr; // адрес параметра
                      uint8_t ojsize;// размер данных+ здесь же добавил опции размещения (см ниже) этих данных
                     } Cm_Xref_;

typedef Cm_Xref_ PROGMEM Cm_Xref_t; // объявили
// опции размещения данных
#define Fitter_mask 0xC0
// размещено во флеше (т.е. данные будут только для чтения)
#define Flash_Fit 0x80
// размещено ЕЕ
#define EE_Fit 0xC0
// размещено в ОЗУ и только для чтения
#define Sram_Fit_RO 0x40  //fitted in sram and read only

// Размещено в буфере типа  App_Param_Record, в который будет копироваться страница параметров
#define Relative_Fit 0x00 // relative to struct

// Команды на чтение 0x00..0x7F на запись 0x80..0xFF
#define Inhibit_read_write_mask 0x7F

//собсно описания

static App_Param_Record Edited_Record; // sram shadow

#define Rel_Param(member) &Edited_Record.member,Relative_Fit+sizeof(Edited_Record.member)

static Cm_Xref_t Cm_Xref[Max_cmd+1]=
{
    {cm_Brief,0,0}, // version crc
    {cm_NetLocate,&Net_ID,EE_Fit+1},
    {cm_Set_Selector,&Selector,EE_Fit+1},
    {cm_Charge_Time,Rel_Param(Cap_Chg_Time)},
    {cm_Charge_Volt,Rel_Param(Cap_Charge_Volt)},
    {cm_Discharge_Volt,Rel_Param(Cap_Discharge_Volt)},
    {cm_Operating_Current,Rel_Param(Operating_Current)},
    {cm_Amplitude,Rel_Param(Amplitude) },
    {cm_Expose_Time,Rel_Param(Expose_Time)},
    {cm_Rly_Mode,Rel_Param(Rly_Mode)}
};


Сложняк ?
Да. Для описания параметров из активной страницы пришлось принять, что эту страницу мы будем копировать в буфер. По-другому никак. Потому что, иначе мы разрушаем переносимость программы.

3. Проглотил я, короче, эти сложности - в конце концов памяти программ я пока не потерял.
В общем, дело доходит до реализации. Обрезал я поиск команды. Оставил обращение типа Cm_Xref[command].
Привожу процедуру без купюр и особых комментов. Все названия сторонних функций - сами за себя говорят.

Код
void Track_Pult(void)
{
uint8_t buffer[8],Rsz,*addr,k;
Packet_Layout *pack;
Cm_Xref_ xref,*xr;

    Rsz = RS485_pack_ready();
    if (!Rsz) return;
    // <datasize> <receiver> <sender> <command> <data> <crc>
    pack = &RS_buff;

        if((pack->receiver) != Get_Net_ID()) goto Catch;

    // else -continue parsing received pack
    Sender_Addr = pack->sender;// store sender
    Rsz -= 5;


           k = pack->command & Inhibit_read_write_mask;

    if (k == cm_Remote_Start){
      Set_Start_Status();
      Send_error(er_OK); // :) no errors
      goto Catch; }

    if (k == cm_Remote_Stop) {
      Set_Stop_Status();
      Send_error(er_OK);
      goto Catch; }

    if (k >= Max_cmd) {Send_error(er_Unknown_cmd);goto Catch;}

        xr = memcpy_P(&xref,&(Cm_Xref[k]),sizeof(xref));

uint8_t options,objsize;
void *compaddr;

    options = xref.ojsize;
    objsize = options & (~Fitter_mask);
    options &= Fitter_mask;
    addr = xref.ojaddr;
    k = pack->command != k;
    if (Dev_Status.IsWorking) {Send_error(er_Busy); goto Catch;}
    if (Rsz != objsize) {Send_error(er_InvParam); goto Catch;}

    switch (options){
    case Flash_Fit:
        if (k) Send_error(er_Read_Only);
        else   Send_data(er_OK,memcpy_P(&buffer,addr,objsize),objsize);
        break;

    case EE_Fit:
        eeprom_read_block(&buffer,addr,objsize);
        if (k) {eeprom_write_block(addr,&(pack->data),objsize);Send_error(er_OK);}
         else Send_data(er_OK,&buffer,objsize);
        break;
    case Relative_Fit:
        compaddr = Paramset();
        eeprom_read_block(&Edited_Record,compaddr,sizeof(Edited_Record));
        if (k) {eeprom_write_block(&Edited_Record,compaddr,sizeof(Edited_Record)); Send_error(er_OK);}
            else Send_data(er_OK, addr,objsize);
        break;

        }
Catch:
    RS485_purge_received();
    return;
}


Утомил?
Могу сказать одно - на асме эта байда была бы существенно проще. Я уже не говорю про смысл записи в EEPROM значений, которые не изменились. smile.gif Если я еще чего туда наверну, мне памяти точно не хватит.
Если все-же кто-то "асилил" то, что я накрапал, подскажите, как бороться со сложняком в системе описания параметров. Через "C", ессно.
З.Ы. О цифрах забыл размер кода 364 байт. Время - пофиг. Оптимизация -Os
З.З.Ы. Подчистил грязь - исправил "caller" на "receiver"
Go to the top of the page
 
+Quote Post
defunct
сообщение Feb 20 2008, 14:51
Сообщение #3


кекс
******

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



Цитата(_Pasha @ Feb 20 2008, 10:15) *
Могу сказать одно - на асме эта байда была бы существенно проще. Я уже не говорю про смысл записи в EEPROM значений, которые не изменились. smile.gif

Стиль значит асмовый используется.. Попробуйте писАть на С, а не на asm сишными словами.
Одинаковые значения в eeprom тоже никто не заставляет писать, в функции записи байта сделать вычитку ячейки, совпадает с тем что пишем - выход.
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
- - 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
- - _Pasha   В общем, наигрался я с "С". Память закан...   Feb 22 2008, 23:10
|- - defunct   Цитата(_Pasha @ Feb 23 2008, 01:10) В общ...   Feb 22 2008, 23:37
|- - singlskv   Цитата(_Pasha @ Feb 23 2008, 02:10) В общ...   Feb 22 2008, 23:55
|- - 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
|- - defunct   Цитата(singlskv @ Feb 23 2008, 01:55) Вот...   Feb 23 2008, 00:10
|- - singlskv   Цитата(defunct @ Feb 23 2008, 03:10) А чт...   Feb 23 2008, 00:43
|- - defunct   Цитата(singlskv @ Feb 23 2008, 02:43) Как...   Feb 23 2008, 01:10
|- - singlskv   Цитата(defunct @ Feb 23 2008, 04:10) Я ко...   Feb 24 2008, 18:47
|- - SasaVitebsk   Цитата(singlskv @ Feb 24 2008, 22:47) Ска...   Feb 24 2008, 19:50
||- - singlskv   Цитата(SasaVitebsk @ Feb 24 2008, 22:50) ...   Feb 24 2008, 22:23
||- - 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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 8th August 2025 - 21:53
Рейтинг@Mail.ru


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