C de bu islem baska nasil yazilir.

Başlatan Yuunus, 07 Kasım 2013, 21:31:32

Yuunus

   Merhaba, C deki ozel operatorleri kullanmadan "&,| vs" asagidaki portu okumanin daha basit bir yolu var mi?
data=(GPIOB->IDR & 0x1);

camby

#1
yok , zaten bit işlem yapılamıyor ( bit set reset dışında )



Düzeltme : bit set reset yazmışım parantez içi dalgınlıkla ama o bit banding olacaktı.

z

Bit banding ile dogrudan ilgili biti okursun. Maskeleme isleriyle ugrasmana gerek kalmaz.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Yuunus

hocam nasil, forumdaki bitbanding orneginize baktim baya uzun, amacim port'a daha hızlı erismek ama sanirim bitbanding de daha fazla islem yapiyor.
https://www.picproje.org/index.php/topic,36040.0.html

z

Nasil bir kod yazacagina bagli. Hele hele isin icine asm sokulursa limitleri zorlarsin.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Yuunus

hocam yazacagim kod sadece bu data=(GPIOB->IDR & 0x1); asembler ile yapmak istedim ama bu arm in asm sinden hic bisey anlamadim isin kotusu ogretecek kaynakta bulamadim.


mufitsozen

Alıntı yapılan: digiman - 07 Kasım 2013, 21:31:32
   Merhaba, C deki ozel operatorleri kullanmadan "&,| vs" asagidaki portu okumanin daha basit bir yolu var mi?
data=(GPIOB->IDR & 0x1);

z hocam bana kizacak yine ama, asm'ye gerek yok.

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka4203.html
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

z

Ben gene de yazayim.

PORT B nin B0 bitini Bit0 adindaki integer degiskenin icine yazmak icin

int __ASM BitBand(int Adr)
{
      LDR R0,[R0]
      BX   LR
}

int main()
{
int Bit0;
     
     Bit0=BitBand(0x42218100) ;
}

Alin iste mis gibi C.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mistek

Alıntı yapılan: z - 07 Kasım 2013, 23:23:56
Ben gene de yazayim.

PORT B nin B0 bitini Bit0 adindaki integer degiskenin icine yazmak icin

int __ASM BitBand(int Adr)
{
      LDR R0,[R0]
      BX   LR
}

int main()
{
int Bit0;
     
     Bit0=BitBand(0x42218100) ;
}

Alin iste mis gibi C.

Hocam sizin bu ASM C karışık örneklerinize bakınca ASM göz korkutmuyor. :)
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

Yuunus

 ;D sagol hocam bende ARM assembler pdf indirdim registerlara bakiyorum. Aslında ARM ogreniyoruz ornekleri gibi birde asm icin ogreniyoruz diye bolum acsaniz buyuk sevaba girersiniz. Gercekten ornekleriniz sade ve anlasilir. Tesekkur ederim.

CLR

Merhaba,

Ben size daha güzel bir yöntem vereyim, keil uzun zamandır compile ederken bitbanding'i destekliyor bu nedenle bit bazında asm ile uğraşmaya gerek yok, aşağıdaki örneği inceleyin, keil'in struct'ları bitbanding olarak kullanması için "__attribute__((bitband))" eklemeniz gerekir. Keil/arm sitesinde de örnekler görebilirsiniz anlatılıyor. Bir struct'ın bir bitlik değişkenlerine bitbanding olarak erişir bu nedenle en verimli yöntemdir.

struct GPIO_IDR_BITS{
  vu32  IDR0           : 1;
  vu32  IDR1           : 1;
  vu32  IDR2           : 1;
  vu32  IDR3           : 1;
  vu32  IDR4           : 1;
  vu32  IDR5           : 1;
  vu32  IDR6           : 1;
  vu32  IDR7           : 1;
  vu32  IDR8           : 1;
  vu32  IDR9           : 1;
  vu32  IDR10          : 1;
  vu32  IDR11          : 1;
  vu32  IDR12          : 1;
  vu32  IDR13          : 1;
  vu32  IDR14          : 1;
  vu32  IDR15          : 1;
  vu32  unused         :16;
}__attribute__((bitband));

