Hi-tech PICC ve non-protyped hatası

Başlatan Erol YILMAZ, 18 Temmuz 2008, 17:14:19

Erol YILMAZ

Sayın Hi-tech sever arkadaşlar,

Derleyici tarafından birkaç tane "Warning" alıyorum.
Bunun yanında derlemeyi de hatasız yapıyor.
Ben idealist insanım, Yazdığım kod Warning vermesin isterim,
Bu adama ne yapmam lazım ki,
Warning vermesin, "İş tam oldu abi, yola devam..." desin ?

#include <pic.h>
__CONFIG(PROTECT & CPD & INTIO & MCLRDIS & WDTEN & LVPDIS & PWRTEN & BOREN );

void buton_function();
void girisler();
void init();


Bu kodun baş tarafı idi.

Fonksiyonumuz...

void init(){
	RBPU = 1;									/* Pull-up disable*/	
	T0CS = 0;									/* TMR0 internal */
	PSA = 0;									/* Assigned to Timer0 */
	PS2 = 1;									/* 8M / 4 = 2M */
	PS1 = 1;									/* 2M/128 = 15625 */
	PS0 = 0;									/* 15625 / 100 = 156.25 saymalı ve kesme oluşmalı*/
												/* 255-156.25 = 99 intte TMR0 a aktarılacak değer */ 
	T1OSCEN = 0;								/* OSC kapat */
	TMR1ON = 0;									/* Timer1 kapat */	

	CCP1CON = 0b00000000;						/* CCP disable */

	IRCF2 = 1;									/* 8 Mhz */
	IRCF1 = 1;									/* 8 Mhz */
	IRCF0 = 1;									/* 8 Mhz */

	ADCS1 = 1;									/* ADC icin Internal RC*/
	ADCS0 = 1;									/* ADC icin Internal RC*/

	ADFM = 1;									/* ADC sonucu Sağa dayalı */
	ADCS2 = 0;									/* */
	PCFG3 = 0;									/* AN0 AN1 ve AN3*/	
	PCFG2 = 1;									/* */
	PCFG1 = 0;									/* */
	PCFG0 = 0;									/* */

   	TMR0IE=1;									/* */
   	GIE=1;										/* */
return;
}


Warninglerimiz de şekildeki gibidir.



ahmet2004

İdealist insan'a bir sorum olacak.

mplab  veya  HI-TIDE vb.. hangi derleyiciyi kullanıyorlar acaba?

zafzaf82

Mikroişlemci bi araçtır, amaç değil.....

Erol YILMAZ

Hi-Tech başlığı altında yazmamın yeterli gelmeyeceğini anlamam lazımdı.
Hi-tech PICC derleyicisi, Mcu: 16F819

rf

Sayın Allegro,
Aldığınız uyarı mesajı , tanımladığınız fonksiyonların prototoip deklerasyonlarını yapmadığınızdır . Kısaca fonksiyonun giriş parametrelerinin ne olacağını tanımlamanız yada void yazarak giriş parametresi olmayan fonksiyon olarak tanımlamanız gerekekir.


ör:
void buton_function(void);
void girisler(void);
void init(void);

yada fonksiyona göre,

void buton_function(unsigned char button);
void girisler(unsigned int input);
void init(void);
gibi...

Saygılarımla,
KOSGEB Girişimcilik Desteği Bilgi ve Paylaşım Platformu http://www.girisimcilikdestegi.com/

zafzaf82

@Allegro
void buton_function(void);
void girisler(void);
void init(void);


olarak düzeltirsen warnings kalmaz
Mikroişlemci bi araçtır, amaç değil.....

Erol YILMAZ

Alıntı yapılan: "zafzaf82"@Allegro
void buton_function(void);
void girisler(void);
void init(void);


olarak düzeltirsen warnings kalmaz

Sayın rf ve zafzaf82 kodu yazarken,
void init(){ ...return;}


olarak yazdığım için Prototype tanımlamasında da
aynısı olarak belirttim. Demek ki görülebilen her yere
açıklamasını istiyormuş bu Hi-tech,

Bahsettiğiniz gibi değer dönmeyen yerlere de void yazdım, Warningler kalktı.
Teşekkürler :)

picusta

