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

 
 
> FIQ и регистры, IAR использует R0-R2
Sagittarius
сообщение Jan 27 2010, 17:42
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 207
Регистрация: 26-01-06
Из: СПб
Пользователь №: 13 659



Здравствуйте.

Подскажите по проблемке. Подключил таймер на FIQ (SAM7X, 48МГц, таймер 50кГц). смотрю листинг что выдает IAR - а он в начале сохраняет R0-R2, потом их использует и восстанавливает. А как сделать чтоб использовались R8-R14, чтоб не сохранять ничего? Оптимизацию по скорости включал, но не помогло. Между прерываниями всего 961 такт и тратить их попусту жалко.

Спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
zltigo
сообщение Jan 27 2010, 18:11
Сообщение #2


Гуру
******

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



Не вызывать подпрограммы.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Sagittarius
сообщение Jan 27 2010, 19:05
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 207
Регистрация: 26-01-06
Из: СПб
Пользователь №: 13 659



Цитата(zltigo @ Jan 27 2010, 21:11) *
Не вызывать подпрограммы.


ничего не вызывается, просто инкрементится dword и сбрасываются таймер и AIC

__fiq __arm __ramfunc void FIQTimer2Handler(void){
dword dumm;
dumm=AT91C_BASE_TC2->TC_SR;
time2++;
AT91C_BASE_AIC->AIC_EOICR=0xffffffff;
}

кусок листинга:
243 __fiq __arm __ramfunc void FIQTimer2Handler(void){
\ FIQTimer2Handler:
\ 00000000 03002DE9 PUSH {R0,R1}
244 //
245 dword dumm;
246 dumm=AT91C_BASE_TC2->TC_SR;
..........
..........
249 }
\ 0000002C 0300BDE8 POP {R0,R1}
\ 00000030 04F05EE2 SUBS PC,LR,#+4 ;; return
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 27 2010, 19:35
Сообщение #4


Гуру
******

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



Цитата(Sagittarius @ Jan 27 2010, 22:05) *
ничего...

Не верю, вот написал и откомпилировал аналогичный по функцинальности шедевр. В расходниках, два регистра из FIQ банка
Код
     14          __fiq __ramfunc __arm void FIQ_ISR_handler(void)
     15          {
     16              IO0DIR;
   \                     FIQ_ISR_handler:
   \   00000000   8E82A0E3           MOV      R8,#-536870904
   \   00000004   A08B88E3           ORR      R8,R8,#0x28000
   \   00000008   008098E5           LDR      R8,[R8, #+0]
     17              counter2++;            
   \   0000000C   18809FE5           LDR      R8,??FIQ_ISR_handler_0 ;; counter2
   \   00000010   009098E5           LDR      R9,[R8, #+0]
   \   00000014   019089E2           ADD      R9,R9,#+1
   \   00000018   009088E5           STR      R9,[R8, #+0]
     18                EXTINT = EXTINT_EINT2;            
   \   0000001C   0C809FE5           LDR      R8,??FIQ_ISR_handler_0+0x4 ;; 0xffffffffe01fc140
   \   00000020   0490A0E3           MOV      R9,#+4
   \   00000024   009088E5           STR      R9,[R8, #+0]
     19          }
   \   00000028   04F05EE2           SUBS     PC,LR,#+4       ;; return
   \                     ??FIQ_ISR_handler_0:
   \   0000002C   ........           DC32     counter2
   \   00000030   40C11FE0           DC32     0xffffffffe01fc140


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Sagittarius
сообщение Jan 27 2010, 20:49
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 207
Регистрация: 26-01-06
Из: СПб
Пользователь №: 13 659



Цитата(zltigo @ Jan 27 2010, 22:35) *
Не верю, вот написал и откомпилировал аналогичный по функцинальности шедевр. В расходниках, два регистра из FIQ банка


вера это конечно хорошо, но в данном случае не помогает :-(
оставил только инкремент, скомпилил - все равно использует общие регистры. Наверняка где то что то указать забыл компилятору, типа галочку в чекбоксе поставить или pragma какую ни будь.
Код
    243          __fiq __arm __ramfunc void FIQTimer2Handler(void){
   \                     FIQTimer2Handler:
   \   00000000   03002DE9           PUSH     {R0,R1}
    244            //
    245          //  dword dumm;
    246          //  dumm=AT91C_BASE_TC2->TC_SR;
    247            time2++;
   \   00000004   10009FE5           LDR      R0,??FIQTimer2Handler_0 ;; udp
   \   00000008   281090E5           LDR      R1,[R0, #+40]
   \   0000000C   011081E2           ADD      R1,R1,#+1
   \   00000010   281080E5           STR      R1,[R0, #+40]
    248          //  AT91C_BASE_AIC->AIC_EOICR=0xffffffff;
    249          }
   \   00000014   0300BDE8           POP      {R0,R1}
   \   00000018   04F05EE2           SUBS     PC,LR,#+4       ;; return
   \                     ??FIQTimer2Handler_0:
   \   0000001C   ........           DC32     udp
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 12:41
Рейтинг@Mail.ru


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