Mikrodenetleyicilerde sabit nokta aritmetiği


12

Genellikle robotlarımızda bir şeyler yapmak için mikrodenetleyiciler kullanırız, ancak ondalık olarak bazı hesaplamalar yapmamız gerekir. Kayan nokta değişkenleri kullanmak çok yavaştır, çünkü yazılım kayan nokta kitaplığı otomatik olarak dahil edilir (üst düzey bir mikro denetleyiciniz yoksa). Bu nedenle, genellikle sabit nokta aritmetiği kullanıyoruz.

Bunu her yaptığımda, bir tamsayı kullanıyorum ve ondalık basamağın nerede olduğunu hatırlıyorum. Bununla birlikte, özellikle hesaplamalar ondalık noktanın farklı bir yerde olduğu değişkenleri içerdiğinde, her şeyin tutarlı olduğundan emin olmak için biraz özen gösterir.

Bir sabit nokta atan2 işlevi uyguladım, ancak sınırlı hassasiyetin her son damlasını (16 bit) sıkıştırmaya çalıştığım için, genellikle ondalık noktanın nerede olduğunu tanımladım ve değiştirdiğimde değişecekti. Buna ek olarak, yarı sabit bir tablo olarak kendilerinin bir yerde zımni ondalık noktası olan bazı sabitlerim olurdu.

Daha iyi bir yol olup olmadığını bilmek istiyorum. Sabit nokta değişkenlerinin kullanımını basitleştiren, karışık değişkenler arasında çarpma ve bölmeyi kolaylaştıran ve ondalık sayıların veya sabit ifadelerin bildirilmesine izin veren, ancak derleme sırasında istenen sabit nokta gösterimine otomatik olarak dönüştürülebilen bir kütüphane veya makro seti var mı? zaman?


1
Bence çözüm aslında jenerik ve robotla pek ilgisi olmadığı için yığın akışı için daha iyi.
Shahbaz

1
@ Jakob - Bu soruların her ikisinin de yapıcı değil olarak kapatıldığını unutmayın.
Mark Booth

1
Bu, C ++ 'ı gömülü sistemler için çok kullanışlı hale getirecek bir şeydir. Şablonlar otomatik olarak doğru ve en uygun kodu oluşturur.
Rocketmagnet

1
Atanan işleve bir göz atabilir miyim? Akademik araştırmamda kayandan sabit noktaya dönüşüm problemiyle başa çıkmaya çalışıyorum ve buna bir çatlak vermekten mutluluk duyarım.
Joe Hass

1
@ronalchn Arduino (AVR mikro) dilinin bölümleri C ++ ile uygulanır. Bir AVR C ++ Kütüphanesi de bulunmaktadır . Ve hangi derleyicilerin kullanılacağı bu iş parçacığı .
embedded.kyle

Yanıtlar:


7

Derleyiciye her bir sabit noktalı giriş değişkeninin aralığını ve kesinliğini söyleyebilirsek iyi olur (belki de hiçbiri aynı yerde yarıçap noktasına sahip değildir) ve otomatik olarak - derleme zamanında - doğru aralığı kullanır ve bir dizi hesaplamada ara değerler ve nihai değerler için hassasiyet ve yeniden ölçekleme işlemleri. Ada programlama dilinde veya C ++ şablonlarında bunun mümkün olabileceğine dair söylentiler duydum .

Ne yazık ki, gördüğüm en yakın, programcı olarak, doğru temsili manuel olarak seçmenizi ve her işlemin yeterli aralığı ve hassasiyeti koruduğunu manuel olarak doğrulamanızı gerektiren sabit noktalı aritmetik kütüphaneleridir. Bazen karışık değişkenler arasındaki çarpımı ve bölünmeyi kolaylaştırırlar. Gibi:


Bunu kesinlikle C ++ şablonlarını kullanarak yapmak mümkündür.
Rocketmagnet

Aslında "eğer güzel olur ..." yorumunuz gibi bir şey üzerinde çalışıyorum. Gcc için kayan noktalı C kodunu sabit noktaya dönüştürerek, tüm ikili nokta konumlarını yol boyunca optimize eden bir eklentidir. Bir ACM dergisine gönderilen bir makalem var ve hazırlık aşamasında başka bir makale var. Eğer atanan fonksiyon için C kodunuz varsa, bunu denemekten mutluluk duyarız ... Size tamsayı değişkenleri kullanan ve tüm sabit nokta işlerini yapan C kodu verebilirim.
Joe Hass

Benimkinden çok daha eksiksiz bir cevap için +1. Mark Booth'un yorumunu ele almak için kaynak kodunu istemek için bir yere bir bağlantı eklemek üzere bağlantıyı benimkinde düzenledim. Bağlantınızı da güncellemek isteyebilirsiniz. Kendim yapardım ama önerilen bir düzenleme sırada ve beni engelliyor.
embedded.kyle

1
@Rocketmagnet Kesinlikle şablon kullanarak sabit noktalar uygulamak mümkündür, bkz. FixedPoints (sorumluluk reddi: Bunu yazdım ve hala çok 'genç').
Pharap

gcc bağlantı "a" bozuk
Lesto

2

Sabit noktalı DSP'lerinde sanal kayan nokta uygulamak için TI IQMath Kütüphanesini kullandım.

