Mustafa Ergül

GENEL

STM32F4 ile Ardışık Sayıların Çarpımını Hesaplama

Merhaba! Bu yazıda, STM32F4 Discovery kartı kullanarak yazdığım bir projeyi paylaşmak istiyorum. Bu projede, büyük bir sayı dizisi içerisinden ardışık elemanların çarpımını buluyoruz ve en yüksek çarpım sonucunu hesaplıyoruz. Ayrıca, bu çarpımın başladığı ve bittiği noktaları da belirliyoruz. Bu tarz algoritmalar, özellikle matematiksel analizlerde veya veri işleme projelerinde oldukça işlevsel olabilir.

Kodun Genel Amacı Nedir?

Projemizde 1000 elemanlı bir sayı dizisi tanımladım. Bu dizinin içerisinde belli bir uzunlukta ardışık sayıların çarpımını hesaplıyoruz. Kullanıcının belirlediği “k” sayısı kadar ardışık eleman seçip, bu elemanların çarpımını buluyoruz. En yüksek çarpımı bulduğumuzda ise başlangıç ve bitiş noktalarını kaydediyoruz. Sonuç olarak en yüksek çarpımı ve hangi elemanlar arasında olduğunu ekranda yazdırıyoruz.

Hangi Kartı Kullanıyoruz?

Bu projede STM32F4 Discovery kartını kullandım. STM32F4, Cortex-M4 tabanlı bir mikrodenetleyici olup, güçlü işlem kapasitesi ve çeşitli giriş-çıkış fonksiyonlarıyla öne çıkar. Seri iletişim için ITM Data Console‘u kullanarak verileri dışarıya aktarıyoruz. Bu sayede printf gibi komutlarla sonuçları konsolda görebiliyoruz.

Kodun Detaylı Açıklaması

Dizinin Tanımlanması

uint8_t buffer[1000] = { /* ... */ };

Bu dizi, 1000 adet 8 bitlik sayı içeriyor. Burada rastgele seçilmiş sayılardan oluşan bir dizimiz var. Bu diziyi tarayarak belli bir uzunlukta ardışık elemanların çarpımını hesaplıyoruz.

Ana Fonksiyon: Maxs

void Maxs(const uint8_t* buffer, int length, int k, int* maxProduct, int* start, int* end) {
    *maxProduct = 0;
    *start = 0;
    *end = 0;

    for (i = 0; i <= length - k; i++) {
        int product = 1;
        for (int j = i; j < i + k; j++) {
            product *= buffer[j];
        }
        if (product > *maxProduct) {
            *maxProduct = product;
            *start = i;
            *end = i + k - 1;
        }
    }
}

Bu fonksiyonun amacı, buffer adını verdiğimiz sayı dizisinde ardışık k kadar elemanın çarpımını hesaplamak ve en büyük çarpımı bulmaktır. Eğer yeni hesaplanan çarpım, şu ana kadar bulunan en büyük çarpımdan büyükse, bu çarpımı maxProduct değişkenine atıyoruz. Aynı zamanda çarpımın başlangıç ve bitiş indekslerini de saklıyoruz.

Ana Program

int main(void) {
    int k = 15; // Ardışık eleman sayısı
    if(k > sizeof(buffer)){
        printf("HATA: Carpim uzunlugu dizi uzunlugundan daha buyuk olamaz");
    } else {
        int maxProduct, start, end;
        Maxs(buffer, sizeof(buffer), k, &maxProduct, &start, &end);
        printf("%d ardisik carpim sonucu = %d elemanlar baslangic %d'dan %d. elemana kadar %d denemede buldu.\n", k,maxProduct,start,end,i);
    }
    return 0;
}

Bu kısımda önce k olarak kaç tane ardışık elemanın çarpılacağını belirliyoruz. Eğer k değeri dizinin uzunluğundan büyükse, bir hata mesajı yazdırıyoruz. Aksi halde, Maxs fonksiyonunu çağırarak diziyi tarıyor ve en büyük çarpımı, başlangıç ve bitiş indeksleri ile birlikte ekrana yazdırıyoruz.

ITM Kullanımı ile Seri Haberleşme

STM32’nin ITM (Instrumentation Trace Macrocell) modülünü kullanarak printf çıktısını konsola yönlendirebiliyoruz. Bu modül sayesinde verileri kolayca bir veri konsoluna yazdırabiliyoruz:

int _write(int file, char *ptr, int len)
{
    int DataIdx;
    for (DataIdx = 0; DataIdx < len; DataIdx++) {
        ITM_SendChar(*ptr++);
    }
    return len;
}

Yukarıdaki kod, printf gibi komutları kullanarak seri veri göndermemizi sağlıyor.

Projenin Uygulama Alanları

Bu tarz algoritmalar birçok farklı alanda kullanılabilir. Örneğin, veri analizinde veya matematiksel modellerde, belirli veri gruplarının çarpımlarını hızlı bir şekilde hesaplamak gerekebilir. Aynı zamanda bu algoritma, özellikle donanım sınırlamaları olan gömülü sistemlerde, büyük veri dizileri üzerinde hesaplama yapabilmek için optimize edilebilir.

Bu projede ayrıca STM32’nin güçlü işlem kapasitesinden faydalanarak hızlı bir şekilde sonuç elde ettik. Ayrıca, ITM ile yapılan seri haberleşme sayesinde, çıktı verilerini anlık olarak izleme fırsatı bulduk.

Bu yazıdaki kodları inceleyip geliştirmek için önerilere açığım. Bu tür projelerle uğraşmak her zaman heyecan verici oluyor. Eğer merak ettiğiniz başka şeyler varsa yorumlarınızı bekliyorum!

GİTHUB KODLARI

Keyifli kodlamalar!

Leave a Reply

Your email address will not be published. Required fields are marked *