2016-06-14 26 views
6

Bir hata ayıklama oturumu sırasında, avr-gcc ile kod yazılırken snprintf beklendiği gibi çalışmıyor. Örnek kod, kayan nokta değerini 3999.9f'yi karakter gösterimlerine dönüştürmelidir. Burada snprintf avr-gcc ile beklendiği gibi çalışma değil

bir minimum test durumdur:

int TestSnprintf(void) 
    { 
     const float inputValue = 3999.9f; 
     /* Print with a fixed width of 6 characters (5 numbers and 1 dot). 
     The buffer must have a length of 7, because snprintf appends a '\0' at the end. */ 
     char buf[7U] = {0, 0, 0, 0, 0, 0, 0}; 
     const uint8_t bufferSize = 7U; 
     if(6 != snprintf(buf, bufferSize, "%06.1f", inputValue)) 
     { 
      return -1; 
     } 
     if(buf[0] != '3' 
      || buf[1] != '9' 
      || buf[2] != '9' 
      || buf[3] != '9' 
      || buf[4] != '.' 
      || buf[5] != '9' 
      || buf[6] != '\0') 
     { 
      return -2; 
     } 

     return 0; 
    } 

    int main(void) 
    { 
    int retVal = TestSnprintf(); 
    return 0; 
    } 

avr-gcc bu kod örneği compling ve Atmel Studio 7 ile çalışan -2 bir dönüş değeri verir. Bu snprintf çalışmıyor demektir.

Şimdiye kadar denenmiş ne varsa?

  • Ben 32 ve 64 Linux üzerinde kod test edilmiş ve bunun beklendiği gibi (0 değerini döndürür TestSnprintf) çalışır.
  • Kodu Visual Studio 2015 ile test ettim ve beklendiği gibi çalıştım (TestSnprintf 0 değerini döndür).
  • tampon tamponundan içeriği test JTAG arayüzü kullanılarak cihazda gerçekleştirilir

    buf[0] = 32;  
    buf[1] = 32;  
    buf[2] = 32;  
    buf[3] = 32;  
    buf[4] = 32;  
    buf[5] = 63;  
    buf[6] = 0; 
    
  • olup. Aynı sonucu ile simülatörü de denedim.

  • Hiçbir derleyici optimizasyonu etkin değil. Kod -O0 ile derlenmiş ve hata ayıklanmıştır. Burada

dönüş değeri -2 olduğunu göstermektedir bir hata giderme oturumunun bir ekran görüntüsü vardır.

enter image description here

Bu hata ayıklama sırasında dar olduğundan tampon göstermektedir: enter image description here

Soru ben yanlış yapıyorum

? Her şeyden

İlk yardımın için çok teşekkür ediyorum

ÇÖZÜM! olarak aşağıdaki bağlayıcı seçenekleri eksik @manilo tarafından işaret: printf() (ve arkadaşları) üç değişik uygulamalar vardır

-Wl,-u,vfprintf -lprintf_flt -lm 
+0

Ve C standart kitaplığı gcc! Hangi kütüphaneyi kullanıyorsunuz? – Olaf

+0

Gerçekte ne 'buf' içerdiğini öğrenmelisiniz. –

+1

'libm' ile bağlantılı mı oldunuz? ('-lm') – fukanchik

cevap

9

. Varsayılan, float çıkışını uygulamıyor.

snprintflibprintf_flt.a (-lprintf_flt) ve libm.a (-lm) bağlamadan çalışmaz. Ayrıca, belgelere göre, -Wl,-u,vfprintf numaralı bağlantı seçeneklerini (ör. http://winavr.scienceprog.com/avr-gcc-tutorial/using-sprintf-function-for-float-numbers-in-avr-gcc.html) eklemeniz gerekir.

bağlayıcı bayrakların sırası önemlidir: -Wl,-u,vfprintf -lprintf_flt -lm

+0

@manilo Çok teşekkürler, bu bayrakları ekledim. – orbitcowboy

-1

"Ayrıca varsayılan olarak Arduino IDE) (xxprintf içinde rutinleri kayan nokta desteklemek için AVR bağlayıcı seçeneklerini ayarlamak unutmayın oldukça kaydederken Yani. AVR üzerinde bir miktar kod boşluğu, printf() işlevlerinin AVR'de kayan nokta çıkışı için kullanılamayacağı anlamına gelir. Yüzer destek, diğer işlemciler için varsayılan olarak dahil edilir. " http://playground.arduino.cc/Main/Printf

+0

Atmel Studio'yu Arduino IDE kullanmıyorum. – orbitcowboy

İlgili konular