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

 
 
> Вопрос С
badik
сообщение Jun 24 2010, 18:29
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 29-11-06
Из: Екатеринбург
Пользователь №: 22 890



Здравствуйте, Вопрос к людям хорошо знающим С.
Понадобилась функция перевода целого числа в строку. Перерыл спрвочник и help - результат 0.
Банальная проблема. Увы. Обраных функций вагон.
Go to the top of the page
 
+Quote Post
8 страниц V  « < 5 6 7 8 >  
Start new topic
Ответов (90 - 104)
zltigo
сообщение Jul 1 2010, 11:57
Сообщение #91


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (ViKo @ Jul 1 2010, 10:55) *
Только в таблице у него 8 байтов

Это дело даже не второе, а третье, ибо байты кода это еще команды которые еще исполняются, а некоторые, типа PUSH/POP нескольких регистров, еще и не за один такт.


QUOTE (ViKo @ Jul 1 2010, 10:55) *
Как сделать в Keil то же, что и в IAR?

Написать на ASM smile.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 1 2010, 12:34
Сообщение #92


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(zltigo @ Jul 1 2010, 14:57) *
Это дело даже не второе, а третье, ибо байты кода это еще команды которые еще исполняются, а некоторые, типа PUSH/POP нескольких регистров, еще и не за один такт.

Давайте проверим. Число -2147483647 (т.е. -(2^31 - 1), максимально допустимое для функции) Keil преобразовал за 207 тактов (сравнивал счетчик тактов перед вызовом itoad и после нее). Сколько у IAR?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 1 2010, 12:38
Сообщение #93


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (ViKo @ Jul 1 2010, 14:34) *
Давайте проверим.

smile.gif Думаете дополнительные команды ускорят процесс?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 1 2010, 12:52
Сообщение #94


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(zltigo @ Jul 1 2010, 15:38) *
smile.gif Думаете дополнительные команды ускорят процесс?

Хочу знать, насколько замедлят.
MOV r2,#0x20202020 выполняется за 1 такт.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 1 2010, 12:55
Сообщение #95


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (ViKo @ Jul 1 2010, 14:52) *
Хочу знать, насколько замедлят.

Посчитайте на пальцах.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 1 2010, 13:59
Сообщение #96


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(zltigo @ Jul 1 2010, 15:55) *
Посчитайте на пальцах.

На пальцах до 200? У меня столько пальцев нет smile.gif
Я лучше на бумаге smile.gif и калькуляторе.
А SDIV r0,r0,r3 выполняется за 11 тактов... upd. Не всегда! - обнаружил и 10 тактов, и 9 тактов, похоже, от чисел зависит. О! чем меньше делимое, тем меньше тактов. Видел 4 такта.
... а MLS r2,r3,r0,r2 всего за 2.

Так что на пальцах, извините, никак не посчитать.
Максимальное количество тактов для SDIV заметил 12. Где про такты написано?

2 zltigo
Ну если упорно не хотите нормальное сравнение сделать... smile.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 1 2010, 14:11
Сообщение #97


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (ViKo @ Jul 1 2010, 15:59) *
2 zltigo
Ну если упорно не хотите нормальное сравнение сделать... smile.gif

Меня интересует результат компиляции - уже четко видна и разница и порядок отличия. А заниматься попугаемерами в симуляторах и иже с ним не собираюсь. Тем более, что железо с его ограничениями отдельная песня.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jul 1 2010, 15:24
Сообщение #98


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(ViKo @ Jul 1 2010, 17:59) *
А SDIV r0,r0,r3 выполняется за 11 тактов... upd. Не всегда! - обнаружил и 10 тактов, и 9 тактов, похоже, от чисел зависит. О! чем меньше делимое, тем меньше тактов. Видел 4 такта.
...
Максимальное количество тактов для SDIV заметил 12. Где про такты написано?

