Перейти к содержанию
    

Программная реализация 64битных типов

Может кто видал такую?

Перевод в строку в виде десятичного числа.

А то в CVAVR нет 64 битной реализации. Понятно конечно, что извращение и среда отстой. Не суть...

У меня сопряжение с устройством которое выдаёт 8 байт long long - и что с ним делать, если надо вывести наружу :) :biggrin:

 

Время обработки не лимитировано...Между запросами по 2-3 секунды ожидания.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может кто видал такую?

Перевод в строку в виде десятичного числа 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мибитнике дела будут обстоять ещё хуже...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так в том и проблема, что в CVAVR нет long long int и double в принципе. Не реализовано.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так в том и проблема, что в CVAVR нет long long int и double в принципе. Не реализовано.

 

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

 

Передать можно через указатель.

И наверное придётся написать процедуру вычитания long long int - long long int на ассемблере чтобы на основе её написать процедуру деления с сохранением целой части и остатка. А остальное дело техники. Я думаю в сети можно найти такие процедуры.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Передать можно через указатель.

И наверное придётся написать процедуру вычитания long long int - long long int на ассемблере чтобы на основе её написать процедуру деления с сохранением целой части и остатка. А остальное дело техники. Я думаю в сети можно найти такие процедуры.

 

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

 

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

 

Давно перешёл. А это "детские проекты", которые надо поддерживать.

--

В принципе long long int - long long int можно сделать и на С :)

Изменено пользователем MKdemiurg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Задача у Вас интересная.

Может тут найдёте шаблон http://we.easyelectronics.ru/AVR/matematik...lere-v-avr.html

например процедура hex40_bcd13.asm

 

Никогда такого не делал но что если написать такую процедуру на С в другом компиляторе, отключить библиотеки и посмотреть на ассемблерную реализацию в листинге программы?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ниже кусок моей второй в жизни программы на ассемблере, для АВР тини 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
;--------------------------------------------------------------------

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...