Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

IAR Sprintf ve Float

Başlatan Mucit23, 27 Aralık 2019, 18:19:07

Mucit23

Selamlar

IAR 'da sprintf fonksiyonu float sayıları desteklemiyor mu acaba? Float direktiflerini görmezden geliyor.

Mucit23

Öğrendiğim kadarıyla sprintf ve printf fonksiyonu float veya double kullanımlarında kaynak çok fazla tükettiğinden dolayı kullanılamıyor.

Custom olarak yazılmış sprintf gibi çalışan bir fonksiyon varmıdır?

OptimusPrime

Kullanma klavuzuna bakiver vardir bir ayari. Cok fazla yer kapladigi dogru ama kullanmakda mumkun olmali bir sekilde.
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

Mucit23

sprintf şuanda IAR'da var. Fakat float direktifleri çalışmıyor. Normal integer sayılar için sorun yok. Ben bir ayar göremedim.

Okan AKÇA

Daha az kod icin ayarı var. Ama yinede çok yer kaplıyor.

Mucit23

Float sorununu çözemedim. Harici olarak yazılmış bir float to ascii dönüşümü yapan bir fonksiyona ihtiyacım var. Artık geniş bir vakitte yaparım. Yalnız IAR'da STM8'e alışamadım bir türlü. İkidir yapacağım işi bu sefer STM8 ile yapayım diyip sonra yarıda vazgeçip tekrar pic ile hallediyorum.

Bu sefer vazgeçmemin sebebi ilk olarak float sayı ve sprintf konusu, Diğer durum debug'da anlamadığım sorunlar. Aslında debug vs yapabilmem çok hoşuma gidiyor, Fakat Debug esnasında float bir değişkeni watch kısmına alıp izlemek istediğimde sayıyı anlamadığım bir formatta gösteriyor.

Diğer formatlarda sıkıntı yok ama float için bir ayar var mı çözemedim.

Birde şu dikkatimi çekti. Bu konuda yorumlarınızı bekliyorum.

STM8S103F3P kullanıyorum. Sanki IAR ile yazdığım program aşırı derece yer kalıyor. Bazı kütüphanelerim var. Bunların aynısını Pic ve CCS C ilede kullanıyorum. Hemen hemen aynı yazılım IAR tarafında MCU hafızasına sığmazken Pic tarafında aynı işlemleri yaptığım zaman program hafızasının %70'i dolmuş oluyor. Bu arada kullandığım MCU Pic16F1827, Sanırım 7Kb program hafızası vardı.

STM8S103F3 de 8kb program hafızası var. sprintf veya printf ile float direktifi kullanmıyorum. Pic ile yaptığım işin şuanda ancak %70'ini yaptım. STM8 ve IAR'da sorun çok yaşayınca ve proje zamanım kısıtlı olunca vakit kaybetmemek için Pic ile tamamladım. Bu iki seferdir dikkatimi çekiyor. Mikroişlemci mimarisi ile mi alakalı yoksa iar ilemi alakalı bilmiyorum ama Microchip'in 8 bit mikro denetleyicilerine CCS ile daha fazla kod yazıyorum.

İki seferdir STM8 ile başladığım bir projeye başka bir platformda tamamlıyorum. Bu çok canımı sıkıyor.  :du:

Okan AKÇA

Ne yazikki bazi konuları kendiniz çözmeniz gerekiyor. Ccs yada arduino kullanan kolay kolay bırakamıyor. Ara ara bende uğraşıyorum sıkıntılarla karşılaştıkca yarım kalıyor.

mufitsozen

Alıntı yapılan: Okan AKÇA - 01 Ocak 2020, 20:20:13Ne yazikki bazi konuları kendiniz çözmeniz gerekiyor. Ccs yada arduino kullanan kolay kolay bırakamıyor. Ara ara bende uğraşıyorum sıkıntılarla karşılaştıkca yarım kalıyor.

convert double to string

