MKdemiurg 1 5 февраля, 2014 Опубликовано 5 февраля, 2014 · Жалоба Может кто видал такую? Перевод в строку в виде десятичного числа. А то в CVAVR нет 64 битной реализации. Понятно конечно, что извращение и среда отстой. Не суть... У меня сопряжение с устройством которое выдаёт 8 байт long long - и что с ним делать, если надо вывести наружу :) Время обработки не лимитировано...Между запросами по 2-3 секунды ожидания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mempfis_ 0 5 февраля, 2014 Опубликовано 5 февраля, 2014 · Жалоба Может кто видал такую? Перевод в строку в виде десятичного числа 8 байт long long Время обработки не лимитировано...Между запросами по 2-3 секунды ожидания. Так вроде нет ничего сложного в переводе: //--------------------------------------------------- void my_ltoa(signed long long int data, unsigned char *pRes) { unsigned char buff[22]; unsigned long long int int_path, fract_path, val; unsigned int sign_flag=0; if(data<0) { int_path = (unsigned long long int) (-data); sign_flag = 1; } else { int_path = (unsigned long long int) data; } //max длина long long int 19 символов - 9223372036854775807 for(unsigned int i=0; i<19; i++) { val=int_path; int_path = val/10; fract_path = val%10; buff[i] = fract_path+'0'; buff[i+1] = '\0'; if(int_path == 0) break; } //копируем результат наоборот val = strlen((const char*) buff); //проверяем знак флага if(sign_flag) { buff[val] = '-'; buff[val+1] = '\0'; val++; } for(unsigned int i=0, j=val-1; i<val; i++, j--) { pRes[j] = buff[i]; } pRes[val] = '\0'; } //--------------------------------------------------- Буффер под хранение результата должен быть не меньше длины max long long int. Делалась для cortex-m3 с расчётом на встроенный аппаратный делитель. Для AVR процедура будет не оптимальна из-за отсутствия в нём аппаратного делителя. P.S. Но судя по листингу long long int делить на cortex-m3 также неудобно. Для обычного long int IAR использует ассемблерную команду UDIV R0,R2,R3, а для long long int сам листинг в 5 раз больше, так ещё и библиотечная __aeabi_uldivmod вызывается. Если разработчики IAR применили там аппаратный делитель, то круто, иначе - огромная потеря производительности. На 8мибитнике дела будут обстоять ещё хуже... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MKdemiurg 1 5 февраля, 2014 Опубликовано 5 февраля, 2014 · Жалоба Так в том и проблема, что в CVAVR нет long long int и double в принципе. Не реализовано. 00 00 00 10 00 00 00 00 - во как такой набор байт в формате long long представить в десятичной строке? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mempfis_ 0 5 февраля, 2014 Опубликовано 5 февраля, 2014 · Жалоба Так в том и проблема, что в CVAVR нет long long int и double в принципе. Не реализовано. 00 00 00 10 00 00 00 00 - во как такой набор байт в формате long long представить в десятичной строке? Передать можно через указатель. И наверное придётся написать процедуру вычитания long long int - long long int на ассемблере чтобы на основе её написать процедуру деления с сохранением целой части и остатка. А остальное дело техники. Я думаю в сети можно найти такие процедуры. Ну или как вариант перейти на IAR/GCC. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MKdemiurg 1 5 февраля, 2014 Опубликовано 5 февраля, 2014 (изменено) · Жалоба Передать можно через указатель. И наверное придётся написать процедуру вычитания long long int - long long int на ассемблере чтобы на основе её написать процедуру деления с сохранением целой части и остатка. А остальное дело техники. Я думаю в сети можно найти такие процедуры. Ну или как вариант перейти на IAR/GCC. Вот о том и речь. Ищу реализацию для AVR. Давно перешёл. А это "детские проекты", которые надо поддерживать. -- В принципе long long int - long long int можно сделать и на С :) Изменено 5 февраля, 2014 пользователем MKdemiurg Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mempfis_ 0 5 февраля, 2014 Опубликовано 5 февраля, 2014 · Жалоба Задача у Вас интересная. Может тут найдёте шаблон http://we.easyelectronics.ru/AVR/matematik...lere-v-avr.html например процедура hex40_bcd13.asm Никогда такого не делал но что если написать такую процедуру на С в другом компиляторе, отключить библиотеки и посмотреть на ассемблерную реализацию в листинге программы? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Ivana 0 12 февраля, 2014 Опубликовано 12 февраля, 2014 · Жалоба Ниже кусок моей второй в жизни программы на ассемблере, для АВР тини 13, без аппаратного деления, получение и сразу отсыл по УАТу десятичных разрядов двухбайтового числа. .equ _SI_order = 10 ; для десятичной системы исчисления при выводе результатов .equ _SI_order_0 = 1 .equ _SI_order_1 = _SI_order .equ _SI_order_2 = _SI_order_1*_SI_order_1 .equ _SI_order_3 = _SI_order_2*_SI_order_1 .equ _SI_order_4 = _SI_order_3*_SI_order_1 ;;-------------------------------------------------------------------- DECIMAL_value_KOI_8: ; _r_t1_hb:_r_t1_lb - остаток от числа, _SI_order-ичный разряд которого надо получить ; _r_count_measure_time_hb:_r_count_measure_time_lb - число _SI_order в нужной степени ; результат - в _r_transmit_data (и уже +$30 к цифре для получения её кода KOI-8) clr _r_transmit_data DECIMAL_value_KOI_8_1: cp _r_t1_lb, _r_count_measure_time_lb cpc _r_t1_hb, _r_count_measure_time_hb brlo DECIMAL_value_KOI_8_END sub _r_t1_lb, _r_count_measure_time_lb sbc _r_t1_hb, _r_count_measure_time_hb inc _r_transmit_data rjmp DECIMAL_value_KOI_8_1 DECIMAL_value_KOI_8_END: ldi _r_mom, $30 ; сдвиг для кода KOI-8 цифры add _r_transmit_data, _r_mom ret ;-------------------------------------------------------------------- VALUE_transmit_RS232: ;_r_t1_hb:_r_t1_lb - на комп по RS232 в десятичной системе с запятой ;_r_count_measure_time_hb:_r_count_measure_time_lb - _SI_order ;_r_transmit_data - который потом шлем на комп по RS232 ldi _r_count_measure_time_lb, low(_SI_order_4) ldi _r_count_measure_time_hb, high(_SI_order_4) rcall DECIMAL_value_KOI_8 rcall DATA_transmit_RS232 ldi _r_count_measure_time_lb, low(_SI_order_3) ldi _r_count_measure_time_hb, high(_SI_order_3) rcall DECIMAL_value_KOI_8 rcall DATA_transmit_RS232 ldi _r_count_measure_time_lb, low(_SI_order_2) ldi _r_count_measure_time_hb, high(_SI_order_2) rcall DECIMAL_value_KOI_8 rcall DATA_transmit_RS232 ; запятая ldi _r_transmit_data, KOI_8_comma rcall DATA_transmit_RS232 ldi _r_count_measure_time_lb, low(_SI_order_1) ldi _r_count_measure_time_hb, high(_SI_order_1) rcall DECIMAL_value_KOI_8 rcall DATA_transmit_RS232 ldi _r_count_measure_time_lb, low(_SI_order_0) ldi _r_count_measure_time_hb, high(_SI_order_0) rcall DECIMAL_value_KOI_8 rcall DATA_transmit_RS232 ret ;-------------------------------------------------------------------- Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться