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

 
 
> Странная оптимизация для __tiny при модели small в EW AVR 4.30
Sergey'F
сообщение Feb 8 2010, 15:27
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 351
Регистрация: 17-09-05
Из: Москва
Пользователь №: 8 660



В проекте на AVR IAR EW 4.30 столкнулся с интересным подходом к оптимизации.

Исходный код:
CODE
__tiny byte ddiv = 0;

#pragma vector=SYSTEM_TIMER_VECTOR
OS_INTERRUPT void OS_SystemTimer_ISR()
{
scmRTOS_ISRW_TYPE ISR;
ddiv=ddiv^1;
if (ddiv)
{
SystemTimerUserOverHook();
}
else
{
Kernel.SystemTimer();
}
}

Листинг:
CODE
119 ddiv=ddiv^1;
\ ??OS_SystemTimer_ISR_1:
\ 0000006E E001 LDI R16, 1
\ 00000070 .... LDI R30, ddiv
\ 00000072 E0F0 LDI R31, 0
\ 00000074 8110 LD R17, Z
\ 00000076 2710 EOR R17, R16
\ 00000078 8310 ST Z, R17
120 if (ddiv)
\ 0000007A 9100.... LDS R16, ddiv
\ 0000007E 2300 TST R16
\ 00000080 F019 BREQ ??OS_SystemTimer_ISR_2
121 {

Строки 119->0070-0074 Эти строки вызывают вопрос: Если переменная - tiny, нельзя ли как-то попроще ее загрузить в регистр?
Строка 120->007A Это еще интереснее - ddiv что, как volatile объявлена? Тогда что там у нас в R17 лежало перед этим??? Или компилятор решил продемонстрировать, что он наконец понял, что переменная на самом деле tiny???

Оптимизация на максимуме по быстродействию, но на самом деле, от уровня оптимизации полученный результат не зависит. Не подскажете, что я делаю не так, как его заставить не тратить не лишние такты и не улучшена ли компиляция таких вещей в следующих версиях IAR?

Знатокам scmRTOS просьба не ругаться. Мне так удобно разветвить и разнести во времени срабатывание диспетчера и пользовательского hook. Вопрос все равно не об этом.
Go to the top of the page
 
+Quote Post



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

 


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


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