roboforum.ru

Технический форум по робототехнике.

C vs ASM -прочитай и никогда не поднимай эту тему на форуме!

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Re: C vs ASM -прочитай и никогда не поднимай эту тему на фор

Сообщение Dmitry__ » 19 дек 2011, 10:06

=DeaD=, абсолютно правильно. А в твоих задачах, тебя спасут ЭРтОСЫ в ордуинах для решения проблемы: "нехватка таймеров и прерываний в них" ? :wink:

НЛО:
Смотрю на исходник моих часиков ezx430, тихо шизею. Перевод из 2-го кода в десятичный (ASCII :shock: ) сделано таблицей, причем если число < 180, а если больше, то полным перебором деления числа на 10. :ROFL:
Код: Выделить всёРазвернуть
// *************************************************************************************************
// @fn          int_to_array
// @brief       Generic integer to array routine. Converts integer n to string.
//                              Default conversion result has leading zeros, e.g. "00123"
//                              Option to convert leading '0' into whitespace (blanks)
// @param       u32 n                   integer to convert
//                              u8 digits               number of digits
//                              u8 blanks               fill up result string with number of
// whitespaces instead of leading zeros
// @return      u8                              string
// *************************************************************************************************
u8 *int_to_array(u32 n, u8 digits, u8 blanks)
{
    u8 i;
    u8 digits1 = digits;

    // Preset result string
    memcpy(int_to_array_str, "0000000", 7);

    // Return empty string if number of digits is invalid (valid range for digits: 1-7)
    if ((digits == 0) || (digits > 7))
        return (int_to_array_str);

    // Numbers 0 .. 180 can be copied from int_to_array_conversion_table without conversion
    if (n <= 180)
    {
        if (digits >= 3)
        {
            memcpy(int_to_array_str + (digits - 3), int_to_array_conversion_table[n], 3);
        }
        else                    // digits == 1 || 2
        {
            memcpy(int_to_array_str, int_to_array_conversion_table[n] + (3 - digits), digits);
        }
    }
    else                        // For n > 180 need to calculate string content
    {
        // Calculate digits from least to most significant number
        do
        {
            int_to_array_str[digits - 1] = n % 10 + '0';
            n /= 10;
        }
        while (--digits > 0);
    }

    // Remove specified number of leading '0', always keep last one
    i = 0;
    while ((int_to_array_str[i] == '0') && (i < digits1 - 1))
    {
        if (blanks > 0)
        {
            // Convert only specified number of leading '0'
            int_to_array_str[i] = ' ';
            blanks--;
        }
        i++;
    }

    return (int_to_array_str);
}

и соотв. такая табличка:
Код: Выделить всёРазвернуть
// Quick integer to array conversion table for most common integer values
const u8 int_to_array_conversion_table[][3] = {
    "000", "001", "002", "003", "004", "005", "006", "007", "008", "009", "010", "011", "012",
    "013", "014", "015",
    "016", "017", "018", "019", "020", "021", "022", "023", "024", "025", "026", "027", "028",
    "029", "030", "031",
    "032", "033", "034", "035", "036", "037", "038", "039", "040", "041", "042", "043", "044",
    "045", "046", "047",
    "048", "049", "050", "051", "052", "053", "054", "055", "056", "057", "058", "059", "060",
    "061", "062", "063",
    "064", "065", "066", "067", "068", "069", "070", "071", "072", "073", "074", "075", "076",
    "077", "078", "079",
    "080", "081", "082", "083", "084", "085", "086", "087", "088", "089", "090", "091", "092",
    "093", "094", "095",
    "096", "097", "098", "099", "100", "101", "102", "103", "104", "105", "106", "107", "108",
    "109", "110", "111",
    "112", "113", "114", "115", "116", "117", "118", "119", "120", "121", "122", "123", "124",
    "125", "126", "127",
    "128", "129", "130", "131", "132", "133", "134", "135", "136", "137", "138", "139", "140",
    "141", "142", "143",
    "144", "145", "146", "147", "148", "149", "150", "151", "152", "153", "154", "155", "156",
    "157", "158", "159",
    "160", "161", "162", "163", "164", "165", "166", "167", "168", "169", "170", "171", "172",
    "173", "174", "175",
    "176", "177", "178", "179", "180",
};


