Algoritma Nedir ?

Başlatan muhittin_kaplan, 06 Ekim 2013, 10:46:36

z

Hocam laf olsun diye geyik yapiyoruz. Ama elin oglu rom kodlarindan source kod uretecek kodlara kafa yoruyor. Cok ciddi bir durum olsa gorev verilse usenmem bir iki core icin abuk sabuk kodlar yazarim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

muhittin_kaplan

algoritmanın şekilsel gösterimi ne akış diagramı diyoruz.
çoğunluğun bildiği UML şemaları
http://en.wikipedia.org/wiki/Unified_Modeling_Language

kralsam

#17
Alıntı yapılan: muhittin_kaplan - 07 Ekim 2013, 12:54:50
algoritmanın şekilsel gösterimi ne akış diagramı diyoruz.
çoğunluğun bildiği UML şemaları
http://en.wikipedia.org/wiki/Unified_Modeling_Language

Çok büyük çaplı uygulama yapmadım. En fazla bir kaç bin satırdan ibaret işlerle ilgilenme fırsatım oldu.
Bu projelerde şu yolları izledim.

- Kafadan düşünerek bir kaç kısmı modüler şekilde hayal edip yapabiliyorsam ve modüller 3-5 tane ise direk kodlamaya başladım.

- Sistemi tam olarak kavrayamadıysam önce istenenleri, olması gereken durumları ve bunları bölebileceğim parçaları oluşturdum.
- Bu parçaları ufak ufak ele alarak tabiri caizse böl parçala yönet mantığı ile ele alarak Akış Diyagramı çizdim.
- Modülleri parça parça yazdım.
- Sonrasında bunları bir top module ile birleştirdim.
- Debug yapıp eksikleri giderdim.

Hangisi doğru - yanlış ? Emin değilim. Ama genellikle yaz-çiz yaptığım işlerde, işler daha kolay oluyor. Sanırım anlaması, kavraması ve hatırlaması daha kolay oluyor.

Düzeltme: Eğer yapılan işlem belirli bir matematiksel fonksiyonsa tabiki ilk yaptığım işlem kritik durumları hesaplamak.

muhittin_kaplan

Veri Modeli Nedir ?
veri modeli, bilgiler arasındaki bağlantının şeklidir diyebiliriz. Genelde Veri yapısı (byte, int vs vs) ile karıştırılır.

konuyla ilgili güzel bir yazı.
http://www.bilgius.com/veri-modelleri/

lütfen veri modellerini araştırınız..


muhittin_kaplan


yamak

Alıntı yapılan: muhittin_kaplan - 06 Ekim 2013, 23:20:59
Doğru, DZ bayrağı o iş içindir.

volatile derleme esnasında yaptığınız tanımlı bölgeyi "burayı optimize etme, elleşme kardeşim ne görüyorsan öyle compile et" anlamına gelir. Bir adresi değişkene bağlamış olabilirsiniz, konuyla alakalı güzel bir yazı http://ozgurmurat.blogspot.com/2009/05/c-dilinde-volatile-anahtar-kelimesi.html


Neyse Devam Edelim.

Algoritmik Yaklaşım: Daha önce test edilip kullanılmış, doğru çalıştığı bilinen çözümlerden herhangi biri seçilerek Probleme Çözüm Bulmaya Algoritmik yaklaşım denir. Tüm Adımların çok kecin ve net bir şekilde ortada olması gerekir.

Heuristik yaklaşım: Problem algoritmik olarak çözülmemiştir. problem tam olarak tanımlanmamıştır da diyebiliriz. problemin çözümü tam olarak ortada değildir.
bir programcı algoritmik olarak çözümlemediği bir problemi farkında olmadan Heuristik olarak çözüyordur. aslında Heuristik olarak çözdüğü anda artık algoritmik olarak da çözebilir.

algoritmik çözüm Heuristik den daha hızlı sonuca ulaştırır.
--------------------------------0---------------------------------0--------------------------------0----------------------------------0-----------------------------------0------------------------------------0---------