Cortex-M3 Technical Reference Manual
Divide: 2-12 Cycles
DIV timings depend on dividend and divisor. DIV is interruptible (abandoned/restarted), with worst case latency of one cycle.
When dividend and divisor are similar in size, divide terminates quickly. Minimum time is for cases of divisor larger than
dividend and divisor of zero. A divisor of zero returns zero (not a fault), although a debug trap is available to catch this case.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 2 2010, 09:07
Сообщение #99


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Перепробовал все "извращения" со сравнениями и др. в надежде уменьшить количество байтов.
Кто бы мне объяснил, почему в некоторых местах команда MOV r2,... кодируется двумя байтами, а в некоторых четырьмя? И не только эта команда.
Код
;;;63       uint8_t  sign = '+';
000010  222b              MOVS     r2,#0x2b
;;;64       if (!number) return;
000012  2800              CMP      r0,#0
000014  d010              BEQ      |L1.56|
;;;65       if (number < 0) {
000016  da03              BGE      |L1.32|
;;;66         number = -number;
000018  f1c00000          RSB      r0,r0,#0
;;;67         sign = '-';
00001c  f04f022d          MOV      r2,#0x2d
                  |L1.32|
;;;68       }

Как-то связано с операторами перехода по результатам сравнения. Как будто учитывается конвейер.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 2 2010, 18:43
Сообщение #100


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Думаю, хуже не станет, если я доложу, что уменьшил количество тактов для преобразования -2147483647 в строку до 195. Жаль, что не байтов.
Код
void  itoad(int32_t number, uint8_t *string)
{
  *(uint32_t *)(string) = 0x20202020;
  *(uint32_t *)(string + 4) = 0x20202020;
  *(uint32_t *)(string + 8) = 0x00302020;
  string += 10;
  uint8_t  sign = '+';
  if (!number) return;
  if (number < 0) {
    number = -number;
    sign = '-';
  }
  do {
    *string-- = number % 10 + '0';
  } while (number /= 10);
  *string = sign;
}
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 3 2010, 01:02
Сообщение #101


кекс
******

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



Давайте может функцию настройки PLL по-оптимизируем?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 3 2010, 09:24
Сообщение #102


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(defunct @ Jul 3 2010, 04:02) *
Давайте может функцию настройки PLL по-оптимизируем?

Я пользуюсь библиотечной. Надеюсь, ее писали мастера. Да и используется функция однократно.
Принципы, как нужно писать, здесь уже оговорены.
Go to the top of the page
 
+Quote Post
_Bill
сообщение Jul 10 2010, 04:32
Сообщение #103


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(ViKo @ Jul 2 2010, 21:43) *
Думаю, хуже не станет, если я доложу, что уменьшил количество тактов для преобразования -2147483647 в строку до 195. Жаль, что не байтов.

Я думаю, вашу функцию можно еще чуть чуть уменьшить.
Код
void  itoad(int32_t number, uint8_t *string)
{
  *(uint32_t *)(string) = 0x20202020;
  *(uint32_t *)(string + 4) = 0x20202020;
  *(uint32_t *)(string + 8) = 0x00302020;
  if (!number) return;
  if (number < 0) {
    number = -number;
    *string = '-';
  }
  else
        *string = '+';
  string += 11;
  do {
    *--string = number % 10 + '0';
  } while (number /= 10);
}
Или нет?

Сообщение отредактировал rezident - Jul 10 2010, 14:34
Причина редактирования: Излишнее цитирование.
Go to the top of the page
 
+Quote Post
Wano
сообщение Jul 10 2010, 23:48
Сообщение #104


Местный
***

Группа: Свой
Сообщений: 272
Регистрация: 3-06-06
Пользователь №: 17 737



Хорошо если по правому боку ровнять:

string += 10; или =11 или =бесконечность

А если нет, что с пр́обелами? Двигать надо будет. Лучше бы сразу на миллиард, потом на сотню лимонов...

А
*(uint32_t *)(string) = 0x20202020;
работает в любом случае? Всегда начало char массива 4-aligned (если умышленно не двигать указатель)?
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jul 11 2010, 10:18
Сообщение #105


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(Wano @ Jul 11 2010, 03:48) *
А
*(uint32_t *)(string) = 0x20202020;
работает в любом случае? Всегда начало char массива 4-aligned (если умышленно не двигать указатель)?

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

Правда, это относится только к инструкциям, работающим с единичными словами - LDR, LDRH, STR, STRH.
Мультивордовые LDRD/STRD/LDM/STM и т.д. в случае невыравненного на границу 4 байт доступа всё равно приведут к исключению.
Go to the top of the page
 
+Quote Post

8 страниц V  « < 5 6 7 8 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 04:39
Рейтинг@Mail.ru


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