Немного про оптимизацию

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Немного про оптимизацию

Сообщение VladislavS »

Подсмотрел тут на досуге листинг простейшего кусочка кода - дернуть ножкой.

Код: Выделить всё

  PA1::set();
  PA1::clear();
Ядро Cortex-M4, выполнение из SRAM. Обернул двумя брикпоинтами и замерил скорость выполнения по DWT_CYCCNT.

Код: Выделить всё

// Без оптимизации Instruction Scheduling
        BKPT     #0x0
        LDR.N    R1,??DataTable1_1
        MOVS     R0,#+2         
        STR      R0,[R1, #+4]   
        STRH     R0,[R1, #+6]   
        BKPT     #0x0

Код: Выделить всё

// С оптимизацией Instruction Scheduling
        BKPT     #0x0
        MOVS     R0,#+2         
        LDR.N    R1,??DataTable1_1
        STR      R0,[R1, #+4]   
        MOVS     R2,#+2         
        STRH     R2,[R1, #+6]   
        BKPT     #0x0
Так вот, в первом случае от брика до брика 9 тактов, а во втором 7.
Реклама
jcxz
Мудрый кот
Сообщения: 1725
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: Немного про оптимизацию

Сообщение jcxz »

[uquote="VladislavS",url="/forum/viewtopic.php?p=4170280#p4170280"]Ядро Cortex-M4, выполнение из SRAM. Обернул двумя брикпоинтами и замерил скорость выполнения по DWT_CYCCNT.[/uquote]У меня часто закрадываются сомнения в адекватности показаний DWT_CYCCNT при измерении малых участков кода. Например на моём CM4F IAR мне упорно показывает длительность выполнения одной инструкции UMULL = 4 такта! Хотя вроде должно быть = 1.
Надёжней: зациклить и проверить длительность многократного выполнения. С запрещёнными прерываниями. С последующим делением и вычитанием затрат на организацию цикла.
Реклама
SII
Вымогатель припоя
Сообщения: 635
Зарегистрирован: Пт янв 30, 2009 14:50:35
Откуда: Солнечногорск

Re: Немного про оптимизацию

Сообщение SII »

[uquote="VladislavS",url="/forum/viewtopic.php?p=4170280#p4170280"]Подсмотрел тут на досуге листинг простейшего кусочка кода - дернуть ножкой.
...
Так вот, в первом случае от брика до брика 9 тактов, а во втором 7.[/uquote]

А в чём проблема? В первом случае выполнение STRH останавливается, так как буфер записи вмещает лишь одно значение, и до фактичекского завершения STR новая операция записи не может быть начата. Во втором случае между ними есть промежуток, поэтому проц не останавливается.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Немного про оптимизацию

Сообщение VladislavS »

Проблемы никакой нет. Есть вопрос какой код выполнится быстрее?
Реклама
Эиком - электронные компоненты и радиодетали
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: Немного про оптимизацию

Сообщение Dimon456 »

VladislavS, IAR запуск отладки из RAM, stm32f100rb
Что здесь не так?
СпойлерИзображение
Не хочет писать в CPAR регистр

Код: Выделить всё

DMA1_Channel4->CPAR = (uint32_t)&USART1->DR;
в

Код: Выделить всё

DMA1_Channel5->CPAR = (uint32_t)&USART1->DR;
пишет.
Ручками скопируешь из DMA1_Channel5->CPAR в DMA1_Channel4->CPAR, работает.
Реклама
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: Немного про оптимизацию

Сообщение Dimon456 »

Пока вышел из положения вот таким способом
Спойлер

Код: Выделить всё

    DMA1_Channel4->CPAR = 0;
    DMA1_Channel4->CPAR = (uint32_t)&USART1->DR; 
    DMA1_Channel4->CCR = DMA_CCR1_MINC | DMA_CCR1_DIR | DMA_CCR1_TCIE; 

    NVIC_SetPriority(DMA1_Channel4_IRQn, 0);        
    NVIC_EnableIRQ(DMA1_Channel4_IRQn);             

    DMA1_Channel5->CPAR = (uint32_t)&USART1->DR; 
    DMA1_Channel5->CCR = DMA_CCR1_MINC | DMA_CCR1_CIRC; 
Реклама
Ответить

Вернуться в «ARM»