Algoritmik Çözüm yöntemini kullanarak ilk yaptığınız nedir Üstadlar ? Ben ilk önce pseudo code yazarım siz ? Sonrasında ister PBP,CCS, C yada Vb.net yada C# fark eder mi ? bundanrır ki arkdşlra "dil üzrnde fzl durmyn bnlr brr arç dyrm (burayı bilerek böyle yadzım çoğunluk anlamıştır. dil-iletişim aracıdır.)
merak edenler için http://tr.wikipedia.org/wiki/S%C3%B6zde_kod
Hocam aşağıdaki cümlenin tam olarak açıklaması nedir?
Alıntı YapInterrupt servis rutinleri içerisinde değiştirilen bir alan kesme dışındaki kodda okunuyorsa (ya da tam tersi) söz konusu alanın değeri programın çalışması süresince her an değişebilir. Derleyici bundan haberdar olmadığı için bir kere değeri okuyup/yazdıktan sonra tekrar aynı işlemi yapmayabilir. Bu tip alanların bu yüzden volatile olarak tanımlanması gerekir (ve haliyle atomik olarak okunup/yazılabilmesi gerekir).
Şimdi aşağıdaki gibi kodum olsun

char a;
int main(void)
{
    send_char(a);
}

void UART1_IRQHandler(void)
{
    a=get_char();
}

burada a yı volatile tanımlamazsam ne olur?

muhittin_kaplan

hocam fonksiyona parametre vermiş ve dönen değer olarak a yı göstermişsiniz. derleyicinin ürettiği kodu görmek gerekir (optimizasyonda önemlidir). ama ben düzgün derleyeceğini düşünüyorum.

yani send char(0) gibi bir durum olur bilgi alana kadar (bilgi aldığımız anda durum değişir.)

ama

int rutini içerisinde usartın RX reg ın bilgisini aldığımız yerdeki değişken volatile olmalı. Çünki reg içeriğini "0" kabul edebilir.
void rx_int{
char RxValue;
RxValue=RX_reg;
Return RxValue;
}
Burayı RxValue=0 olarak derleyebilir.


dolayısıyla a da devamlı 0 görülür.

(Yanlışım varsa lütfen düzeltin. Emin değilim. Yorum Yaptım Sadece)

yamak

Hocam dediğiniz doğru olabilir ama adamın anlattığından benim anladığım şu:
Eğer bi değişiken intterrup servis rutininin içinde değeri değişiyo ve daha sonra programın başka yerlerinde kullanılıyorsa bu değişken volatile tanımlanmalı.Bu durumda böyle bi değişkenin global olarak tanımlanmış olması gerekir.Ama bence sizin yazdığınız kodda da RxValue volatile tanımlanması gerekir çünkü derleyici o değişkenin programın çalışması esnasında değişeceğini bilemez.

muhittin_kaplan

aslında ben
Duğrudan işlemcinin Registerleriyle ile bilgi alışverişi yapan değişkenlerimi VOLATILE tanımlıyorum.


yamak

Alıntı yapılan: muhittin_kaplan - 24 Ekim 2013, 23:11:26
aslında ben
Duğrudan işlemcinin Registerleriyle ile bilgi alışverişi yapan değişkenlerimi VOLATILE tanımlıyorum.
Hocam aslında derleyici optimizasyonlarını detaylı bi şekilde açıklayan bi döküman bulsak daha iyi anlaşılabilir.Kaan Arslan sitesinde açıklamış bazılarını ama açıklamdıkları da var galiba.

muhittin_kaplan

hocam global değişkenlerde mi kullanılır bu volatile ?

yamak

Hocam atomic erişimden kastettiğiniz tam olarak nedir?Biraz açıklayabilir misiniz?

mufitsozen

atom maddenin bolunemiyen en kucuk parcasidir tarif olarak.

atomic erisimide (turkcesi biraz icat bir terim oldugu icin uzun uzun aciklamak lazim gelebilir) cok basit olarak,  kesintiye ugramadan bir hamlede (1 instruction) yapilan erisim denebilir.

ornegin i++;

  i degiskenini registira al,
  registiri bir arttir
  registiri i degiskenine yaz olarakda yapilabilir
yada
inc i

diyede yapilabilir. tabiiki, i degiskenin oldugu yere hw olarak (ornegin dma ile) erisim varsa vede buda cycle stealing gibi instruction fetch cycleda yapiliyorsa (yada uniprocessor degilde multi processor/cekirdek yada shared memory yada ... filan falan diye konu uzaaar gider)

daha iyi anlamak icin en azindan "critical section" aciklamalarini okumaniz tavsiye edilir
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.