Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Уменьшить число тактов.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
muravei
Я пытался спрашивать в "начинающих", но никто мне не ответил. 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]

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

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

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

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

Да.
demiurg_spb
Можно и на си вынести за цикл инициализацию указателя.
Код
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++;)
{
   ;
}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.