STM32F407 Cortex M4 şamataları

Başlatan bunalmis, 16 Ekim 2011, 17:14:50

gambit1244

#30
çok teşekkür ederim bilgi için

sormak istedigim
aslında anladıgımı sandığım emin olmak istedigim 4 şey var

1. 0x0000.0000  2^32  =4gb alanımız var  yani programla ilgili herşeyimiz bu değerlerin içinde saklı. ve bunlara istedigimiz zaman ulaşabiliyoruz doğrumu?

2. StackPoint registeri bizim labirentte dolaşırken son girdigimiz sokakları aklında tutuyor. peki bir sonraki sokaga girdiğimizde bu stack point değişiyormu yoksa stackpoint1 stackpoint2 diye kendimi kaydediyor
yani her sokağa girdigimizde stackpointe bakıp bunu biyere not etmemizmi gerekiyor?

3. PC=program counter = programın nerede çalıştığını gösteriyor istediğimiz degeri oraya yazıp oraya ışınlanıyoruz ve çalışmaya devam ediyoruz..
peki porgram counter sadece değer girilen bi registermi yoksa şuan nerede oldugumuz bilgiside PC de saklanıyormu ve her yeni komuta yada fonksiyona geçtiğimizde bu değerde değişiyormu(aynı şekilde bu register da bir adetmi bulunmakta)

4.PC bizi ışınlıyor ve oraya gidiyoruz bu biraz ileri seviye bir soru olabilir ama.. bizim cortexM4 ümüz 2 işlemi aynı anda yapabiliyor diye hatırlıyorum
dual core gibi..
ozaman bu program counterin 1 tane olması yetersiz değilmidir?(eğer 1 tane ise)

Pic ile ilgili ccs c de program yazdım fakat hep örneklere bakarak(amatörce) bugüne kadar hiç debug yapıp registerlerin nasıl değiştiğini tecrübe edememiştim anlatımınız cok güzel hocam benim gibi bir amatör bile anlıyorsa sorun yoktur diye umuyorum dediğiniz gibi temelden girmek çok mantıklı
bu 4 soru dışındaki herşeyi anladım kafama takılanlar bunlardı
sadece bunalmış hocam değil bilen arkadaşlarımda bildiklerini paylaşırsa çok sevinirim böylece bunalmış hocamda sizin yanlış bildiginiz biyeri görürse sizi uyarabilir.
Teşekkürler..
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Alıntı YapStack Pointer ve Program Counter terimlerini o sayfaya eklerim eklemesine de;

Bu terimleri daha önce mikroişlemci ile proje yapmış herkesin zaten biliyor olması lazım.

bunalmış hocam ccs c sağolsun inanın hiç bu registerlarla işimiz olmamıştı keşke zamanında ccs c den hitec e geçiş yapsaydım
ccs boyle şeylerle kafanızı yormanızı hiç istemiyor buyüzden satıyor.

herşeyi sonuna kadar anlatmanızı istemek gibi bi hakkımız yok
internetten türkçe rahatlıkla bulabilecegimiz terimlerin açıklamalarını yazmanıza gerek yok(tabi siz bilirsiniz). böylece ogrenciler(başta ben) araştırarak öğrenme kabiliyetlerini geliştirirler
ama eminimki kimselerin bilmediği şeylerle karşılaşacağız siz kafanızı(ve değerli vaktinizi) bunları anlatmaya verirseniz daha verimli olur diye düşünüyorum
saygılar
[email]tufan_ozbek@hotmail.com[/email] Yesterday is history. Tomorrow is a mystery. Today is a gift aslında bütün mesele bu.

mozkan87

#31
1. sorunun cevabı evet. İşlemciler için herşey adreslerden ibarettir. Yani bütün giriş çıkış birimleri ve diğer birimlerin hepsinin bir adresi vardır. Bu adresin belirli bir bölümü FLASH, belirli bir bölümü RAM ve diğer bölümlerden ibarettir. Bizim işlemcimiz 0x00000000 2^32=4 gb adresleme yapabilmektedir. Bu adreslerden her biri giriş çıkış olabilir, yada FLASH olabilir, RAM olabilir... Bizim işlemcimiz için 0x08000000 adresinden itibaren FLASH hafıza başlamaktadır.

