Bu kod iyi yazılmış bir kod mudur ?

flowchartx

Aktif Üye
Katılım
18 Ağustos 2021
Mesajlar
218
Herkese merhabalar, arm mimarisinde tek adc 3 channel bir sensör okuması için yazılmış bir kodu tartışıyorduk. Bazı kişiler iyi bazı kişiler çok dolambaçlı diyor. Ama kod doğru çalıştığı söylendi sizinde fikrinizi merak ettim

ADC KESMESİ:
void ADC_IRQHandler()
{
          if(ADC1->ISR &     0x0004)
          {

            datas[AdcReadNumber] += ADC1->DR;
            counter++;
            if(counter > 50)
            {

                ADC_Done=1;
                counter=0;
                ADC1->CR = 1<<4;  // ADC KAPATILIR
            }
            else
            {
             //   ADC_Status=0;
            }
            ADC1->ISR &= ~0x0004; // BAYRAĞI INDIR
        }

}


ADC UPTADE:
uint8_t UpdateADC(void)
{


        switch(AdcReadNumber)
        {
        case 0:
            ADC1->CHSELR = 0x0000;
            ADC1->CHSELR |= (1<<4) ;
            break;
        case 1:
            ADC1->CHSELR = 0x0000;
            ADC1->CHSELR |=  (1<<5);
            break;
        case 2:
            ADC1->CHSELR = 0x0000;
            ADC1->CHSELR |= (1<<6);
            break;
        }
        ADC1->CR |= 0<<1;
    //    ADC1->CR |= 0x0001;
        ADC1->CR |= 1<<2;
        ADC1->ISR |= 0x0001;
        return 1;


}


READ_ADC:
uint8_t Read_ADC(void)
{

    switch(AdcReadNumber)
    {
    case 0:
        Sensor1 = datas[0] / 50;
       
        break;
    case 1:
        Sensor2 = datas[1] / 50;
        break;
    case 2:
        Sensor3 = datas[2] / 50;
        break;
    }

    AdcReadNumber++;
    if(AdcReadNumber == 3)
    {
        AdcReadNumber=0;
    }
    return 1;
}


WHILE:
          if(ADC_Done)
          {
              ADC_Done=0;
              while(Read_ADC() != 1);
              UpdateADC();
          }
 
Bu kodun doğru çalışacağını düşünmüyorum. Read_ADC her zaman 1 return ediyor. Ana kodda da Read_ADC nin farklı bir değer döndürene kadar dönen bir loop var, bu durumda işlemci o loop'tan kesinlikle çıkamayacak. UpdateADC hiçbir zaman çağrılmayacak.

Ben de kodun gereksiz yere karmaşık olduğunu düşünüyorum. 50 tane örnek biriktirip sonra bir kerede ortalama almak yerine, örnekler geldikçe geçmişe dönük sürekli ortalama almak daha mantıklı olurdu.

Bunun dışında kod çok özensiz ve dağınık yazılmış. Kimi yerde indent 12 karakter, kimi yerde 1, kimi yerde 4. Araya rastgele serpiştirilmiş boş satırlar var. Kimi yerde operatörler arasında 1 boşluk var, kimi yerde hiç boşluk yok, kimi yerde 5 boşluk var. Bu şekilde dağınık kodu görünce benim düşüncem, yazan kişinin konuya çok iyi hakim olmadığıdır. Muhtemelen sağdan soldan copy/paste ile kod araklamış, üzerinde de rastgele ameliyatlar yaparak çalıştırmaya uğraşmış. Halbuki işini severek yapan, konuya da hakim olan birisi, yazdığı kodu kendisinin ortaya koyduğu bir sanat eseri gibi görür ve her yönden muntazam olmasını sağlar.
 
Evet hocam kod çok özensiz üstünde çok oynama yapılmış aslında bir deneme kodu. Tam kendimi ifade edemedim, aslında sormak istediğim mantık doğru mu? yani bu doğru bir adc okuması mı? 50 tane datayı tek kanaldan okuyup sonra ortalamasını alıp sonra diğer kanallara geçmek? Bu mantığı kuran kişiler doğru olduğunu düşünüyor. Bana kalırsa 3 kanal periyodik olarak ard arda okunup sürekli bir işleme tabi tutulması gerekiyor
 
Son düzenleme:
aslında sormak istediğim mantık doğru mu?

Eğer kodun yapacağı iş gereği, ADC ler çoğu zaman aylak duruyorsa, belli zamanlarda da sensörü okuyup tekrar aylak duruma geçmesi gerekiyorsa, bu yapı bir derece makul kabul edilebilir.

Ama yazılım işinde ideal olan, karmaşıklığı olabildiğince azaltmaktır. Arada bir açılan ve sonradan kapatılan kesmeler bir belirsizlik yaratıyor. Böyle başka kesmeler de varsa ve bunlar tesadüfen tam olarak aynı anda açılırsa ne olacak? Belki MCU kesmelerin içinde fazla süre geçirecek ve ana döngüde bir işi yapmakta geç kalacak. Ve bunu sen kodu geliştirirken hiçbir zaman farketmeyebilirsin. Böyle problemleri genelde müşteri yakalar :)

Kesme sürekli açık olursa, sürekli olarak da geçmişe dönük ortalama alırsa, ana döngüde sen sadece anlık ortalamaya bakman yeterli olacak. Kodun da çalışma modu hep aynı olacak. Kesmeler ile ilgili bir timing sorunu varsa da, bunu daha ilk günden, anında göreceksin.
 
Sizin dediğiniz, mesela hesaplama fonksiyonu çağırıldığında o zamana kadar ne kadar veri topladıysa toplamı o sayıya bölmek mi? Doğru mu anlamışım sizi?
 
Sizin dediğiniz, mesela hesaplama fonksiyonu çağırıldığında o zamana kadar ne kadar veri topladıysa toplamı o sayıya bölmek mi? Doğru mu anlamışım sizi?

Geçmişe dönük sürekli ortalama alırsa kesme, ana kodun tek yapması gereken mevcut ortalamayı okumak, o kadar. ChatGPT ye böyle temel kodları yazdırabilirsin

 

Çevrimiçi personel

Forum istatistikleri

Konular
5,880
Mesajlar
100,234
Üyeler
2,491
Son üye
djkop

Son kaynaklar

Son profil mesajları

gruptaki arkadaşlara selamlar. sıteyi bu gün fark ettim. Asansör için 2x7 segment LCD gösterge üretmek istiyorum. acaba bu sayfadaki arkadaşlardan destek alabilirmiyim. LCD nin mantık açılımı ektedir.
deneyci wrote on TA3UIS's profile.
Selam.
Amatör telsiz lisansı nasıl alınıyor?
Lisansı olmayanı forumlarına almıyorlar. :)
Bilgi alamıyoruz.
cemalettin keçeci wrote on HaydarBaris's profile.
barış kardeşim bende bu sene akıllı denizaltı projesine girdim ve sensörleri arastırıyorum tam olarak hangi sensör ve markaları kullandınız yardımcı olabilir misin?
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
* En mühim ve feyizli vazifelerimiz millî eğitim işleridir. Millî eğitim işlerinde mutlaka muzaffer olmak lâzımdır. Bir milletin hakikî kurtuluşu ancak bu suretle olur. (1922)
Back
Top