Dün aksam MISRA-C ne imis değilmis diye baktim, güzel de bir doküman buldum (kurallari anlatan Renesas MISRA-C checker'in kullanim kilavuzu).
Olayin özü su imis :
Gömülü C'yi düzgün yazmak için otomobil sektöründekiler bir araya gelip 100 küsür kuraldan/tavsiyeden olusan bir doküman hazirlamislar ve bu kurallara uymaya çalismislar.
örnegin malloc, free kullanmak yasak; standart kütüphaneden su, su fonksyonlar yasak; break, goto, next kullanimi neredeyse hepten yasak.
örnegin bu kural açikca yaziyor.
benzer olarak su durum da verilebilir:
prototip
void fonksyon (int a);
ve
tanim
void fonksyon (int b)
{
//...
}

olarak yazmak MISRA-C tarafindan yasak (compiler uyari vererbilir, code checker kesin verir).

Gömülü sistemler ile çalisiyorsaniz ANSI-C derleyicinin üzerine bir de MISRA-C kural denetleyicisi ilave edin, kodunuzu da kurallara uygun yazin.

Erol YILMAZ

@picusta,

MISRA C de yasak olan şey nedir ?
Prototip kullanmak mı?
yoksa kullanma biçimi mi ?

picusta

Kural XX :
argümansiz fonksyon prototiplerinde void kullanilmasi gerekir.
(Aldigin warning)

Kural YY :
prototipte belirlenen degisken ismi tanimlamada aynen kullanilmasi gerekir (son verdigim örnekteki gibi olmamali,  ikisindede "int a" yazmali)

Bahsettigim  doküman bu :
http://documentation.renesas.com/eng/products/tool/rej10j1314_sqmlnt_u.pdf
toplam 127 kural var.

kurallari tek tek yorumlamislar ve açiklamislar.
ürün:
http://sg.renesas.com/fmwk.jsp?cnt=misra_c_rule_checker_sqmlint_tools_product_landing.jsp&fp=/products/tools/coding_tools/extension_software_compilers/misra_c_rule_checker_sqmlint/

arslan74

Merhaba,

Hi-Tech Ansi-C standartına uygun bir derleyicidir. Dolaysıyla picusta dediğin kurallar hi-tech için gecerli değildir. Bütün ansi-c standartları destekliyor. Bahsettiğin bütün kuralları destekliyor. Yanlız malloc ve free kullanmak anlamsız cünkü bunlar işletim sisteminden ram talep eden fonksiyonlar. Ortada işletim sistemi olmadığı için anlamsız olur.

Ancak break C nin en temel komutlarından dır ve cok kullanılan bir anahtar sözcüklerdendir.

fonksiyonlarda parametre değişkeninin bildirimlerinde farklı isimler kullanılabilir.

Ancak boş bırakılması void olduğu anlamına gelmez. Burada parametre değişkenin ne olduğu belirtilmemiştir. void parametresinde void yazılması gerek. Ancak C++ durum farklı onda boş olan parametre void anlamı taşıyor. Dolaysıyla C++ bilenlerin C bu farkını gözden kacırmamalıdırlar.

Selamlar

KAZIMUGUR

Çok kıymetli bilgiler teşekkür ederim.Ustaların yazılarını okumak zevk veriyor.
Peki bu hatalara aldırış etmeseydik,nasıl olsa hex i verdi.
16F819 un çalışmasını nasıl etkilerdi - ne yapardı ve ya ne yapamazdı ?

Erol YILMAZ

Alıntı yapılan: "KAZIMUGUR"Çok kıymetli bilgiler teşekkür ederim.Ustaların yazılarını okumak zevk veriyor.
Peki bu hatalara aldırış etmeseydik,nasıl olsa hex i verdi.
16F819 un çalışmasını nasıl etkilerdi - ne yapardı ve ya ne yapamazdı ?

Uyarılar gerçekten bir problemi işaret ediyor olabilir.

Şu anda görünen uyarı pek önemli olmayan bir uyarı.
Hex te bi farklılık oluşturmadı.
Fakat bunları halletmek yerine görmezden gelmeyi tercih edersek,
Kalabalık uyarılar arasında Probleme işaret eden bir uyarıyı görmezden gelebiliriz.

Bu da kaynaklarımız arasında var olan "uyarı sistemini" iptal etmemizle
eşdeğer olur ki, sanırım kaynaklarımızı anlamalı ve daha iyi işler için
kullanmalıyız.

arslan74

Alıntı yapılan: "KAZIMUGUR"Çok kıymetli bilgiler teşekkür ederim.Ustaların yazılarını okumak zevk veriyor.
Peki bu hatalara aldırış etmeseydik,nasıl olsa hex i verdi.
16F819 un çalışmasını nasıl etkilerdi - ne yapardı ve ya ne yapamazdı ?

Eğer fonksiyonlarda parametre değişkenini belirtmezsen. Bu fonksiyonu kullanan kişiye nasıl bir parametre kullanması gerektiğini belirtmemiş olursun. o durumda yanlış parametre gecebilir ve fonksiyon yanlış çalışır.

Selamlar

picusta

Aslan arkadasim, ben HI-TECH'in ANSI-C uyumuna birsey demedim.
ANSI-C - MISRA-C  karsilastirilmasi yapilmaz çünkü ikisi ayni katman değil. ANSI-C derleyicinin özelligi, MISRA-C ise programlayicinin kodu daha kaliteli, hatasiz, anlasilir bir biçimde yazmasi için uyumasi (programcinin) gereken kurallar. (birisi derleyicinin vasfi, digeri programcinin)

Dikkati çekmek istedigim konu MISRA-C adi altinda gömülü sistemlerde C'de yazmanin kurallari oldugudur.
MISRA-C ile uyumlu kod yazip sonra kodu otomatik olarak denetlemek uyarilari kaale almak Erol'un dedigi gibi "uyari sistemini" güçlendirir ve ortaya daha kaliteli kod çikar.


Kurallarda 'break sadece bir switch'in içinde kullanilabilir, (döngünün içinde kullanilmaz)' diyor. Goto ve next tamamen yasak.

malloc ve free konusuna gelince, isletim sistemi sart değil. C ile kolaylikla yazilan bir bufferdan hafiza yöneten kütüphane. örnegin Renesas compiler'inde heap'i kütüphanesini kendiliginden sunuyor.
Ufak MCU'lar için yazilmis C'de heap kütüphanesi var, kolaylikla PIC'lere tasiyabiliriz (AVR'lerde çalisiyor).