Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Программная реализация 64битных типов
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
MKdemiurg
Может кто видал такую?
Перевод в строку в виде десятичного числа.
А то в CVAVR нет 64 битной реализации. Понятно конечно, что извращение и среда отстой. Не суть...
У меня сопряжение с устройством которое выдаёт 8 байт long long - и что с ним делать, если надо вывести наружу sm.gif biggrin.gif

Время обработки не лимитировано...Между запросами по 2-3 секунды ожидания.
mempfis_
Цитата(MKdemiurg @ Feb 5 2014, 20:31) *
Может кто видал такую?
Перевод в строку в виде десятичного числа 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
Так в том и проблема, что в CVAVR нет long long int и double в принципе. Не реализовано.

00 00 00 10 00 00 00 00 - во как такой набор байт в формате long long представить в десятичной строке?
mempfis_
Цитата(MKdemiurg @ Feb 5 2014, 21:21) *
Так в том и проблема, что в CVAVR нет long long int и double в принципе. Не реализовано.

00 00 00 10 00 00 00 00 - во как такой набор байт в формате long long представить в десятичной строке?


Передать можно через указатель.
И наверное придётся написать процедуру вычитания long long int - long long int на ассемблере чтобы на основе её написать процедуру деления с сохранением целой части и остатка. А остальное дело техники. Я думаю в сети можно найти такие процедуры.
Ну или как вариант перейти на IAR/GCC.
MKdemiurg
Цитата(mempfis_ @ Feb 5 2014, 22:20) *
Передать можно через указатель.
И наверное придётся написать процедуру вычитания long long int - long long int на ассемблере чтобы на основе её написать процедуру деления с сохранением целой части и остатка. А остальное дело техники. Я думаю в сети можно найти такие процедуры.

Ну или как вариант перейти на IAR/GCC.


Вот о том и речь. Ищу реализацию для AVR.

Давно перешёл. А это "детские проекты", которые надо поддерживать.
--
В принципе long long int - long long int можно сделать и на С sm.gif
mempfis_
Задача у Вас интересная.
Может тут найдёте шаблон http://we.easyelectronics.ru/AVR/matematik...lere-v-avr.html
например процедура hex40_bcd13.asm

Никогда такого не делал но что если написать такую процедуру на С в другом компиляторе, отключить библиотеки и посмотреть на ассемблерную реализацию в листинге программы?
_Ivana
Ниже кусок моей второй в жизни программы на ассемблере, для АВР тини 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
;--------------------------------------------------------------------
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.