Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => ARM => Konuyu başlatan: ziyaretci - 13 Ekim 2018, 21:06:19

Başlık: a EQU b --> EQU direktifi hakkında
Gönderen: ziyaretci - 13 Ekim 2018, 21:06:19
Merhaba, KEIL'DE ASM ile STM32F407 programlamaya başladım yavaş yavaş. PIC bilgilerim ile çelişen bir durum ile karşılaştım veya yanlış biliyorumdur.

PIC ASM 'de EQU komutu register adresini bir etikete atamak için kullanılıyordu.

Örnek bir ARM-ASM uygulamasında EQU kullanarak etikete register adresi atamış, burası tamam. Ama yine EQU'u kullanarak dahili gecikme için bir etikete sayısal değer yüklemiş(hex formatında).

; ******* Constants *******
;Delay interval
;The delay loop takes 313 nsec to execute at 16MHz
;Time delay = DELAY_INTERVAL * 313 nsec
;Overheads are ignored

DELAY_INTERVAL    EQU    0x186004
; ******* Register definitions *******

;As per STM32F407 datasheet and reference manual

RCC_AHB1ENR    EQU    0x40023830   ;Clock control for AHB1 peripherals (includes GPIO)

;GPIO-D control registers
GPIOD_MODER    EQU    0x40020C00

;set GPIO pin mode as Input/Output/Analog
GPIOD_OTYPER    EQU    0x40020C04

;Set GPIO pin type as push-pull or open drain
GPIOD_OSPEEDR    EQU     0x40020C08

;Set GPIO pin switching speed
GPIOD_PUPDR    EQU    0x40020C0C

;Set GPIO pin pull-up/pull-down
GPIOD_ODR    EQU    0x40020C14    ;GPIO pin output data
Hani bende PIC ASM'den aynı dahili gecikme için aşağıdaki yolun izlenmesi gerektiğini biliyorum.
Alıntı Yap1- EQU ile bir etikete genel amaçlı ram bellek adresi tanımla.
2- W kayıtçısına sayısal değer ata.
3- W kayıtçısındaki değeri EQU ile adres atadığım etikete yükle.

SAYICI EQU h'20'
MOVLW D'255'
MOVWF SAYICI ; gibi..

KEIL 'de derleyici bu durumu otomatik olarak mı ayarlıyor? Bu konuda bilgisi olan arkadaşlardan açıklama rica ediyorum.

Şimdiden çok teşekkür ederim.

Örnek led flaşör kodunun tamamı aşağıda.
;******************** (C) COPYRIGHT 2018 IoTality ********************
;* File Name          : LED.s
;* Author             : Gopal
;* Date               : 07-Feb-2018
;* Description        : A simple code to blink LEDs on STM32F4 discovery board
;*                      - The functions are called from startup code
;*                      - Initialization carried out for GPIO-D pins PD12 to PD15 (connected to LEDs)
;*                      - Blink interval delay implemented in software
;*******************************************************************************

; ******* Constants *******
;Delay interval
;The delay loop takes 313 nsec to execute at 16MHz
;Time delay = DELAY_INTERVAL * 313 nsec
;Overheads are ignored

DELAY_INTERVAL EQU 0x186004

; **************************


; ******* Register definitions *******

;As per STM32F407 datasheet and reference manual

RCC_AHB1ENR EQU 0x40023830 ;Clock control for AHB1 peripherals (includes GPIO)

;GPIO-D control registers
GPIOD_MODER EQU 0x40020C00 ;set GPIO pin mode as Input/Output/Analog
GPIOD_OTYPER         EQU 0x40020C04 ;Set GPIO pin type as push-pull or open drain
GPIOD_OSPEEDR         EQU     0x40020C08 ;Set GPIO pin switching speed
GPIOD_PUPDR EQU 0x40020C0C ;Set GPIO pin pull-up/pull-down
GPIOD_ODR EQU 0x40020C14 ;GPIO pin output data

; **************************

; Export functions so they can be called from other file

EXPORT SystemInitt
EXPORT __main

AREA MYCODE, CODE, READONLY

; ******* Function SystemInit *******
; * Called from startup code
; * Calls - None
; * Enables GPIO clock
; * Configures GPIO-D Pins 12 to 15 as:
; ** Output
; ** Push-pull (Default configuration)
; ** High speed
; ** Pull-up enabled
; **************************

SystemInitt FUNCTION

; Enable GPIO clock
LDR R1, =RCC_AHB1ENR ;Pseudo-load address in R1
LDR R0, [R1] ;Copy contents at address in R1 to R0
ORR.W R0, #0x08 ;Bitwise OR entire word in R0, result in R0
STR R0, [R1] ;Store R0 contents to address in R1

