Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

Adres hakkında

Başlatan bunalmis, 10 Kasım 2011, 12:59:16

z

Değişkenler, ramın başından sonuna doğru, Stack ise Ramın sonlarından (duruma göre ortalarından) başa doğru ilerliyor.

Projemde stack alanını ön tarada kaydırmam gerekiyor. Ancak bu kaydırma sonucunda stack ile, ramda tanımlı değişkenlerden en sondakilerinin örtüşme (çarpışma) sorunu oluşabilir.

Bu sorunu yaşamamak için yazılımın, en geride tanımlanmış değişkenin adresini otomatik olarak öğrenmesini ve buna göre stack adresini belirlemek istiyorum.

C'de bununla ilgili bir komut varmı?

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

CoşkuN

Stack alanının yerini değiştirmek neden gerekiyor?

z

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

mufitsozen

Alıntı yapılan: bunalmis - 10 Kasım 2011, 13:35:11
https://www.picproje.org/index.php?topic=35654.msg259298#msg259298 linkinde bahsettiğim çalışmamda gerekiyor.

@bunalmis hocam bu uygulamanizin neden boyle bir degisiklik gerektirdigini daha ayrintili aciklayabilirmisiniz? Bahsi gecen calisma oldukca yalin/kolay bir uygulama standard disi bir gereksinim nereden kaynaklaniyor?

bu arada kullandiginiz toolar nasil bir surec kullaniyor bilemiyorum ama sorunuza cevap olabilecek bir yontem su olabilir: Linker'in map listinginde hafizadaki logical gruplasmalari ve bunlarin boyutlarini gorebilirsiniz, MCUya yuklenecek imaji yaparken (locator toolu) girdi dosyalarinini yazacaginiz kucuk bir script ile bu map dosyasindan alacaginiz bilgiler ile otomatik olarak siz yaratabilirsiniz. (yada locator tool cagrilirken parametreleri dinamik olarak siz verirsiniz)

Ben yinede affiniza siginarak boyle bir degisikligin gerekli olmamasi gerektigini dusunuyorum, ama yaniliyorda olabilirim.

Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

z

#4
Keil'de program yazmaya başladığımızda ortam tek bir task ile çalışacağımızı varsayıyor.

Örnek uygulamada ise istediğimiz kadar task oluşturabiliyoruz. Bunun için herbir taska ayrı bir stack alanı açmak gerekiyor.
Bu alanların herbirinin uzunluğunu kullanıcı belirliyor.

Bu durumda taskların toplam stack ihtiyacı mevcut stak sınırını aşarsa, bahsettiğim çakışma oluşacağından kazalar oluşur.

Bu nedenle kullanıcıya kardeşim stak alanım yeterli değil, git startup dosyasından stack alanını genişlet mesajı vermek istiyorum.

Önerdiğiniz çözüme girmek istemiyorum.  Çünkü kernel basit bir C dosyası olsun bunu da ekstra uğraş gerekmeden klasik usullerle derle kurtul istiyorum.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mufitsozen

Alıntı yapılan: bunalmis - 10 Kasım 2011, 14:05:54
Keil'de program yazmaya başladığımızda ortam tek bir task ile çalışacağımızı varsayıyor.

Örnek uygulamada ise istediğimiz kadar task oluşturabiliyoruz. Bunun için herbir taska ayrı bir stack alanı açmak gerekiyor.
Bu alanların herbirinin uzunluğunu kullanıcı belirliyor.

Bu durumda taskların toplam stack ihtiyacı mevcut stak sınırını aşarsa, bahsettiğim çakışma oluşacağından kazalar oluşur.

Bu nedenle kullanıcıya kardeşim stak alanım yeterli değil, git startup dosyasından stack alanını genişlet mesajı vermek istiyorum.

Önerdiğiniz çözüme girmek istemiyorum.  Çünkü kernel basit bir C dosyası olsun bunu da ekstra uğraş gerekmeden klasik usullerle derle kurtul istiyorum.

@bunalmis hocam iste bunun icin RTOs yaziliyor, task switching sirasinda stack alanlari (ve baska bir cok context bilgisi switch ediliyor) bu arada eger stack overflow tipi hatalar olursa bunuda yazacaginiz RTOS yakalayip gerekeni yapmak zorunda vs.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

z

İşletim esnasında stack overflow oldu demek yerine stack overflow olacak stack alanını şimdiden genişletin demek istiyorum.
Eğer işletim esnasında stack overflow olursa bunu da ayrıca ele alırız.

Yazılan kodun hangi işlemci için derlendiği, bu işlemcinin ram ve rom boyutuna ilişkin bilgiler Keil'de zaten mevcut olduğu için, talep edildiğinde Keil'in bunları C deki programa parametre olarak verebileceğini düşünüyorum. Bu yüzden böyle bir soru sordum.

Mesela recursive bir kod yazacaksınız. Bu kodun mevcut ortamda koşturulması durumunda stack overflow olup olmayacağını daha main fonskiyonunun ilk satırlarında bilmek istemezmisiniz?

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