3. soru Program Counter(PC) aslında adrestir ancak değeri her clock pulsunda 1 artar. Bu da bir sonraki çalıştırılacak olan komutun bulunduğu adrese denk gelir.(her clock pulsunda olmayabilir, 2 veya 4 te olabilir işlemciye göre değişmekte.)

2. soru Stack Pointer, program dallandıkça programın kaldığı yeri not eden bir yapıdır. Yani program yeni bir yere giderken kaldığı adresi Stack Pointer'in içine kaydeder. Aslında burada kaydettiği Program Counter'ın değeridir. Mesala program bir yere dallandı ve PC'nin değerini SP'ye kaydetti, bu esnada işlemci SP'nin adresinide 1 arttırır. Yani artık ikinci boş bir SP'miz oldu, tekrar programın dallanması gerekirse PC'nin değeri ikinci SP'ye kaydedilir. Geri dönerkende ilk önce ikinci SP'den PC değerini alır işlemi tamamlar. Tamaladıktan sonra birinci SP den değeri alır ve normal işleyişine devam eder. Biraz karışık oldu ama anlamadığınız yerleri sorabilirsiniz.

4. soru aslında en basit soru bu hiç bir işlemci çift çekirdek olmadığı sürece aynı anda iki işlem yapamaz. Önce birini yapar diğerine geçer. Yada RTOS'ta olduğu gibi biraz birinden biraz birinden yapar.

Not: Cevapları düzenledikçe dilim döndükçe yazmaya çalışacağım.

z

 Taneryilmaz ve Dombilik ders basliginda ayni sorulari sormuslar. Evet yazmayi unutmusum 44. sayfada boot1 pini yaziyor.   
Alıntı Yaphocam hard 38-39-40-41 sayfalarına bir göz attım ama boot1 pinine rastlayamadım yanlışmı bakıyorum aceba?    GPIO pinlerinde herhangi biri BOOT1 yerine kullanılabiliyormuş.Sadece BOOT0 var pin olarak.
Boot1 pini resette bir kereligine okunan bir pin. Bu aslinda portun I/O pini. SystemInit rutininde bu pini konfiure edip sahiplenebilirsiniz.   Bizim cipimizde tek core var. Dolayisi ile ayni zamanda sadece tek komut isleyebilir. (Isin icine FPU komutlari girerse durum ne olur bilmiyorum)         
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

gambit1244

#33
arkadaşlarla eş zamanlı sormuşuz heralde tamamdır hocam teşekkürler
ben ders başlığını kilitli sanıyordum oyüzden orayı nadiren takip ediyordum artık daha dikkatli olacagım

rtos ile core duo yu karıştırmışım şimdi rtos nedir inceledim öğrendim teşekkürler..
mözkan87 hocam çok teşekkür ederim şu bolümde bir sorum olucaktı

Alıntı YapMesala program bir yere dallandı ve PC'nin değerini SP'ye kaydetti,

sadece program dallandığı zamanmı SP nin değerini bir arttırıp kaydediyor
zaten mantıklısıda bu sanırım zaten alt alta devam ettiğini bildigimiz birşeyi (eski PC nin bir fazlasını oldugunu bildigimiz halde neden hafızada yer kaplatalım değilmi?)

doğrumu anlamışım mantığını
sanırım öyle olmasaydı,  yazdığımız program hafızası kadar bir hafızada neyin nerden sonra nereye gittiğini kaydetmek için yer kaplardı
anlatabildimmi acaba
[email]tufan_ozbek@hotmail.com[/email] Yesterday is history. Tomorrow is a mystery. Today is a gift aslında bütün mesele bu.

taneryilmaz

Alıntı yapılan: bunalmis - 19 Ekim 2011, 00:05:42
Taneryilmaz ve Dombilik ders basliginda ayni sorulari sormuslar. Evet yazmayi unutmusum 44. sayfada boot1 pini yaziyor.      Boot1 pini resette bir kereligine okunan bir pin. Bu aslinda portun I/O pini. SystemInit rutininde bu pini konfiure edip sahiplenebilirsiniz.   Bizim cipimizde tek core var. Dolayisi ile ayni zamanda sadece tek komut isleyebilir. (Isin icine FPU komutlari girerse durum ne olur bilmiyorum)         

