2016-04-07 42 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".