/**

 *  stm32tpl --  STM32 C++ Template Peripheral Library

 *

 *  Copyright (c) 2009-2014 Anton B. Gusev aka AHTOXA

 *

 *  Permission is hereby granted, free of charge, to any person obtaining a copy

 *  of this software and associated documentation files (the "Software"), to deal

 *  in the Software without restriction, including without limitation the rights

 *  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell

 *  copies of the Software, and to permit persons to whom the Software is

 *  furnished to do so, subject to the following conditions:

 *

 *  The above copyright notice and this permission notice shall be included in

 *  all copies or substantial portions of the Software.

 *

 *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

 *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,

 *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE

 *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER

 *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,

 *  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN

 *  THE SOFTWARE.

 *

 *

 *  file        : ftoa.c

 *  description  : convert double to string

 *

 */



#define MAX_PRECISION (10)

static const double rounders[MAX_PRECISION + 1] =

{

 0.5, // 0

 0.05, // 1

 0.005, // 2

 0.0005, // 3

 0.00005, // 4

 0.000005, // 5

 0.0000005, // 6

 0.00000005, // 7

 0.000000005, // 8

 0.0000000005, // 9

 0.00000000005 // 10

};



char * ftoa(double f, char * buf, int precision)

{

 char * ptr = buf;

 char * p = ptr;

 char * p1;

 char c;

 long intPart;



 // check precision bounds

 if (precision > MAX_PRECISION)

 precision = MAX_PRECISION;



 // sign stuff

 if (f < 0)

 {

 f = -f;

 *ptr++ = '-';

 }



 if (precision < 0)  // negative precision == automatic precision guess

 {

 if (f < 1.0) precision = 6;

 else if (f < 10.0) precision = 5;

 else if (f < 100.0) precision = 4;

 else if (f < 1000.0) precision = 3;

 else if (f < 10000.0) precision = 2;

 else if (f < 100000.0) precision = 1;

 else precision = 0;

 }



 // round value according the precision

 if (precision)

 f += rounders[precision];



 // integer part...

 intPart = f;

 f -= intPart;



 if (!intPart)

 *ptr++ = '0';

 else

 {

 // save start pointer

 p = ptr;



 // convert (reverse order)

 while (intPart)

 {

 *p++ = '0' + intPart % 10;

 intPart /= 10;

 }



 // save end pos

 p1 = p;



 // reverse result

 while (p > ptr)

 {

 c = *--p;

 *p = *ptr;

 *ptr++ = c;

 }



 // restore end pos

 ptr = p1;

 }



 // decimal part

 if (precision)

 {

 // place decimal point

 *ptr++ = '.';



 // convert

 while (precision--)

 {

 f *= 10.0;

 c = f;

 *ptr++ = '0' + c;

 f -= c;

 }

 }



 // terminating zero

 *ptr = 0;



 return buf;

}
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

RaMu

e notation, scientific notation, bilimsel format, herhalde o görüntü.

P10 kütüphanesiyle mi uğraşıyorsun.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Mucit23

@mufitsozen  Abi teşekkürler. Uygun bir vakitte deneyeceğim

Ya her şey hallolur da, IAR'ın program tüketimi çok gibi geldi. Bu IAR ile mi alakalı yoksa olması gereken mi bu bilmiyorum. Optimizasyon ayarlarını gözden geçirmem gerekiyor.

@RaMu Yok P10 kütüphanesi değil. P10 kütüphanesinde font dataları vs 8K program hafızasına sığmaz diye düşünüyorum. Sığsa bile kod yazacak yer kalmaz.

Elektroemre

8KB flash'la sıkıntılı işler. Öncelikle gerçekten float'a ihtiyaç var mı? Çok büyük ihtimal işlemleri fixed point yapabilirsin.

Diğer bir çözüm: Örneğin virgülden sonra 3 hane göstereceksen;
float floatValue = 2.3456f;

uint32_t integerValue = fValue * 1000.0f;

sprintf(buffer, "Float Deger = %d.%03d", integerValue /1000, integerValue % 1000);

Ek olarak IAR kodun çok yer kaplaması ile alakalı uygulamadki optimize level nedir?