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

flowchartx

Aktif Üye
Katılım
18 Ağustos 2021
Mesajlar
219
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
6,951
Mesajlar
118,753
Üyeler
2,824
Son üye
selocan32

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
Back
Top