а в асм это просто сдвиг влево и команда десятичной коррекции :)
Код: Выделить всёРазвернуть
;------------------------------------------------------------------------------
BIN2BCD;     Subroutine for converting 16 bit binary to BCD
;              Input: R12 is 16 bit binary
;            Working: R15 is used and not saved
;             Output: R14|R13 5 digit BCD
;------------------------------------------------------------------------------
             mov #16,R15
             clr R14
             clr R13
L$1          rla R12
             dadd R13,R13
             dadd R14,R14
             dec R15
             jnz L$1
             ret


Чтоб спасти свои часики от быдлокода, приходится делать такую шизу (не говорите про вставить нормальный файл асм в проект...) :
Код: Выделить всёРазвернуть
// *************************************************************************************************
// @fn          int_to_array
// @brief       Generic integer to array routine. Converts integer n to string.
//                              Default conversion result has leading zeros, e.g. "00123"
//                              Option to convert leading '0' into whitespace (blanks)
// @param       u32 n                   integer to convert
//                              u8 digits               number of digits
//                              u8 blanks               fill up result string with number of
// whitespaces instead of leading zeros
// @return      u8                              string
// *************************************************************************************************
u8 *int_to_array(u32 n, u8 digits, u8 blanks)
{
    u8 i;

// Return empty string if number of digits is invalid (valid range for digits: 1-7)
    if ((digits == 0) || (digits > 7)) goto return_;

//R15 = blanks, R14 = digits, R13,R12 = n
    asm(" push    R11");
    asm(" push    R10");
    // Preset result string: int_to_array_str[0..6] = '0'
    asm(" mov.b   #0x30, r10");
    asm(" mov.b   r10,   int_to_array_str +0");
    asm(" mov.b   r10,   int_to_array_str +1");
    asm(" mov.b   r10,   int_to_array_str +2");
    asm(" mov.b   r10,   int_to_array_str +3");
    asm(" mov.b   r10,   int_to_array_str +4");
    asm(" mov.b   r10,   int_to_array_str +5");
    asm(" mov.b   r10,   int_to_array_str +6");

// Convert 16 bit binary to 20 bit packed BCD
// C prototype: unsigned long bin2pbcd(unsigned bin)
//bin2pbcd
    asm(" clr     R10       "); // Clear BCD result
    asm(" clr     R11       "); //
    asm(" swpb    R12       "); // Swap upper/lower byte
    asm(" tst.b   R12       "); // Check if upper byte is zero
    asm(" jz      L1        "); // Yes, skip upper byte
    asm(" swpb    R12       "); // Sway upper/lower bytes back
    asm(" rla     R12       "); // Test msb of binary
    asm(" dadd    R10, R10  "); // Multiply BCD by 2 and add binary bit
    asm(" rla     R12       "); // Test bit 14 of binary
    asm(" dadd    R10, R10  "); // Multiply BCD by 2 and add binary bit
    asm(" rla     R12       "); // Test bit 13 of binary
    asm(" dadd    R10, R10  "); // Multiply BCD by 2 and add binary bit
    asm(" rla     R12       "); // Test bit 12 of binary
    asm(" dadd    R10, R10  "); // Multiply BCD by 2 and add binary bit
    asm(" rla     R12       "); // Test bit 11 of binary
    asm(" dadd    R10, R10  "); // Multiply BCD by 2 and add binary bit
    asm(" rla     R12       "); // Test bit 10 of binary
    asm(" dadd    R10, R10  "); // Multiply BCD by 2 and add binary bit
    asm(" rla     R12       "); // Test bit 9 of binary
    asm(" dadd    R10, R10  "); // Multiply BCD by 2 and add binary bit
    asm(" rla     R12       "); // Test bit 8 of binary
    asm(" dadd    R10, R10  "); // Multiply BCD by 2 and add binary bit
asm("L1:");
    asm(" rla     R12       "); // Test bit 7 of binary
    asm(" dadd    R10, R10  "); // Multiply BCD by 2 and add binary bit
    asm(" rla     R12       "); // Test bit 6 of binary
    asm(" dadd    R10, R10  "); // Multiply BCD by 2 and add binary bit
    asm(" rla     R12       "); // Test bit 5 of binary
    asm(" dadd    R10, R10  "); // Multiply BCD by 2 and add binary bit
    asm(" rla     R12       "); // Test bit 4 of binary
    asm(" dadd    R10, R10  "); // Multiply BCD by 2 and add binary bit
    asm(" rla     R12       "); // Test bit 3 of binary
    asm(" dadd    R10, R10  "); // Multiply BCD by 2 and add binary bit
    asm(" rla     R12       "); // Test bit 2 of binary
    asm(" dadd    R10, R10  "); // Multiply BCD by 2 and add binary bit
    asm(" dadd    R11, R11  "); //
    asm(" rla     R12       "); // Test bit 1 of binary
    asm(" dadd    R10, R10  "); // Multiply BCD by 2 and add binary bit
    asm(" dadd    R11, R11  "); //
    asm(" rla     R12       "); // Test bit 0 of binary
    asm(" dadd    R10, R10  "); // Multiply BCD by 2 and add binary bit
    asm(" dadd    R11, R11  "); //

//i = digits    //set a pointer to a string
    asm(" mov.b   r14, r13");
    asm(" jmp     L3");
asm("L2:");
    asm(" rrc     r11");
    asm(" rrc     r10");
    asm(" rrc     r11");
    asm(" rrc     r10");
    asm(" rrc     r11");
    asm(" rrc     r10");
    asm(" rrc     r11");
    asm(" rrc     r10");
asm("L3:      mov     r10,r12");      //BCD_X mask
    asm(" and     #0x000f, r12"); //
//i--;
    asm(" dec.b   r13");
//int_to_array_str[i] += BCD_X;
    asm(" add.b   r12, int_to_array_str(r13)");
//if (i == 0) end;
    asm(" tst.b   r13");
    asm(" jnz      L2");

    asm(" pop     R10");
    asm(" pop     R11");

    // Remove specified number of leading '0', always keep last one
    i = 0;
    while ((int_to_array_str[i] == '0') && (i < digits - 1))
    {
        if (blanks > 0)
        {
            // Convert only specified number of leading '0'
            int_to_array_str[i] = ' ';
            blanks--;
        }
        i++;
    }
return_:
    return (int_to_array_str);
}

