Picproje Elektronik Sitesi

DERLEYİCİLER => Diğer Derleyiciler => KEIL => Konuyu başlatan: z - 17 Şubat 2013, 13:47:12

Başlık: CM3 Registerlerine yeni isim vermek ve macro kod yazmak
Gönderen: z - 17 Şubat 2013, 13:47:12
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.
Başlık: Ynt: CM3 Registerlerine yeni isim vermek ve macro kod yazmak
Gönderen: ErsinErce - 17 Şubat 2013, 14:52:40
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
Başlık: Ynt: CM3 Registerlerine yeni isim vermek ve macro kod yazmak
Gönderen: z - 17 Şubat 2013, 15:59:03
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)

Başlık: Ynt: CM3 Registerlerine yeni isim vermek ve macro kod yazmak
Gönderen: z - 17 Şubat 2013, 19:07:35
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.
Başlık: Ynt: CM3 Registerlerine yeni isim vermek ve macro kod yazmak
Gönderen: z - 31 Mart 2013, 16:06:57
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.




Başlık: Ynt: CM3 Registerlerine yeni isim vermek ve macro kod yazmak
Gönderen: mufitsozen - 31 Mart 2013, 16:14:30
INFO yada ASSERT MACRO komutlarini kullanabilirsiniz.
Başlık: Ynt: CM3 Registerlerine yeni isim vermek ve macro kod yazmak
Gönderen: z - 31 Mart 2013, 16:31:55
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
Başlık: Ynt: CM3 Registerlerine yeni isim vermek ve macro kod yazmak
Gönderen: ErsinErce - 31 Mart 2013, 18:03:05
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
Başlık: Ynt: CM3 Registerlerine yeni isim vermek ve macro kod yazmak
Gönderen: z - 31 Mart 2013, 18:16:05
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.

Başlık: Ynt: CM3 Registerlerine yeni isim vermek ve macro kod yazmak
Gönderen: ErsinErce - 31 Mart 2013, 18:27:22
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
Başlık: Ynt: CM3 Registerlerine yeni isim vermek ve macro kod yazmak
Gönderen: z - 31 Mart 2013, 18:40:57
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?
Başlık: Ynt: CM3 Registerlerine yeni isim vermek ve macro kod yazmak
Gönderen: ErsinErce - 31 Mart 2013, 18:49:19
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?
Başlık: Ynt: CM3 Registerlerine yeni isim vermek ve macro kod yazmak
Gönderen: z - 31 Mart 2013, 19:01:02
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