2013-07-31 5 views
5

avr-gcc kullanarak, RAM'i kaydetmek için Program Belleği'nde veri depolamak mümkündür. Bu PROGMEM attribute kullanılarak tamamlandı. AVR-libc ayrıca, tam dizelerle kullanılabilecek bir makro, PSTR() sağlar. Bu satırlardan herhangi birinin derleme başarısız olurken PSTR() on __FUNCTION__

Şimdi, şu kod beklendiği çalışmaları olarak __func__, __FUNCTION__ or __PRETTY_FUNCTION__.

ile PSTR() kullanmak

display.message(__func__, 2); 
display.message(__FUNCTION__, 2); 
display.message(__PRETTY_FUNCTION__, 2); 

çalışıyorum

display.messageP(PSTR(__func__), 2); 
display.messageP(PSTR(__FUNCTION__), 2); 
display.messageP(PSTR(__PRETTY_FUNCTION__), 2); 

aşağıdaki hata ile:

derleme olarak, bu makroları genel bir şey değil

# define PSTR(s) (__extension__({static char __c[] PROGMEM = (s); &__c[0];})) 

ve iyi çalışır:

PSTR tanımı, WinAVR dan/avr/include/avr, hata iletisinde başvurulan değişken açıklıyor

display.messageP(PSTR(__FILE__), 2); 

Bu hatanın nedenine dair herhangi bir fikir ve program belleğine işlev adı eklemek için PSTR() kullanılması mümkün mü?

+0

Bu dizeler, özel işlevlere ihtiyaç duydukça o alana yerleştirilemez. onlara erişmek için. Gerçekte, bu isimler oldukça dar küçük olmalı, bu yüzden zaten onları orada taşımak için gerçek bir avantaj olup olmadığını merak ediyorum. Bunu, sahip olduğunuz gerçek RAM miktarını bilmeden söylüyorum. –

+0

@MichaelDorgan avr-libc, program belleğindeki değişkene erişmek için işlevler sağlar; Bu, sorudaki son kod satırı ile teyit edilir, bu iyi çalışır. Bu dizelerin küçük olduklarına katılıyorum, ancak gömülü sistemlerde (sadece birkaç Kbyte RAM ile) önemli. – mMontu

cevap

8

__func__, __FUNCTION__ ve __PRETTY_FUNCTION____FILE__ gibi, dize hazır değil, ancak onları kullandığınız fonksiyona statik yerel karakter dizisi değişkenleri gibi oluşturulur. Yani, PSTR() makrosu, başka bir dizi değişkenini başlatmak için bir dizi değişkeni kullanamadığınız için başarısız olur.

__func__ § 6.4.2.2 ¶ 1, C11 açıklanmıştır:

The identifier __func__ shall be implicitly declared by the translator as if, immediately following the opening brace of each function definition, the declaration

static const char __func__[] = "function-name";
appeared, where function-name is the name of the lexically-enclosing function.

According to the GCC manual, __FUNCTION__ ve __PRETTY_FUNCTION__ C __func__ sadece eş anlamlı (__PRETTY_FUNCTION__ C daha ayrıntılı bir ++) vardır.

+0

__func__ program belleğine ulaşmanın bir yolu var mı? Varsayılan olarak tanım, RAM'e yerleştirir. Açıkçası insanlar statik hata ayıklama verileri üzerinde RAM harcamamak istemiyorlar. –

+0

Soru AVR platformunu ima eden avr-gcc hakkındaydı. İki bellek alanı olan Harvard mimarisidir. Program hafızası cihazın salt hafızasıdır, normalde salt okunurdur. Cihazlar sadece sınırlı RAM'e sahip olduğundan (16k sınırda, genellikle 2-4k), bunu hata ayıklama dizeleriyle doldurmak istemezsiniz. –

+0

@MoJo: Teşekkürler, açıklama için. Bu gereksiniminiz varsa, duruma göre kendi değişkenlerinizi bildirmeniz gerekecek gibi görünüyor ya da '__func__' değişkeni için bellek hedefini belirtmenize izin vermek için derleyiciyi genişletmek zorundasınız. – jxh