А мы помним, что в часах все поставлено на энергопотребление :wink:
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: C vs ASM -прочитай и никогда не поднимай эту тему на фор

Сообщение =DeaD= » 19 дек 2011, 10:11

Dmitry__, у меня атипичные задачи :) ибо всё не жутко критичное по времени у нас вынесено на ПК
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

Re: C vs ASM -прочитай и никогда не поднимай эту тему на фор

Сообщение Dmitry__ » 19 дек 2011, 10:18

это временно :) или твои устройства всегда будут привязаны к ПК :)
а по примеру моего кода C vs ASM ?
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: C vs ASM -прочитай и никогда не поднимай эту тему на фор

Сообщение =DeaD= » 19 дек 2011, 10:23

Скажи русским языком, что функция на Си должна делать, я попробую её коротко написать.
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

Re: C vs ASM -прочитай и никогда не поднимай эту тему на фор

Сообщение Dmitry__ » 19 дек 2011, 10:25

перевести двоичное число "u32 n" в двоично-десятичный код.
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: C vs ASM -прочитай и никогда не поднимай эту тему на фор

Сообщение =DeaD= » 19 дек 2011, 10:31

Какая-то мутная задача, Си не работает с такими промежуточными типами. Тогда уж в строку переводить.
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

Re: C vs ASM -прочитай и никогда не поднимай эту тему на фор

Сообщение Dmitry__ » 19 дек 2011, 10:38

давай в строку :)
надо же как-то испражнения си выводить на семисегментный индикатор часов :)
заметь, эту задачу не я придумал...
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: C vs ASM -прочитай и никогда не поднимай эту тему на фор

