a EQU b --> EQU direktifi hakkında

Başlatan ziyaretci, 13 Ekim 2018, 21:06:19

ziyaretci

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

devrecii

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.


 

ziyaretci

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.

ziyaretci

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.

devrecii


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.



ziyaretci

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

RaMu

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.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Zoroaster

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.
Seytan deliginden kacti.