union GPIO_IDR_REG {
	vu32 	b32;
	struct 	GPIO_IDR_BITS bits;
	struct b16_strct	b16;
	struct b8_strct		b8;
};


Ben stm32 (ve stm8) için tüm hafıza struct/union yapısı oluşturdum tüm register ve bitlere aşağıdaki şekilde erişebiliyorum, yukarıdaki yapıyı tüm hafızaya dağıtırsanız programlama aşağıdaki şekilde kolaylaşır.
İsteyen arkadaşlar yukarıdaki gibi yapıyı tüm registerlere uygularlarsa yapabilirler.

 

Knowledge and Experience are Power

camby

Z Hocam biraz STM32 ASM anlatsan bir başlıkta katılırım ben de.

CLR

Türkiye'de eğitim sorunu var, amerikada'ki gibi kolej tipi eğitimi uygulamak gerekiyor yani hoca konu başlığını verecek, öğrenci hem günlerce/haftalarca araştıracak hem de kendi kendine konuyu öğrenecek. Öğrenci ilk konuda epey zorlanır ama sonrakiler de artık kimsenin yardına ihtiyaç duymadan kendi işini görebilir. 

Mutlaka yardımlaşmalıyız, sormalıyız, öğrenmeliyiz ama başaramadığımız noktalarda, herşeyi sorarsak kolay bilgi olur, o zamanda bilginin kıymeti/değeri olmaz. Üniversitedeki en iyi hocalar bilgiyi yeterli temel düzeyde verip sınavda/uygulamada en çok zorlayanlardır.

Mesela ben bir işlemciye geçeceksem önce asm instuction setini ve donanımını incelerim, bu işlemcinin gücünü verir. Geçmişte  gerçekten asm program yazmışsanız, yani asm komut öğrenmekten bahsetmiyorum, yeni işlemci ile de yazabilirsiniz. Bunun için 1-2 ay çaba gerekiyor çünkü "kolay ulaşılan bilgi kolay kaybedilir".

Stm32 asm üzerinde biraz kafa patlattım çünkü bu donanıma hakim olmanıza yardımcı oluyor. Bunu yaparken kimseden yardım(öğrenme babında yoksa çok kod inceledim çünkü akıl akıldan üstündür) almadım, bu benim zorlanmamı ve bilgiye zor ulaşmamı sağladı ama pozitif olarak bilgininde kalıcı olmasını.

Aşağıdaki yapı full stm32 asm'dir, asm'de şöyle bir durum vardır sürekli belirli komut/komut dizisi tekrar eder, bunun için macrolar kullanılır ama bazı yerlerde, tek cycle'ın hesabını yapmanız gerekiyorsa, macro kullanılması fazla asm komut harcanmasına sebeb olur, orada doğrudan asm instructions kullanılır. Aşağıdaki yapı asm macrolar sayesinde kısmen C sadeliğindedir.   

stm32 Asm ile adc, spi, usart, tft , UK capture, timer vb.  uygulamaları aşağıdaki macro ve asm komutlarla gerçekleştirdim ama çoğu durumda asmye gerek olmuyor sadece bileyim ama gerektiği yerde kullanayım diye biliyorum. Biliyorum kelimesi iddalı bir kelime sürekli öğreniyorum demek daha mantıklı.



Knowledge and Experience are Power

camby

Ama gordugum kadariyla bulent hoca forumda amerkan kolej sisteminin tersine hareket etmis bir cok kisinn/firmanin da stm ve arm lara gecis yapmasina sebep olmus.

Farketmissinizdir , Ogrenci hoca iliskisi bir yana daha farkli formatlarda da bu meslekte calisanlar birbirleri ile yardmlasabiliyor,burada.