Sayın @bunalmış hocam bilğileriniz için teşekkür ederim. şimdi biz bu boot1 pinini yani PB2 yi SystemInit ile giriş çıkışları belirlemeden önce mi kullanabiliyoruz yoksa SystemInit ile tanımlayıncamı kullanabiliyoruz ?

sayment

"Hiç bir işlemci çift çekirdek olmadığı sürece aynı anda iki işlem yapamaz" demişsiniz.
FPGA lar paralel işlem yapabiliyor diye duymuştum. Onlar da mı çift çekirdek ?

mozkan87

FPGA 'ler farklı bir yapıya sahip adı üzerinde Field Programmable Gate Array (Alanda Programlanabilir Kapı Dizileri) Linki okumanızı önreririm.

mozkan87

Alıntı yapılan: gambit1244 - 19 Ekim 2011, 00:13:06
arkadaşlarla eş zamanlı sormuşuz heralde tamamdır hocam teşekkürler
ben ders başlığını kilitli sanıyordum oyüzden orayı nadiren takip ediyordum artık daha dikkatli olacagım

rtos ile core duo yu karıştırmışım şimdi rtos nedir inceledim öğrendim teşekkürler..
mözkan87 hocam çok teşekkür ederim şu bolümde bir sorum olucaktı

sadece program dallandığı zamanmı SP nin değerini bir arttırıp kaydediyor
zaten mantıklısıda bu sanırım zaten alt alta devam ettiğini bildigimiz birşeyi (eski PC nin bir fazlasını oldugunu bildigimiz halde neden hafızada yer kaplatalım değilmi?)

doğrumu anlamışım mantığını
sanırım öyle olmasaydı,  yazdığımız program hafızası kadar bir hafızada neyin nerden sonra nereye gittiğini kaydetmek için yer kaplardı
anlatabildimmi acaba

evet doğru anlamışsınız.

gambit1244

#38
teşekkür ederim mozkan87

bu arada arkadaşlar PDF ler artık bizim herşeyimiz kabul etmemiz lazım..
ve hepsi ingilizce..
ingilizce bilen bilmeyen herkezin ihtiyacı olan bir ilacım var!!

lingoes sözlük!!
bikaç ayar yaptıktan sonra pdf üzerinde çift tıklayıp ctrl+V yaptığınız kelimenin ingilizcesi kücük bir kutu halinde ekrana geliyor..
bircok sozlük pdf te yetersiz.. bu program bu konuda cok iyi geldi bana..
kesinlikle tavsiye ediyorum..
tamamen ücretsiz bir yazılım babylon'dan eksiği yok..
[email]tufan_ozbek@hotmail.com[/email] Yesterday is history. Tomorrow is a mystery. Today is a gift aslında bütün mesele bu.

z

Alıntı yapılan: taneryilmaz - 19 Ekim 2011, 00:18:11
...şimdi biz bu boot1 pinini yani PB2 yi SystemInit ile giriş çıkışları belirlemeden önce mi kullanabiliyoruz yoksa SystemInit ile tanımlayıncamı kullanabiliyoruz ?

Şu anda bunları konuşmaya gerek yok fakat madem sordunuz;

Boot1 pininin konumunu ARM donanımı bilmek istiyor. Reset anında bunu okuyor ve bir daha bu pine bakmıyor. Dolayısı ile biz SystemInit de Boot1 pinini (PB2) yi I/O ayarlayarak gerekiyorsa kullanabiliriz.

Tabiki bu pin resette konumu anlaşılabilsin diye L yada H'a en azından bir dirençle çekileceğinden bunun bizim amacımızla ters düşmemesi lazım. Eğer doğrudan jumper ile H yada L yapılır bir şema üzerinde çalışırsak bu pini daha sonra kendi amacımıza uygun kullanmamız mümkün olmaz.