Сообщение legion » 19 дек 2011, 10:47

Ааа, имелись в виду RTOS на си, догнал.
legion
 
Сообщения: 736
Зарегистрирован: 24 апр 2010, 14:47
Откуда: Уфа
прог. языки: avr asm

Re: C vs ASM -прочитай и никогда не поднимай эту тему на фор

Сообщение Angel71 » 19 дек 2011, 11:17

Dmitry__, а при реальной необходимости использовать только асм вставки, не? или кулаком по столу и "весь проект пишем на асме/си"? а пример на подобии вашего слегка опасный - можно мульён вариантов понапридумывать, когда строчка кода или небольшая программака на высокоуровневом языке на асме будет тысячи ли десятки тысяч строк занимать. это при том, что код на высокоуровневом языка может быть отлично переносим, а на асме нет. +в общем случае для всего приложения тягаться с современными оптимизаторами вручную... :) просто глупо
Последний раз редактировалось Angel71 19 дек 2011, 11:25, всего редактировалось 1 раз.
Аватара пользователя
Angel71
 
Сообщения: 10668
Зарегистрирован: 18 апр 2009, 22:18
Предупреждения: -1

Re: C vs ASM -прочитай и никогда не поднимай эту тему на фор

Сообщение Dmitry__ » 19 дек 2011, 11:53

:D
А я все думаю, как десятки строк на си в часах превратить в тыщы строк асма, чтоб часы стали нормально работать и хотелось еще туда засунуть управлялку роботом.
Из 31к быдлокода на си (из 32к возможных) осталось 20к быдлокода на си с асм вставками :)

Добавлено спустя 28 минут 22 секунды:
Re: C vs ASM -прочитай и никогда не поднимай эту тему на форуме!
Angel71 писал(а):+в общем случае для всего приложения тягаться с современными оптимизаторами вручную... просто глупо

Этот мегапупер оптимизатор не может даже увидеть аппаратный умножитель в часах :wink:
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: C vs ASM -прочитай и никогда не поднимай эту тему на фор

Сообщение Angel71 » 19 дек 2011, 11:56

:) хорошо, допустим на си этот код не влезет. мазохист будет "пару месяцев" вылизывать код проекта, чтоб впихнуть всё. другой возьмёт более подходящий камушек. да, кто-то может до посинения кричать "смотрите - они быдлокодеры, у них кода там столько-то и проц в n раз круче и они впритык влезли. а у нас как всё чудненко". :) только конечному потребитель на это мягко говоря "нас много" (в смысле рать), потому, что стоить оно будет в итоге дешевле, функционал у первой модели такой же (а поколения ктот будет клепать в разы шустрей) и получит он эту железку на пол вечности раньше.
п.с. выдалбливайте полосочки в перфокартах, если не понимаете +- постоянно усложняющихся систем.
Последний раз редактировалось Angel71 19 дек 2011, 12:02, всего редактировалось 1 раз.
Аватара пользователя
Angel71
 
Сообщения: 10668
Зарегистрирован: 18 апр 2009, 22:18
Предупреждения: -1

Re: C vs ASM -прочитай и никогда не поднимай эту тему на фор

Сообщение Dmitry__ » 19 дек 2011, 11:59

твой ответ был предсказуем :)
куда часы высылать для замены камушка?
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: C vs ASM -прочитай и никогда не поднимай эту тему на фор

Сообщение Angel71 » 19 дек 2011, 12:03

в музей глупостей и риторических вопросов
Аватара пользователя
Angel71
 
Сообщения: 10668
Зарегистрирован: 18 апр 2009, 22:18
Предупреждения: -1

Re: C vs ASM -прочитай и никогда не поднимай эту тему на фор

Сообщение Dmitry__ » 19 дек 2011, 12:44

ты там уже отметилсо :D
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: C vs ASM -прочитай и никогда не поднимай эту тему на фор

Сообщение =DeaD= » 19 дек 2011, 12:57

Модератор "=DeaD=":Таааак! Прекратить немедля флейм! :evil:
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

Пред.След.

Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9