; Set mode as output
LDR R1, =GPIOD_MODER ;Two bits per pin so bits 24 to 31 control pins 12 to 15
LDR R0, [R1]
ORR.W         R0, #0x55000000 ;Mode bits set to '01' makes the pin mode as output
AND.W         R0, #0x55FFFFFF ;OR and AND both operations reqd for 2 bits
STR R0, [R1]

; Set type as push-pull (Default)
LDR R1, =GPIOD_OTYPER ;Type bit '0' configures pin for push-pull
LDR R0, [R1]
AND.W         R0, #0xFFFF0FFF
STR R0, [R1]

; Set Speed slow
LDR R1, =GPIOD_OSPEEDR ;Two bits per pin so bits 24 to 31 control pins 12 to 15
LDR R0, [R1]
AND.W         R0, #0x00FFFFFF ;Speed bits set to '00' configures pin for slow speed
STR R0, [R1]

; Set pull-up
LDR R1, =GPIOD_PUPDR ;Two bits per pin so bits 24 to 31 control pins 12 to 15
LDR R0, [R1]
AND.W         R0, #0x00FFFFFF ;Clear bits to disable pullup/pulldown
STR R0, [R1]

BX LR ;Return from function

ENDFUNC


; ******* Function SystemInit *******
; * Called from startup code
; * Calls - None
; * Infinite loop, never returns

; * Turns on / off GPIO-D Pins 12 to 15
; * Implements blinking delay
; ** A single loop of delay uses total 6 clock cycles
; ** One cycle each for CBZ and SUBS instructions
; ** 3 cycles for B instruction
; ** B instruction takes 1+p cycles where p=pipeline refil cycles
; **************************

__main FUNCTION

turnON
; Set output high
LDR R1, =GPIOD_ODR
LDR R0, [R1]
ORR.W R0, #0xF000
STR R0, [R1]

LDR R2, =DELAY_INTERVAL

delay1
CBZ R2, turnOFF
SUBS R2, R2, #1
B delay1
   
turnOFF
; Set output low
LDR R1, =GPIOD_ODR
LDR R0, [R1]
AND.W R0, #0xFFFF0FFF
STR R0, [R1]

LDR R2,=DELAY_INTERVAL
delay2
CBZ R2, delayDone
SUBS R2, R2, #1
B delay2

delayDone
B turnON

ENDFUNC

NOP
END
Başlık: Ynt: a EQU b --> EQU direktifi hakkında
Gönderen: devrecii - 13 Ekim 2018, 21:56:31
Dostum o equ denen şeyi flah hafızada derleyici kendisi uygun bir yere yazar ldr dediğinde o hafıza alanına ulaşıp o değeri registere yazar.

iar da böyle değildi DD DB yazılıyordu,



Sana tavsiyem hiç ARM - ASM ile uğraşma  komut seti  hiç güzel değil arm ın. 

Yani optmizasyon yapacağın komut seti yok,  boşa hamallık olur.


 
Başlık: Ynt: a EQU b --> EQU direktifi hakkında
Gönderen: ziyaretci - 13 Ekim 2018, 22:13:56
Alıntı yapılan: iboibo - 13 Ekim 2018, 21:56:31Dostum o equ denen şeyi flah hafızada derleyici kendisi uygun bir yere yazar ldr dediğinde o hafıza alanına ulaşıp o değeri registere yazar.

iar da böyle değildi DD DB yazılıyordu,


Sana tavsiyem hiç ARM - ASM ile uğraşma  komut seti  hiç güzel değil arm ın. 

Yani optmizasyon yapacağın komut seti yok,  boşa hamallık olur.


İnanın C ile girecektim ARM'a dün akşam. Bayağı kastırdım. Ama orada çok fazla bilmediğim şeyler çıktı. Temel C komutlarından bahsetmiyorum, ezberi çok fazla geldi bana. Youtube'da birisi C üzerinden video anlatımları yapmış, 8 video kadar geldim, baktım o da ezbere gidiyor. Neyi, neden yaptığını pek bilmiyor. Dedim bu iş böyle olmaz.

ASM'nin hamallık olduğunu PIC'den az çok biliyorum ama dün akşam bu kanımdan "neye göre, kime göre?" sorusu ile vazgeçtim.