Yani bu pinin kullanımında dikkatli olmak gerekiyor.


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

yamak

#40
Hocam şöyle bi deneme yaptım bendeki lpc1768 kitine ledleri  05 sn de bir söndüren bir program yazdım ve normal debug yaptım yani sümulatör değil sonrada adım adım sp nin değerini inceledim hiçbir değişiklik göremedim.hatta tam emin olmak için araya küçük bi toplama fonksiyonu ekledim.topla(x,y) gibi hani program başka bi fonksiyona dallandığında stack pointer ın artması gerektiğini düşündüğüm için. ama yine bi değişiklik olmadı.Hatta start up dosyasından stack hafızasını 0 a düşürdüm yine de program düzgün çalıştı.Daha sonra sd karta veri yazan bi program yazmıştım onu debeg edip denedim bu programda sp de program dallanırken artıp azalmalar izledim.Hatta programın düzgün çalışması için lpc1768 in start-up dosyasındaki stack hafızasının default değeri 0x200 byte ı 0x400 yapamam gerekti.Şimdi hocam programın boyutu çok küçük olduğunda ya da programda fazla dallanma olmadığında stack e ihtiyaç duyulmuyo mu?

mozkan87

Alıntı yapılan: yamak - 19 Ekim 2011, 02:49:20
Hocam şöyle bi deneme yaptım bendeki lpc1768 kitine ledleri  05 sn de bir söndüren bir program yazdım ve normal debug yaptım yani sümulatör değil sonrada adım adım sp nin değerini inceledim hiçbir değişiklik göremedim.hatta tam emin olmak için araya küçük bi toplama fonksiyonu ekledim.topla(x,y) gibi hani program başka bi fonksiyona dallandığında stack pointer ın artması gerektiğini düşündüğüm için. ama yine bi değişiklik olmadı.Hatta start up dosyasından stack hafızasını 0 a düşürdüm yine de program düzgün çalıştı.Daha sonra sd karta veri yazan bi program yazmıştım onu debeg edip denedim bu programda sp de program dallanırken artıp azalmalar izledim.Hatta programın düzgün çalışması için lpc1768 in start-up dosyasındaki stack hafızasının default değeri 0x200 byte ı 0x400 yapamam gerekti.Şimdi hocam programın boyutu çok küçük olduğunda ya da programda fazla dallanma olmadığında stack e ihtiyaç duyulmuyo mu?
Bu olay biraz da derleyici ile alakalı. Compiler ne derse o oluyor genelde. Compiler'ın optimizasyon seviyesi gibi değişkenlerinede bağlı. Ama assembly ile yazıyorsanız iki satırlık program için bile SP'de değişiklik yapabilirsiniz.

papsukkal

#42
Alıntı yapılan: yamak - 19 Ekim 2011, 02:49:20
Hocam şöyle bi deneme yaptım bendeki lpc1768 kitine ledleri  05 sn de bir söndüren bir program yazdım ve normal debug yaptım yani sümulatör değil sonrada adım adım sp nin değerini inceledim hiçbir değişiklik göremedim.hatta tam emin olmak için araya küçük bi toplama fonksiyonu ekledim.topla(x,y) gibi hani program başka bi fonksiyona dallandığında stack pointer ın artması gerektiğini düşündüğüm için. ama yine bi değişiklik olmadı.Hatta start up dosyasından stack hafızasını 0 a düşürdüm yine de program düzgün çalıştı.Daha sonra sd karta veri yazan bi program yazmıştım onu debeg edip denedim bu programda sp de program dallanırken artıp azalmalar izledim.Hatta programın düzgün çalışması için lpc1768 in start-up dosyasındaki stack hafızasının default değeri 0x200 byte ı 0x400 yapamam gerekti.Şimdi hocam programın boyutu çok küçük olduğunda ya da programda fazla dallanma olmadığında stack e ihtiyaç duyulmuyo mu?

SP işlemciye göre değişen boyuta sahiptir. bazı işlemciler aynı anda 8 adresi saklarken bazıları 32 adresi saklar.  (bizim işlemcimizde bu rakamın kaç olduğunu bilmiyorum henüz)

