Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: FIQ и регистры
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Sagittarius
Здравствуйте.

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

Спасибо.
zltigo
Не вызывать подпрограммы.
Sagittarius
Цитата(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
zltigo
Цитата(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
Sagittarius
Цитата(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
zltigo
Цитата(Sagittarius @ Jan 27 2010, 23:49) *
Наверняка где то что то указать забыл компилятору, типа галочку в чекбоксе поставить или pragma какую ни будь.

IDE и соответственно галочками не пользуюсь. Никаких особых ключей компилятору не задается.
Версия компилятора-то какая?
Sagittarius
Цитата(zltigo @ Jan 28 2010, 01:26) *
IDE и соответственно галочками не пользуюсь.
Версия компилятора-то какая?

IAR ARM 5.40
попробовал из командной строки, скомпилить, просто 1 файл где функция прерывания


volatile char time2;
__fiq __arm void FIQTimer2Handler(void){
time2+=1;
}


iccarm.exe --eec++ -e -lC D:\my_pro\stepper\fiq\ D:\my_pro\stepper\fiq\main.cpp

результат с теми же PUSH POP.
попробовал на IAR 5.11, результат тот же.
а что вы в командной строке пишете?
zltigo
Цитата(Sagittarius @ Jan 28 2010, 08:24) *
IAR ARM 5.40

То, что присылал был старый 4.x компилятор, на 5 сейчас не досуг даже такую мелочь попробовать, если вдруг угробили, как и в Keil, FIQ, то крайне обидно!!!
P.S.
Попробовал
CODE

###############################################################################
# #
# IAR ANSI C/C++ Compiler V5.41.0.51741/W32 for ARM 28/Jan/2010 10:47:02 #
# Copyright © 1999-2009 IAR Systems AB. #
# #
# Cpu mode = arm #
# Endian = little #
# Source file = D:\IAR\Embedded Workbench 5\arm\examples\NXP\LPC214x\IAR #
# -LPC-214X\Uart\Source\fiqhandl.c #
# Command line = "D:\IAR\Embedded Workbench 5\arm\examples\NXP\LPC214x\IA #
# R-LPC-214X\Uart\Source\fiqhandl.c" -lCN #
# "D:\IAR\Embedded Workbench 5\arm\examples\NXP\LPC214x\IA #
# R-LPC-214X\Uart\Project\Test\List\" -o "D:\IAR\Embedded #
# Workbench 5\arm\examples\NXP\LPC214x\IAR-LPC-214X\Uart\P #
# roject\Test\Obj\" --debug --endian=little #
# --cpu=ARM7TDMI-S -e --fpu=None --dlib_config #
# "D:\IAR\Embedded Workbench 5\arm\INC\DLib_Config_Normal. #
# h" -I "D:\IAR\Embedded Workbench #
# 5\arm\examples\NXP\LPC214x\IAR-LPC-214X\Uart\Project\..\ #
# Source\" -I "D:\IAR\Embedded Workbench 5\arm\INC\" #
# --cpu_mode arm -Oh #
# List file = D:\IAR\Embedded Workbench 5\arm\examples\NXP\LPC214x\IAR #
# -LPC-214X\Uart\Project\Test\List\fiqhandl.lst #
# Object file = D:\IAR\Embedded Workbench 5\arm\examples\NXP\LPC214x\IAR #
# -LPC-214X\Uart\Project\Test\Obj\fiqhandl.o #
# #
# #
###############################################################################

D:\IAR\Embedded Workbench 5\arm\examples\NXP\LPC214x\IAR-LPC-214X\Uart\Source\fiqhandl.c
1
2 #include <stdlib.h>
3
4 //---------------------------------------------------------------------------

\ In section .bss, align 4
5 volatile int cnt;
\ cnt:
\ 00000000 DS8 4
6 //
7 //---------------------------------------------------------------------------

\ In section .textrw, align 4, keep-with-next
8 __fiq __arm __ramfunc void FIQ_ISR_handler(void)
9 {
\ FIQ_ISR_handler:
\ 00000000 03002DE9 PUSH {R0,R1}
10
11 cnt++;
\ 00000004 10009FE5 LDR R0,??FIQ_ISR_handler_0 ;; cnt
\ 00000008 001090E5 LDR R1,[R0, #+0]
\ 0000000C 011081E2 ADD R1,R1,#+1
\ 00000010 001080E5 STR R1,[R0, #+0]
12
13
14
15 }
\ 00000014 0300BDE8 POP {R0,R1}
\ 00000018 04F05EE2 SUBS PC,LR,#+4 ;; return
\ ??FIQ_ISR_handler_0:
\ 0000001C ........ DC32 cnt

Maximum stack usage in bytes:

Function .cstack
-------- -------
FIQ_ISR_handler 8


Section sizes:

Function/Label Bytes
-------------- -----
cnt 4
FIQ_ISR_handler 32


4 bytes in section .bss
32 bytes in section .textrw

32 bytes of CODE memory
4 bytes of DATA memory

Errors: none
Warnings: none


Все в порядке. Плюсовым компилятором - тоже
SpiritDance
В смысле ? push и pop в вашем листинге присутствуют.
zltigo
Цитата(SpiritDance @ Jan 28 2010, 11:37) *
В смысле ? push и pop в вашем листинге присутствуют.

Блин, заскок. Конечно НЕ в порядке sad.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.