2016-04-07 38 views
1

Mikrodenetleyici mimarisinde: SRAM bellek bölümleri için: , başlatılmamış Küresel değişkenin SRAM'nin .bss bölümünde ayrıldığını biliyorum (ve başlatılanlar .data segmentine ayrılır).Global değişkenler .bss'den .data segmentine mi seyahat ediyor?

Yani, Soru: Programın Çalışma zamanı sırasında bir Global değişkeninin değerini güncellerken,
Küresel değişken .bss'den .data segmentine mi geçiyor?

cevap

4

Hayır. Değişkenin yeri derleyici tarafından belirlenir. Genel (ve statik) değişkenlere yapılan tüm referansların doğru konuma işaret ettiğinden emin olur.

İki bölümün olmasının nedeni, C çalışma zamanı tarafından, programın derleyici tarafından eklenen ve kodunuza atlamadan önce çalışan kodun bir bölümü tarafından farklı şekilde ele alınmasıdır.

Başlatılan değişkenler, veri bölümünde yer almaktadır. C çalışma zamanı, bu değişkenler için program kod alanı sonundan SRAM'ye değerleri kopyalayan bir işlevi vardır. Bunlar çoğunlukla RAM'in tepesinde.

Başlatılmamış değişkenler, program kodunda böyle değerlere ihtiyaç duymaz. Bunun yerine, C çalışma zamanı, tüm bu değişkenleri 0 olarak başlatan bir işlevi çalıştırır. (Bazı C çalışma zamanları bunu bile yapmaz. Bu çalışma zamanları için, programınız başladığında, değişken zaten SRAM'de olan herhangi bir değere sahip olacaktır.) Bu değişkenler genellikle Başlangıç ​​değişkenlerinden sonra RAM'i doğrudan işgal eder.

RAM'in sonu yığındır ve yığın başlatılmamış globals'tan sonra başlar. Çoğu zaman, bunların birbirinin üzerine yazılmasını önlemek için bir mekanizma yoktur. Bu ünlü "Stack Overflow".

İlgili konular