şöyle düşünelim

program çalımaya başladı ve bir dallanma komutu ile karşılaştı. o anki adresi 1256. sokak olsun. SP 1. satıra 1256 yazıldı, dallanma komutu işledi

dallanılan adresten işlemeye devam etti ve bir dallanma komutu daha var. SP 2. satıra o anki adres yazıldı ve ikinci dallanma komutu işlendi. örnek  2008. sokak

şimdi SP.1 de 1256, SP.2 de 2008 yazıyor.

mevcut dallanma ile gittiğimiz yerdeki işlemler bitti, önceki adreste işlememiz gereken komutlar var hala (aslında önceki ve bir daha önceki).

SP.2 ye baktık ve gitmemiz gereken yerin 2008 olduğunu gördük ve bu adrese gidip işlemlere devam ettik. buradaki fonksiyon da bitti, SP.1 e baktık adres nedir diye.

adres 1256 okuduk ve ilk bıraktığımız adrese geri dönüp buradan program koşturmaya devam ettik ....

iç içe SP boyutu kadar dallanmayı sıkıntısız (otomatik) yapabiliriz. bunu aşan kısımlarda yazılımda bizim (programcının) hafızaları takip etmemiz gerekiyor.

diye biliyorum.


edit: yazını tam okumamışım. bunu takip etmenin en garanti yolu basic teki GOSUB komutu olduğunu düşünüyorum.  yani normal fonksiyonlar ile değil de sanki senin dallanma komutu vermen gerek. yazdığın kod kısa olduğu için editör hex oluştururken dallandırmamış olabilir.

z

Alıntı yapılan: yamak - 19 Ekim 2011, 02:49:20
Hocam şöyle bi deneme yaptım bendeki lpc1768 kitine ledleri  05 sn de bir söndüren bir program yazdım ve normal debug yaptım yani sümulatör değil sonrada adım adım sp nin değerini inceledim hiçbir değişiklik göremedim.hatta tam emin olmak için araya küçük bi toplama fonksiyonu ekledim.topla(x,y) gibi hani program başka bi fonksiyona dallandığında stack pointer ın artması gerektiğini düşündüğüm için. ama yine bi değişiklik olmadı.Hatta start up dosyasından stack hafızasını 0 a düşürdüm yine de program düzgün çalıştı.Daha sonra sd karta veri yazan bi program yazmıştım onu debeg edip denedim bu programda sp de program dallanırken artıp azalmalar izledim.Hatta programın düzgün çalışması için lpc1768 in start-up dosyasındaki stack hafızasının default değeri 0x200 byte ı 0x400 yapamam gerekti.Şimdi hocam programın boyutu çok küçük olduğunda ya da programda fazla dallanma olmadığında stack e ihtiyaç duyulmuyo mu?

ARM işlemcilerde fonksiyon çağrılırken stack kullanımı diğer işlemcilerden bayağı bir farklı.

Fonksiyon çağrıldığında geri dönüş adresi stağa atılmaz. LR registerine atılır. Eğer Fonksiyon içinde fonksiyon çağrımı olacaksa LR değeri bizim inisiyatifimizle stağa atılır. Sen tek fonksiyon call ettiğin için Stack registerde değişim görmüyorsundur.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

yamak

Alıntı YapARM işlemcilerde fonksiyon çağrılırken stack kullanımı diğer işlemcilerden bayağı bir farklı.
Fonksiyon çağrıldığında geri dönüş adresi stağa atılmaz. LR registerine atılır. Eğer Fonksiyon içinde fonksiyon çağrımı olacaksa LR değeri bizim inisiyatifimizle stağa atılır. Sen tek fonksiyon call ettiğin için Stack registerde değişim görmüyorsundur.

Hocam ben de tam LR register ı ne işe yarıyo diye soracaktım.Evet söylediğiniz gibi oluyo kısa programlardaki dallanmalarda Sadece LR register ında değişim oluyo.Ama uzun programlar da SP'de de değişim oluyo.Ama merak ettiğim şey neden böyle bişey yapılmaya ihtiyaç duyulmuş Sadece sp kullanılsa da olmuyo muydu?