mufitsozen

Alıntı yapılan: bunalmis - 10 Kasım 2011, 14:33:56
İşletim esnasında stack overflow oldu demek yerine stack overflow olacak stack alanını şimdiden genişletin demek istiyorum.
Gomulu bir sistemde herhangi bir taskin sistem initilization sirasinda stack overflow edecek diye bir uyari almasinin hicbir anlami yoktur, cunki hangi task ne kadar stack kullanacak bun tip bilgiler tsistem tasarimi sirasinda karar verilir. Uyariyi alan task bu uyari ile ne yapacak? konsola mesaj yazip (mesela) CNC operatorune "Stack overflow edecek, onlem alin!" diye mesajmi verecek, operator bu mesaji alinca ne yapacak (buyuk ihtimalle reset!)


Alıntı yapılan: bunalmis - 10 Kasım 2011, 14:33:56
Mesela recursive bir kod yazacaksınız. Bu kodun mevcut ortamda koşturulması durumunda stack overflow olup olmayacağını daha main fonskiyonunun ilk satırlarında bilmek istemezmisiniz?

affiniz siginarak benim profesyonel tecrubeme gore main programda daha sonra kosacak herhangi bir recursive fonksiyonun ne zaman/nasil stack overflow edecegini kestirmek cok kolay degildir. Isterseniz bir factorial routine ile bunu bir deneyiniz. Ayrica yukarda belirttigim husus buradada gecerli, stack overflow olacagini anlasam gomulu bir sistem icindeki bir task icinden ne yapabilirim? Tasklar icin yazilan kodun bu tip cevresel ve OS ile iliskili detaylari bilmesi information hiding, cohesion, coupling vb bircok yazilim prensibine de aykiridir,
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

z

Alıntı yapılan: mufitsozen - 10 Kasım 2011, 15:04:54
Gomulu bir sistemde herhangi bir taskin sistem initilization sirasinda stack overflow edecek diye bir uyari almasinin hicbir anlami yoktur, cunki hangi task ne kadar stack kullanacak bun tip bilgiler tsistem tasarimi sirasinda karar verilir. Uyariyi alan task bu uyari ile ne yapacak? konsola mesaj yazip (mesela) CNC operatorune "Stack overflow edecek, onlem alin!" diye mesajmi verecek, operator bu mesaji alinca ne yapacak (buyuk ihtimalle reset!)

Şimdi neyi tartıştığımızda hemfikir olalim. Şu anda RTOS çekirdeği ve bu çekirdeği kullanacak test amaçlı taskları yazıyorum. Eğer derlenen program, bırakın sahada çalıştırmayı, daha debug modunda stack overflow olacak diyorsa bu çok ama çok iyi bir şey. Hemen kodlarda stackla ilgili düzenlemeleri yaparım.

Yapmak istediğim basit bir ön kontrol sadece. Kontrolun amacı gayet açık, Mevcut stack alanım, taskların init aşamasında talep ettikleri stack alanlarını karşılıyormu karşılamıyormu? Hepsi bu.

Mevcut RTOS'larda bu kontrol nasıl yapılıyor bilmiyorum. Ben kendi kurallarıma göre kendi kernelimi yazıyorum.

Alıntı Yap
...affiniz siginarak benim profesyonel tecrubeme gore main programda daha sonra kosacak herhangi bir recursive fonksiyonun ne zaman/nasil stack overflow edecegini kestirmek cok kolay değildir. Isterseniz bir factorial routine ile bunu bir deneyiniz. Ayrica yukarda belirttigim husus buradada gecerli, stack overflow olacagini anlasam gomulu bir sistem icindeki bir task icinden ne yapabilirim? Tasklar icin yazilan kodun bu tip cevresel ve OS ile iliskili detaylari bilmesi information hiding, cohesion, coupling vb bircok yazilim prensibine de aykiridir,

İhtiyaç duyulacak stack alanının boyunu, faktöriyeli alınacak sayı cinsinden byte'ı byte'ına formülize edebilirim. Bunun için C kodların altındaki asm kodlara bakmam ve kağıt üzerinde modelleme yapıp üzerinde çalışmam yeterli. 

Sizler profesyonel yazılımcılarsınız ve sıkı sıkıya kurallara uymak zorundasınız. Bense elimdeki STM32F-Discovery kartında koşturmak üzere RTOS nasıl yazılır sorusuna kendince cevap arayan bir amatörüm ve bahsettiğiniz yazılım prensiplerinin hiçbiri beni zorlayamaz, asla kural tanımam.

Eğer bu amaca anlayış gösterirseniz aslında ilk baştaki sorumun son derece normal olması gerekir.

Neyse bu konuya kısa bir ara verelim ve STM32 startup kodunda stack neden RAM'ın ortalarında bir yerden başlatılmış fikriniz varmı?
Ben olsam Stackı ramın en sonundan başlatırdım.

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