Keil ortamında asm dosyalarda kullanmak üzere bazı CM3 CPU registerlerinin adlarını değiştirmek istiyorum.
Örneğin R0 yerine MyReg demek için ne yapmam gerekir?
Ayrıca macro yazım örneği arıyorum.
C:\Keil\ARM\Hlp\armasm.hlp içinde asm macro oluşturma örneği mevcut hocam
r0 yerine myreg diyebilmek için bir kolaylık ile şu anlık karşılaşmadım, belki adresini tanımlayarak erişim sağlanabilir
araştırmaya devam ediyorum ...
_____________________
C:\Keil\ARM\Hlp\armasmref.hlp içinde yazdığına göre
myreg RN r0
yazınca istediğiniz oluyormuş hocam
Sağolasın bu sorum ve sayende helplere bakmayı öğrendim.
MyReg RN 0
deyince oldu.
STM32F103 le birlikte C den tamamen uzaklaşacağım. C ve ASM bir arada kullanınca Keilin C ile ilgili kurallarına uymak gerekiyor.
Mesela R4....R12 yi bozamıyorsunuz. İllaki bozacaksan, asm subrutinlerde bunları push edip daha sonra rutinden çıkıp C ye geçerken pop etmek gerekiyordu. (Başka birilerinin zorlaması ile Push ve pop a oldum olası deli oluyorum.)
Artık mesela R12 ye sahipleneceğim ve tüm program boyunca R12 tek bir hedefi gösterecek. Dolayısı ile zırt pırt R12 ye değer yüklemem gerekmeyecek, bu durumda R12 yazmak yerine de mesela R12 yerine Timer deceğim. Bu da bana inanılmaz okuma anlaşılırlığı sağlayacak, hız kazandıracak ;D (Harbiden hız kazandıracak)
Gerbay hocam
ASM kodlayarak yazdığım programlarım çok zamanımı alsa da, kodlarım C'den daha kısa ve daha hızlı çalışıyor.
İşlemcisiz dünyada lojik minimizasyon yapa yapa bu bir hayat felsefesi oldu.
Ayrıca hiç bir projem C ile yazımı gerektirecek kadar karmaşık değil. En fazla 1000 ... 2000 satır da projenin canına okuyorum.
C isteyecek projeler zaten ilgimi çekmiyor. Yoksa yazarım C zor değil. Ama sevmiyorum.
Hazırladığım Macrolarda derleme aşamasında hata kontrolu yapmak istiyorum.
Örneğin DisableInt adındaki bir macroda Int Numaramız 0....10 aralığında olsun.
Fakat bu macroyu DisableInt 12 olarak çağırdıysam kodlar derlenirken
"Disable etmek istediğiniz Int No 12 olamaz" benzeri hata mesajı verilsin istiyorum.
Hata yakalama kısmını IF ile yapıyorum fakat bir türlü istetiğim hata mesajını verdiremedim.
INFO yada ASSERT MACRO komutlarini kullanabilirsiniz.
Hocam ASSERT yada INFO yazınca kendi yazdığım açıklama mesajı gelmiyor.
Aşağıdaki örnekte IntNo 12 olarak gelirse hata veriyor ama istiyorumki ekrana da ssdfksdfkfdsjfjsdfjskd mesajı çıksın.
IF $IntNo>10
INFO "ssdfksdfkfdsjfjsdfjskd"
ELSE
Kodlarım
ENDIF
http://www.keil.com/support/man/docs/ARMASMREF/armasmref_Cacdcgac.htm (http://www.keil.com/support/man/docs/ARMASMREF/armasmref_Cacdcgac.htm)
diagnose kullanırsanız sorun çözülecek sanırım hocam, yukarıdaki sayfa içeriğinde not dan önceki kullanıma bakarsanız belki yol gösterir
Hocam hastayım senin şu cevaplarına.
Helpte bakındım işime yarar kodları denedim işime yaramayınca da sorayım dedim.
Bu soruyu okuduktan sonra nasıl oldu da bu diagnose cevabına ulaştın? Gerçekten çok merak ediyorum.
konunun genel kapsamı hangi kelimelerle ifade ediliyor ona bakıyorum genelde, sonra birkaç kelime ekleyerek aradığım noktaya odaklanıyorum
http://www.keil.com/support/man/docs/ARMASMREF/armasmref_caccehia.htm (http://www.keil.com/support/man/docs/ARMASMREF/armasmref_caccehia.htm)
giriş noktam buraydı, info ve macroya daldım arada farklı bir yapı görünce büyük ihtimal bu diyerek size yazdım hocam
genelde kaçırdığım nokta olsada siz daha iyi bildiğinizden sonuca daha kolay ulaşıp yazıyorsunuz, bu sayede diğer konularda araştırma yaparken sizin tamamlamalarınızın ekmeğini çok yiyorum hocam :)
sorun çözüldü umarım?
ayrıca info 0,"sdfa"
şeklinde kullanımda mevcut ama denediniz diye düşünüyorum
Evet INFO komutunu diagnose macrosundaki gibi kullanınca sorun bitti.
Şeftali ile ilgili atasözünü söylemeyeceğim ama;
Şimdi macrom parametrede hata bulursa warning seviyesinde hata verip, macro ya gönderilen parametremin hatalı olduğunu söylüyor.
Bunu warning yerine Error yapmanın yolu varmıdır?
http://msdn.microsoft.com/en-us/library/ee479720.aspx (http://msdn.microsoft.com/en-us/library/ee479720.aspx)
farklı bir yerde (!) ünlem işareti ile error a string birleştirme durumu mevcut hocam bir deneyebilir misiniz?
INFO 0,"Warning"
INFO 1,"Error"
Bu kadar basitmiş.
Macromu yayınlayayım artık.
;***************************************************************
; NVIC'i temizler INTlari kaldirir
;***************************************************************
MACRO
$label InitNVIC
LDR R1,=NVIC_BASE
MOV R0,#0XFFFFFFFF;
STR R0,[R1,#NVIC_DIS0]
STR R0,[R1,#NVIC_DIS1]
; Tum intlarin onceligini sona alalim
STR R0,[R1,#NVIC_PRI0]
STR R0,[R1,#NVIC_PRI1]
STR R0,[R1,#NVIC_PRI2]
STR R0,[R1,#NVIC_PRI3]
STR R0,[R1,#NVIC_PRI4]
STR R0,[R1,#NVIC_PRI5]
STR R0,[R1,#NVIC_PRI6]
STR R0,[R1,#NVIC_PRI7]
STR R0,[R1,#NVIC_PRI8]
STR R0,[R1,#NVIC_PRI9]
STR R0,[R1,#NVIC_PRI10]
STR R0,[R1,#NVIC_PRI11]
STR R0,[R1,#NVIC_PRI12]
STR R0,[R1,#NVIC_PRI13]
MEND
;***************************************************************
; Verilen Int No ve Priority ye gore
; NVIC_PRIOx ve NVIC_ENx registerlerine
; deger yukler
; R0 bozulur
; R1 NVIC Base Register adresi olarak hazir gelmelidir
;***************************************************************
MACRO
$label SetNVIC $IntNo, $Priority
IF $IntNo>42
INFO 1,"IntNo 42 den buyuk olamaz"
ELSE
IF $Priority>7
INFO 1,"Priority 15 den buyuk olamaz"
ELSE
LDR R0,[R1,#NVIC_PRI0+($IntNo/4)*4]
BIC R0,#(0xF<<(4+($IntNo%4)*8))
ORR R0,#($Priority<<(4+($IntNo%4)*8))
STR R0,[R1,#NVIC_PRI0+($IntNo/4)*4]
IF $IntNo<32
LDR R0,[R1,#NVIC_EN0]
ORR R0,#1<<($IntNo)
STR R0,[R1,#NVIC_EN0]
ELSE
LDR R0,[R1,#NVIC_EN1]
MOV R0,#1<<($IntNo-32)
STR R0,[R1,#NVIC_EN1]
ENDIF
ENDIF
ENDIF
MEND
Örnek kullanım
InitNVIC ; NVIC'ın daha önceki ayarlarını sil
SetNVIC 68,7 ; !!!! Bu satır özellikle macronun hata vermesi için yazıldı
SetNVIC 18,7 ; ADC, 18 nolu interrupti 7 oncelikli olarak ac
SetNVIC 28,5 ; TMR2, 28 nolu interrupti 5 oncelikli olarak ac
CPSIE I ; INT ENB
mesaj birleştirme:: 31 Mart 2013, 19:20:12
Unutmadan;
Startup kodlarımdaki vector tablosunu da vereyim. Macroda hangi int numarası ne anlama geliyor tablodan anlaşılacaktır.
Aynı mantığı C'ye de kolayca cevirebilirsiniz.
; External Interrupts
DCD WWDG_IRQHandler ; Int Sira No 0 Window Watchdog
DCD PVD_IRQHandler ; Int Sira No 1 PVD through EXTI Line detect
DCD TAMPER_IRQHandler ; Int Sira No 2 Tamper
DCD RTC_IRQHandler ; Int Sira No 3 RTC
DCD FLASH_IRQHandler ; Int Sira No 4 Flash
DCD RCC_IRQHandler ; Int Sira No 5 RCC
DCD EXTI0_IRQHandler ; Int Sira No 6 EXTI Line 0
DCD EXTI1_IRQHandler ; Int Sira No 7 EXTI Line 1
DCD EXTI2_IRQHandler ; Int Sira No 8 EXTI Line 2
DCD EXTI3_IRQHandler ; Int Sira No 9 EXTI Line 3
DCD EXTI4_IRQHandler ; Int Sira No 10 EXTI Line 4
DCD DMA1_Channel1_IRQHandler ; Int Sira No 11 DMA1 Channel 1
DCD DMA1_Channel2_IRQHandler ; Int Sira No 12 DMA1 Channel 2
DCD DMA1_Channel3_IRQHandler ; Int Sira No 13 DMA1 Channel 3
DCD DMA1_Channel4_IRQHandler ; Int Sira No 14 DMA1 Channel 4
DCD DMA1_Channel5_IRQHandler ; Int Sira No 15 DMA1 Channel 5
DCD DMA1_Channel6_IRQHandler ; Int Sira No 16 DMA1 Channel 6
DCD DMA1_Channel7_IRQHandler ; Int Sira No 17 DMA1 Channel 7
DCD ADC1_2_IRQHandler ; Int Sira No 18 ADC1_2
DCD USB_HP_CAN1_TX_IRQHandler ; Int Sira No 19 USB High Priority or CAN1 TX
DCD USB_LP_CAN1_RX0_IRQHandler ; Int Sira No 20 USB Low Priority or CAN1 RX0
DCD CAN1_RX1_IRQHandler ; Int Sira No 21 CAN1 RX1
DCD CAN1_SCE_IRQHandler ; Int Sira No 22 CAN1 SCE
DCD EXTI9_5_IRQHandler ; Int Sira No 23 EXTI Line 9..5
DCD TIM1_BRK_IRQHandler ; Int Sira No 24 TIM1 Break
DCD TIM1_UP_IRQHandler ; Int Sira No 25 TIM1 Update
DCD TIM1_TRG_COM_IRQHandler ; Int Sira No 26 TIM1 Trigger and Commutation
DCD TIM1_CC_IRQHandler ; Int Sira No 27 TIM1 Capture Compare
DCD TIM2_IRQHandler ; Int Sira No 28 TIM2
DCD TIM3_IRQHandler ; Int Sira No 29 TIM3
DCD TIM4_IRQHandler ; Int Sira No 30 TIM4
DCD I2C1_EV_IRQHandler ; Int Sira No 31 I2C1 Event
DCD I2C1_ER_IRQHandler ; Int Sira No 32 I2C1 Error
DCD I2C2_EV_IRQHandler ; Int Sira No 33 I2C2 Event
DCD I2C2_ER_IRQHandler ; Int Sira No 34 I2C2 Error
DCD SPI1_IRQHandler ; Int Sira No 35 SPI1
DCD SPI2_IRQHandler ; Int Sira No 36 SPI2
DCD USART1_IRQHandler ; Int Sira No 37 USART1
DCD USART2_IRQHandler ; Int Sira No 38 USART2
DCD USART3_IRQHandler ; Int Sira No 39 USART3
DCD EXTI15_10_IRQHandler ; Int Sira No 40 EXTI Line 15..10
DCD RTCAlarm_IRQHandler ; Int Sira No 41 RTC Alarm through EXTI Line
DCD USBWakeUp_IRQHandler ; Int Sira No 42 USB Wakeup from suspend
__Vectors_End