CM3 Registerlerine yeni isim vermek ve macro kod yazmak

Başlatan z, 17 Şubat 2013, 13:47:12

z

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.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

ErsinErce

#1
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

z

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)

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

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.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

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.




Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mufitsozen

INFO yada ASSERT MACRO komutlarini kullanabilirsiniz.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

z

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
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

ErsinErce

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

z

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.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

ErsinErce

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

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

z

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?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

ErsinErce

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?

z

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
Bana e^st de diyebilirsiniz.   www.cncdesigner.com