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

 
 
 
Reply to this topicStart new topic
> Уменьшить число тактов.
muravei
сообщение Aug 19 2013, 08:25
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 538
Регистрация: 13-08-05
Пользователь №: 7 591



Я пытался спрашивать в "начинающих", но никто мне не ответил. crying.gif
Есть двухбайтовый массив во флеш:
Код
static const uint16_t tab[4096]={0,1,2...типа того

надо выбирать из него значения
Код
*pDAC    =tab[i];

без оптимизации:
Код
     LDR      r5,[pc,#24] ; @0x080003EC  Тут адрес массива во флеш
     LDRH     r5,[r5,r1,LSL #1]
     STR      r5,[r3,#0x00]

Первая команда делает указатель на начало массива, в этом месте явно лишняя(это цикл)
Если включить оптимизацию, то компилятор ее убирает из него.
Вопрос: А нельзя ли это сделать на Си в рукопашную?

И еще, что делает сдвиг влево во второй команде? Адресует полуслово?
Go to the top of the page
 
+Quote Post
scifi
сообщение Aug 19 2013, 08:41
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(muravei @ Aug 19 2013, 12:25) *
Если включить оптимизацию, то компилятор ее убирает из него.
Вопрос: А нельзя ли это сделать на Си в рукопашную?

Некоторые увлекаются рихтовкой сишного кода с целью получения выхлопа компилятора, похожего на то, что хочется. ИМХО, это глубоко ущербный подход.
Во-первых, с вероятностью 90% это преждевременная оптимизация, то есть некая бурная деятельность, которая не приносит никакой пользы вообще, и приносит вред в виде ухудшения читаемости кода. Если бы думаете, что сэкономленный байт и такт приносят пользу, то в 90% случаев вы неправы.
Во-вторых, если вам нужен машинный код конкретного вида, то используйте ассемблер - он для этого и существует.

Цитата(muravei @ Aug 19 2013, 12:25) *
И еще, что делает сдвиг влево во второй команде? Адресует полуслово?

Да.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Aug 19 2013, 08:47
Сообщение #3


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Можно и на си вынести за цикл инициализацию указателя.
Код
static const uint16_t tab[4096]={0,1,2,};

const uint16_t* src = &tab[0];

for (int i=0; i<array_size(tab); i++)
{
    *pDAC = *src++;
}


или даже так:

Код
static const uint16_t tab[4096]={0,1,2,};

for (const uint16_t* src = &tab[0]; src < &tab[array_size(tab)]; *pDAC = *src++;)
{
   ;
}


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th June 2025 - 12:26
Рейтинг@Mail.ru


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