C setinde çok fazla ezber(oluşturulan fonksiyon direktifleri, komut karakter dizisi uzunluğu vs.) var. Valla gözüm korktu dün akşam. Dedim; temelden gireyim, neyin ne olduğunu bileyim, tek tek kullanacağım kütüphaneleri oluştururum, yeterki neyin ne olduğunu bileyim. Zamandan sıkıntım yok. ASM ile girdim valla yıllar alsada bu böyle devam edecek.
Başlık: Ynt: a EQU b --> EQU direktifi hakkında
Gönderen: ziyaretci - 13 Ekim 2018, 22:19:02
Konu hakkında yazmayı unuttum.
Alıntı YapDostum o equ denen şeyi flah hafızada derleyici kendisi uygun bir yere yazar ldr dediğinde o hafıza alanına ulaşıp o değeri registere yazar.

Dediğinizi anladım. Ben zannediyorum ki EQU direkt register ile bağlantılı. Flash hafıza core tarafından tek tek gezildiğinde o değeri LDR komutlarıya registere ulaştırıyoruz. Şimdi oturdu, teşekkür ederim.
Başlık: Ynt: a EQU b --> EQU direktifi hakkında
Gönderen: devrecii - 13 Ekim 2018, 22:30:58

Hal/stdlib vs bunları kastediyorsun , 

Bunları kullanmak zorunda değilsin register hafıza yerlerini bilirsen cpu modul vs initialize ayarları yapacaksın bu da çok basit .

asm de de yazsan o initialize kısmını yazacaksın, c de yazmak varken neden asm kullanasın ki.

Bunun dışında arm da ayrıca bir C dili extraları yok.

Bir de iar tavsiye ederim. Ürettiği kodlar o kadar muhteşem ki belki asm de yazsan daha kötü yaparsın.


Başlık: Ynt: a EQU b --> EQU direktifi hakkında
Gönderen: ziyaretci - 13 Ekim 2018, 22:58:59
Beni ikilime sürüklüyorsunuz, :)  dün akşam zor çıktım bu ikilemden(C'mi ASM'mi, C'mi ASM'mi). Saatlerce beynim can çekişti, bir C projesi oluşturuyorum, bir ASM. İki ledi yakamadım da bu sabah anca becerdim ASM ile.

Son karar: Kötü yapsamda ne yaptığımı bilerek yapayım.  ;D
Başlık: Ynt: a EQU b --> EQU direktifi hakkında
Gönderen: RaMu - 14 Ekim 2018, 02:27:18
Sonra detayları yazacağım şuan telefondan zor oluyor.
Aslında pic asm de equ ile register tanımlaması yapılmıyor,
şu harf ifadesi bu sayı anlamına gelir deniyor,
pic asm de registet ataması için başka bir şey var,
eskiden yazdığım relocatable kod gibi bir başlıklı konuda bahsetmiştim.
Arm C Asm için söylenecek çok söz var ama boş konuşuruz ne desek yinede
asm ile nasıl oluyor diye bilip C ile çalışmak çok iyi olur.
Daha önce stm keil içindi herhalde paylaştığım youtube dersleri vardı bulur yazarım yine,
orada asm c karşılıklı ve mimaridende bahsederek anlatıyordu adam
tam senin istediğin odur.
Başlık: Ynt: a EQU b --> EQU direktifi hakkında
Gönderen: Zoroaster - 14 Ekim 2018, 05:26:52
A EQU B   demek

A gordugun yerde B degerini kullan demek.

Bunun anlasilirlik acisindan cok faydasi var. Ustelik tek satirda duzeltme yaptiginda tum programda duzenleme imkani dogar.

Ornegin

A Equ 100

MOV R0, #A+1 
MOV R1, #A+2
MOV R2, #A+3 


Eger boyle yazmayip

MOV R0, #101 
MOV R1, #102
MOV R2, #103


deseydik ve daha sonra 100 yerine 200 yapmak istesedik ilk yazim seklinde A equ 200 dememiz yeterli olurken
ikinci yazimda

MOV R0, #201 
MOV R1, #202
MOV R2, #203 


seklinde tum satirlari elden gecirmemiz gerekirdi.

Ayrica bazi hesaplamalari da derleyiciye yaptirabiliriz.

A EQU Label1 - Label2 yazmakla Label1 ve label2 labellari arasindaki program yada data blogunun boyunu derleyiciye hesaplatmis oluruz ve bu degerin lazim oldugu dongulerde vs A degerini kullaniriz.

Bunu yapmamis olsaydik label1 ve label2 araligindaki datalari kod yazarken bizim sayip kod alanindaki dongu kismina bizim elle yazmamiz gerekirdi.

Kisacasi EQU bizi hamallik islerinden kurtariyor.