Texas Instruments TMS320C28x IQmath Kütüphanesi, C / C ++ programcılarının kayan nokta algoritmasını TMS320C28x cihazlarındaki sabit nokta koduna sorunsuz bir şekilde bağlaması için yüksek düzeyde optimize edilmiş ve yüksek hassasiyetli matematiksel fonksiyonların bir koleksiyonudur. Bu rutinler tipik olarak, optimum yürütme hızının ve yüksek doğruluğun kritik olduğu hesaplama açısından yoğun gerçek zamanlı uygulamalarda kullanılır. Bu rutinleri kullanarak, standart ANSI C dilinde yazılmış eşdeğer koda göre çok daha hızlı yürütme hızlarına erişebilirsiniz. Ayrıca, kullanıma hazır yüksek hassasiyetli işlevler sağlayarak, TI IQmath kütüphanesi DSP uygulama geliştirme sürenizi önemli ölçüde kısaltabilir.

Bu bazı TI belirli şeyler kullanır ama ben de diğer mikrodenetleyiciler sanal kayan nokta matematik uygulamak için bir temel olarak bu kodu kullandım. Limana ulaşmak biraz iş gerektiriyor, ancak sıfırdan başlamaktan çok daha kolay.


@downvoter Cevabımda neyin yanlış olduğu hakkında yorum yapmak ister misiniz?
embedded.kyle

+1: Bu kütüphane şu anda kullandığından daha iyi ("sadece bir tamsayı kullan"). Orijinal sorunun sorduğu her şeyi yapmaz , ancak bence böyle bir cevap (yararlı, ancak tam bir çözüm değil) bir indirmeyi hak etmiyor - tam bir çözüm gerçekten yoksa (bu durumda şüpheliyim) ).
David Cary

Bana öyle geliyor ki, tek bir cihaz yelpazesine özgü ve konuşmada olduğu gibi sadece birada olduğu gibi ücretsiz bir cevap gelecekteki ziyaretçiler için sınırlı kullanımdır.
Mark Booth

@MarkBooth Bağlantıyı C28x kütüphanesinden C64x kütüphanesine değiştirdim. Bu bağlantıyı izlerseniz, kaynak kodunu isteyebilirsiniz. Erişim için bir şirkete veya üniversite e-postasına ihtiyacınız var. Bira ve konuşmada olduğu gibi hala ücretsiz . Konuşmadan önce elinizi kaldırmanız ve çağrılmayı beklemeniz yeterlidir. Biraz sinir bozucu, ancak kaynak koduna sahip olduğunuzda, istediğiniz herhangi bir işlemciye uyarlanabilir.
embedded.kyle

Teşekkürler @ embedded.kyle kaynak kodu sadece ikili dosyadan kesinlikle daha iyidir, ancak lisans yalnızca sınırlı şekillerde kullanmanıza izin veriyorsa hala genel kullanım azdır. C6x Yazılım Kütüphaneleri sayfasına göre, bu kaynak sadece konuşmada olduğu gibi kesinlikle ücretsiz olmayan TI Ticari Lisansı altında yayınlanmaktadır .
Mark Booth

1

Binary Scaling (diğer adıyla B-scaling) gibi bir dizi uygulama (hemen farkında olduğum kitaplıklar yok ) var

Burada, ondalık noktasını yukarı veya aşağı taşımak için Shift tuşlarını kullanarak ondalık noktanın nerede olduğuna dair zihinsel bir not (veya daha da iyisi, kodu belgeleyin ...) tutarsınız.

Montajda B-ölçeklendirmeyi savunma projelerinde, en küçük CPU'larda bile kullandım, böylece başka bir şey için uygunluğunu garanti edebilir ...


Muhtemelen böyle bir şey, ama b-ölçekleme olarak adlandırıldığını hiç görmedim. Ben sabit bir nokta olarak düşünüyorum - ondalık asla yüzer çünkü ondalık noktası hesaplamalar sırasında değişebilir olsa da, herhangi bir değişken her zaman belirli bir yerde sabit ondalık noktası vardır
ronalchn 26:01 '

0

Eğer "nokta" olduğu hatırlamak için bir tamsayı kullanırsanız, bunlar tür kayan nokta aritmetik kullanarak. Sabit nokta, gerçekten sabit noktaya sahiptir.

atancosπ-π

Bu, uygulamanızın ihtiyaç duyduğu değer aralığına bağlıdır, ancak tamamen sabit nokta gösterimine geçmek isteyebilirsiniz. Örneğin, böyle bir sayı tutmak yerine:

struct num
{
    uint16_t number;
    uint16_t decimal_point;
};

nerede numbertam sayıdır ve decimal_pointondalık noktanın yerini, böyle saklayabilirsiniz diyor ki:

struct num
{
    uint16_t integer;
    uint16_t fraction;
};

burada tüm sayı, integer.fractionaynı bellek kullanımına, daha yüksek değer aralığına ve genel olarak kullanımı daha basit olan


Aslında ondalık noktanın saklanması onu daha çok kayan nokta gibi yapar. Normalde ondalık nokta derleme zamanında tanımlanır ve işleminize bağlı olarak gösterim arasında geçiş yaparsınız.
Jakob

Bir değişkende saklandığı gibi hatırlamayı kastetmiyorum, yani, ondalık noktanın nerede olduğunu bilerek nasıl yorumlandığını hatırladığım gibi hatırlıyorum
ronalchn

@ronalchn, anlıyorum. A ile bir şey demek istedin #define, değil mi? Aslında sakladığınızı düşündüm ve numaranızın ne kadar büyük veya küçük olduğuna bağlı olarak değişebilir.
Shahbaz

@ronalchn - B-ölçeklendirmeyi düşünüyor musunuz? (cevabımı gör)
Andrew
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.