C'de @ ile değişken bildirim


11

Bazı C kodu okuyorum ve programda bu beyanı rastladı:

unsigned char serv_ctr @0x0002;

Birisi beni belgelere yönlendirebilir veya Mplab XC8 v1.35 C derleyicisindeki "@ 0x0002 " ne için olduğunu açıklayabilir mi?


14
Değişken belirli bir adrese yerleştirmek için bir derleyici uzantısı olduğunu tahmin ediyorum.
Eugene Sh.

2
o zaman soru #mplab etiketine fayda sağlayabilir, çünkü bu Mplab'a özgüdür.
sylvainulg

Sadece almak için: Bu konu bu sitede mi? Bunun SO'ya ait olduğunu düşünürdüm. Veya burada mikro denetleyici programlaması istemek uygun mu? Bu, bu soruların nerede olması gerektiğini biraz netleştirecektir.
Güle güle SE

6
@KamiKaze Burada hangi konular hakkında soru sorabilirim? "çıplak metal veya RTOS uygulamaları için bellenim yazımı" konusunu ve "PC için yazılım programlama" konusunu listeler. Bu, gömülü sistem programlamasıyla ilgili gibi göründüğünden, bir bakışta konuya görünecektir. O diye de Yığın taşması konu üzerinde yaptığı değil kendisi tarafından burada konu dışı yapmak.
CVn

@KamiKaze sorduğunuz için teşekkürler, benzer sorularım vardı (bu SE'nin düzenli bir kullanıcısı değilim)
GPPK

Yanıtlar:


20

Bu, değişkenin yerleştirileceği mutlak bir adres belirtmektir.
Gönderen XC8 derleyici manuel sayfa 27, Mutlak adresleme 2.5.2 bölüm :

Değişkenler ve fonksiyonlar __at()yapı kullanılarak mutlak bir adrese yerleştirilebilir
......
2.5.2.2 FARKLAR
8-bit derleyiciler mutlak bir adres belirtmek için bir @ sembolü kullanmışlardır.


6

@belirli bir adreste bir değişkeni bildirmenize olanak tanıyan C dilinin standart olmayan yaygın bir uzantısıdır. Bellek eşlemeli donanım kayıtları vb. İçin kullanılabilir. Bu durumda değişkenin de bildirilmesi gerekir volatile, bu nedenle örneğiniz yanlıştır.

Diğer derleyiciler gibi bir şey kullanmak __attribute__(section...veya #pragma ...bu standart dışı C bütün

Takım zincirlerinin bunu yapmasının tek mantıklı nedeni (varsa) boktan hata ayıklayıcılarda kayıt hata ayıklamayı etkinleştirmektir. Standart olmayan sözdizimi, kaydın bağlayıcı çıktısı ve hata ayıklama bilgisinin bir parçası olmasını sağlar. Hangi sırayla herhangi bir değişkeni izleyebilirsiniz gibi crappy hata ayıklayıcıda kayıt izlemenizi sağlar.

İyi bir hata ayıklayıcı varsa, özel MCU'nuz için destek ve farkındalığa sahip olacaktır. O zaman C kodunda standart olmayan boklara ihtiyacınız yoktur, ancak bunun yerine saf, taşınabilir standart C yazabilirsiniz:

#define serv_ctr ( *(volatile uint8_t*)0x0002u )

1
Derleyicilerin ikinci formu kabul etmeleri gerekmekle birlikte, uygulamaların sayıları uygun gördükleri şekilde adreslerle eşleştirmelerine izin verilir. Ayrıca, gördüğüm çoğu derleyici, @gösterimi kullanarak bildirilen çoğu şeyin @uzantılar olmadan yapılabilecek her şeyden farklı davranması için çoklu bellek boşluklarına veya başka sorunlara sahip gösterim hedef platformları kullanır .
supercat

1

Kısa bir uzantı:

Bu artık xc8 2.0 ve sonraki sürümlerden beri çalışmıyor. Şimdi yazmak zorundaydınız:

unsigned char serv_ctr __at(0x0002);

serv_ctrmutlak bir adrese ( 0x0002) bir değişken ( ) koymak için .

XC8 2.0 ile @, derleyici ayarlarını "C90" biçimini kullanacak şekilde ayarlarsanız, eski kodunuzu sözdizimi kullanarak derlemek mümkündür . Ayar şöyle görünür, "XC8 Global Options" altındadır ve "C standardı" olarak adlandırılır.


Diğer birçok gömülü sistem derleyicisi @sözdizimini de destekliyor, sadece Mplab değil.
Lundin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.