STM32 RAM'de kod koşturmak

Başlatan e-zeki, 23 Ekim 2019, 17:25:27

OptimusPrime

@e-zeki
Calisiyor mu bu kod  :) Bi gariplik var gibi  :du:

- FUNC_SIZE in 64 oldugunu nereden biliyorsun?
- Ya Buffer ile TestFunc ayni alignment ozelligine sahip degilse?
- Ya Buffer icin ayrilan alani derleyici baska bir degisken veya degiskenler icin kullanirsa?
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

e-zeki

Alıntı yapılan: OptimusPrime - 07 Kasım 2019, 18:16:02@e-zeki
Calisiyor mu bu kod  :) Bi gariplik var gibi  :du:

- FUNC_SIZE in 64 oldugunu nereden biliyorsun?
- Ya Buffer ile TestFunc ayni alignment ozelligine sahip degilse?
- Ya Buffer icin ayrilan alani derleyici baska bir degisken veya degiskenler icin kullanirsa?
@OptimusPrime Hocam çok geç gördüm. korkunç hatalardan bahsediyorsunuz  :o
Keil için konuşuyorum:
- FUNC_SIZE belirlerken derleyicinin oluşturduğu htm uzantılı "Static Call Graph for image ...axf" dosyasından fonksiyonun (eğer herhangi bir yere dallanmıyorsa) boyutunu görebiliyorsunuz buna göre belirlenebiliyor.
- Alignment değişme ihtimalini hiç düşünmedim bile.  :du:
- Buffer local olduğu için stack'de tutuluyor. Scope'tan çıktığı an dediğinizin olma ihtimali yüksek (benim durumumda hiç olmadı) :-\  :'(

O zaman ben soruyorum:
- Buffer'ı new ya da malloc'la heap'e taşısam olası bir 3. durumun önüne geçmiş olur muyum?
- fonksiyon ve değişken adreslemelerinde aligment farklılığı olan bir durum örnek verebilir misiniz?

OptimusPrime

Derleyicinin sagi solu belli olmaz.  :D

Soyle bir arastirdim da keil de __ramfunc diye bir anahtar kelime yok sanki. Kullanma klavuzunda bu konu geciyormu bilemiyorum, bakmak lazim.

Yurutulen mantik dogru, eger fonksiyon icerisinde flasha dallanma yoksa bellekte bir yer ayrilarak fonksiyon ram e tasinabilir. Bu durumda fonksiyonun ne kadar yer kapladigini gormek icin derleyicinin urettigi dosyalardan faydalanilabilir. Sonrasinda fonksiyon isaretcisiyle ram da calisma saglanir. Fakat dedigim gibi 2 kritik nokta var. Ilki foksiyonun kullanilmayan bir bellek bolgesinde olmasi gerekiyor ki malloc veya linker bu isi cozebilir. Bu arada malloc un da alligned bir adres dondurmesi garanti degildir! Ikincisi ise, yine ayni yere geliyoruz ama, bu adresin allign olmasi gerekir (__attribute__ aligned vb)
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

yldzelektronik

#18
Beyler sakin. Keil ve diğer bir çok geliştirme ortamı bunlar için hazır çözümler sunuyor.

Keil da aynı ram alanını hem değişkenlere hem de fonksiyona ayırmak için linker dosyasına bazı tanımlar yaparak bu işi çözebiliyorsunuz.

Daha kolay yolu da var. Koşturmak istediğiniz kodu tek bir dosyada toplayın, başka yerlere dallanmadığına (istenmeyen adreslere) emin olun, sonra o dosyaya proje ağacından sağ tıklayarak "Options For Target" seçin. Oradan istediğiniz adres tanımlarını yapın.

Sonra scatter dosyasına ramde koşacak dosyanın adıyla yeni alan tanıtın.

Hayırlı olsun. Artık o kodlar istediğiniz adreste. Şuanda bunları denemiş birisi olarak yazıyorum.

Normalde program qspi flash üzerinde çalışıyor. Güncelleme sırasında flasha yazma yapmam lazım. Bunun için Memory Mapped Enable modu kapamam gerekiyor. Bu durumda kodlar ramde çalışıyor. Yazma işi bitince yeniden açıyorum modu.

Sonra 16 MB flash içinde geziyorum. Dahili hafıza ile işim kalmıyor.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

e-zeki

@yldzelektronik  hocam sizin
Alıntı yapılan: yldzelektronik - 14 Kasım 2019, 14:38:07"Options For Target" seçin. Oradan istediğiniz adres tanımlarını yapın.
dediğiniz şekilde yaptığımda derleyici kodun o bloğunu kod koşmaya başlamadan önce ram'e taşıyor. Yani ayda yılda bir kullanacağım bir kısım için ram hacmimi otomatikman düşürmüş oluyorum. fonksiyonu kullansamda kullanmasam da ramde yer kaplıyor. Benim öyle bir lüksüm olmadığı için bu şekilde yaptım.

@OptimusPrime __ramfunc bu keyword baya uzun zaman önce kaldırılmış sanırım hocam. Options For Target döneminden önce bu şekilde kullanılıyormuş büyük ihtimalle ama zaten yine dediğim gibi kodu ram'a başlangıçta taşımak için kullanılan bir yöntem bu. ben ihtiyacım varsa taşımak istediğim için bu yolu seçtim.

OptimusPrime

@e-zeki
 ;) Mantikli. Yanliz bir alan ayirip malloc ile daha sonra free ile serbest birakilmasinda fayda var.

@yldzelektronik
Sakiniz zaten.  8-)
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||