C kodunu çapraz araç zincirimle derlediğimde, bağlayıcı, çalıştırılabilir dosyamın sabit kayan değerler kullandığını, ancak libc'min yumuşak kaymalar kullandığını söyleyen uyarı sayfaları yazdırır. Fark ne?
C kodunu çapraz araç zincirimle derlediğimde, bağlayıcı, çalıştırılabilir dosyamın sabit kayan değerler kullandığını, ancak libc'min yumuşak kaymalar kullandığını söyleyen uyarı sayfaları yazdırır. Fark ne?
Yanıtlar:
Sert yüzer bir çip üzerinde kayan nokta birimi kullanır. Yumuşak yüzer, yazılımdaki birini taklit eder. Aradaki fark hızdır. Her ikisinin de aynı hedef mimaride kullanıldığını görmek garip çünkü çipin bir FPU'su var ya da yok. -Msoft-float ile GCC'de yumuşak kayan noktayı etkinleştirebilirsiniz. Eğer kullanıyorsanız, donanım kayan noktasını kullanmak için libc'nizi yeniden derlemek isteyebilirsiniz.
Kayan nokta aritmetiği yapmanın üç yolu vardır:
Açıkçası, tüm bu cevaplar bana yanlış geliyor.
C kodunu çapraz araç zincirimle derlediğimde, bağlayıcı, çalıştırılabilir dosyamın sabit kayan değerler kullandığını, ancak libc'min yumuşak kaymalar kullandığını söyleyen uyarı sayfaları yazdırır. Fark ne?
Debian wiki VFP için üç seçenek dair bilgi -mfloat-abi
,
soft
- bu saf bir yazılımdırsoftfp
- bu bir donanım FPU'sunu destekler, ancak ABI yazılımla uyumludur.hard
- ABI kayan veya VFP kayıtları kullanır .Bağlayıcı (yükleyici) hatası, kayan nokta değerlerini tamsayı yazmaçlarında geçirecek bir paylaşılan kitaplığınızın olmasıdır. Hala kodunuzu a -mfpu=vfp
, vb -mfloat-abi=softfp
. İle derleyebilirsiniz , ancak kullanmalısınız, böylece libc bir float'a ihtiyaç duyarsa, kütüphanenin anlayacağı şekilde iletilir.
Linux çekirdeği, VFP talimatlarının öykünmesini destekleyebilir. Açıkçası, -mfpu=none
bu durum için derlemeniz ve herhangi bir Linux çekirdek öykünmesine güvenmek yerine derlemenin doğrudan kod üretmesini sağlamanız daha iyi . Ancak, OP'nin hatasının aslında bu konuyla ilgili olduğuna inanmıyorum. Ayrıdır ve ayrıca ile birlikte ele alınmalıdır -mfloat-abi
.
Armv5 CPU ile paylaşılan Armv5 kütüphanesi bunun tam tersidir; libc sert şamandıra oldu ama uygulama yalnızca idi yumuşak . Sorunu aşmanın bazı yolları vardır, ancak doğru seçeneklerle yeniden derlemek her zaman en kolayıdır.
Diğer bir sorun da, Linux çekirdeğinin, bir bağlam anahtarındaki kayıtları kaydetmek / geri yüklemek için VFP görevlerini (veya mevcut ARM kayan noktasını) desteklemesi gerektiğidir.
Görünüşe göre libc'niz yazılım kayan nokta işlemleri için oluşturulmuş gibi görünürken, exe'niz kayan nokta için donanım desteği varsayılarak derlenmiştir. Kısa vadede, yumuşak yüzerleri bir derleyici bayrağı olarak zorlayabilirsiniz. (gcc kullanıyorsanız, bunun -msoft-float olduğunu düşünüyorum)
Daha uzun vadede, hedefinizin işlemcisi kayan nokta işlemleri için donanım desteğine sahipse, genellikle hız için donanım kayması etkinleştirilmiş bir çapraz araç zinciri oluşturmak veya bulmak istersiniz. Bazı işlemci ailelerinin, bazıları donanım desteği olan ve bazıları olmayan model varyantları vardır. Bu nedenle, örneğin, sadece işlemcinizin bir ARM olduğunu söylemek, donanım kayan nokta desteğiniz olup olmadığını bilmek için yetersizdir.
Hesaplama, kayan nokta donanımı ile veya tamsayı aritmetiğine dayalı yazılımla yapılabilir.
Bunu donanımda yapmak çok daha hızlıdır, ancak çoğu mikro denetleyicinin kayan nokta donanımı yoktur. Bu durumda, kayan noktayı kullanmaktan kaçınabilirsiniz (genellikle en iyi seçenek) veya C kütüphanesinin bir parçası olacak yazılımdaki bir uygulamaya güvenebilirsiniz.
Bazı denetleyici ailelerinde, örneğin ARM, kayan nokta donanımı ailenin bazı modellerinde bulunur, ancak diğerlerinde yoktur, bu nedenle bu aileler için gcc her ikisini de destekler. Görünüşe göre sorunun, iki seçeneği karıştırmışsın.