Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => ARM => ARM7 Mikrodenetleyici => Konuyu başlatan: Mucit23 - 28 Ocak 2013, 17:57:58

Başlık: STM32 Rtos Kurulumu
Gönderen: Mucit23 - 28 Ocak 2013, 17:57:58
Arkadaşlar Merhaba

Size danışmak istediğim bir konu var.

STM32F10X için hazırladığım bir programda DS18b20 sıcaklık, harici rtc , ADC okuma, Tuş takımı taraması gibi işlerle uğraşıyorum.

Normalde Tuş takımını Kesmeyle sürekli taradığım için tuş takımının çalışmasında bir problem olmuyor. Ama main programı içerisinde Alt alta birden fazla işlem yaptığım zaman yapılan işlemlerin bitmesi 1sn den daha uzun sürüyor. Dolayısıyla RTC den okuduğum saat bilgisi düzgün olarak güncellenmiyor. Bazen saat ikişer atlıyor. Gerekirse tuş takımı dahil tüm işlemlerimi task lara bölüp öyle yapmak istiyorum.

Burada yazdığım programa Rtos gibi bir yapı kurmak istiyorum.

Mesela Sıcaklık okumasını çok sık yapmak istemiyorum 5 sn aralıklarla bile ölçüm yapılabilir. Aynı şekilde ADC okumasıda çok sık olması gerekmiyor.
Bunları Rtos ile ayarlayabilirmiyim merak ediyorum.

Rtos konusunda biraz teorik bilgi edindim. Fakat Tecrübem hiç yok.

Örnek programlara bakarak bir iki çalışma yaptım  ama bir türlü derleyemedim.
Yazdığım programa rtos yapısını kurmak için sırayla hangi işlemleri yapmalıyım?

Bu konuda Tecrübeli abilerim biraz yol gösterirse sevinirim gerçekten
Başlık: Ynt: STM32 Rtos Kurulumu
Gönderen: Klein - 28 Ocak 2013, 18:28:59
RTOS ile yaparsın muhakkak. Ama Bu sorunu çözmek için RTOS şart değil.
Eğer programı hiç bir yerde bekletmez, beklemeleri sayaçlar ile, program adımlarını switch-case  yapısı ile halledersen (Sanırım state-machine deniyor) gayet rahat halledersin.

örnek:

adc_oku;
while( adc_okundu);

gibi bir yapın olursa ADC okunana kadar beklersin.Bu da loop zamanını uzatır. Özellikle DS18B20 okurken program yerlerde sürünür. 

ama bu yapıyı şuna benzer bir  hale getirisen


adc_okuma_islemi()
{
static int pc=0;
static int time=1000;
     switch(pc){
      case 0:
                if(--time==0)
                {   
                    pc++;
                 }
                break;
       case 1:
                adc_oku();
                pc++;
                break;
        case 2:
               if(!adc_okundu)
               {
                    pc++;
                }
         case 3:
               time=1000;
               pc=0;
               break;
          default:
                  pc=0;
     }

}


bu kodu her 1 milisaniyede bir çağırırsan saniyede 1 kez ADC okursun. time değişkenine yüklenen değeri değiştirerek istediğin zamanı elde edersin. 
Bu yöntemi kullanarak, display yazma, eeprom yazma gibi daha uzun beklemeler gerektiren yerlerde çok daha etkin zamanlamalar elde edersin. Özellikle  OneWire için önerebileceğinm en etkin yol bu. 
STM32F103 kullanıyorsan eğer , loop zamanın mikrosaniyeleri geçmez.
Başlık: Ynt: STM32 Rtos Kurulumu
Gönderen: pisayisi - 28 Ocak 2013, 19:48:42
Systick kesmesini ve gecikmesini referans olarak kullan istediğin yenileme hızı ile yapmak istediğin görevleri tamamla, bütün rtos larda systick kesmesi kullanmakta...
Başlık: Ynt: STM32 Rtos Kurulumu
Gönderen: Mucit23 - 28 Ocak 2013, 21:26:14
Klein Hocam üzerinde yazılımın çok çalışmam lazım. Özellikle Şuanda ADC çok vaktimi alıyor. Çıkışlarımı kontrol altında tutan 15-20 parametre var. Bu parametrelerinde kontrolünü yapmam gerekecek. Bunlardada daha uğraşmadım ama bir sürü if else kullanmam gerekebilir.

Yazılımı iyi bir şekilde organize ederek bu sorunlara aşarım büyük ihtimal ama yinede ben Rtos üzerinde çalışmak istiyorum(Daha önce çok merak ediyordum deneme fırsatım olacak işte :))

Klein hocam Vaktiniz varsa eğer keil kendi rtos unu programıma adapte etmem için yapmam gerekenleri adım adım anlatabilirmisiniz
Başlık: Ynt: STM32 Rtos Kurulumu
Gönderen: Erol YILMAZ - 28 Ocak 2013, 21:31:31
Araştırılması gereken konu öncelikle "State Machine" dir.

Ben de çok görevli yazılımlarımı ekseriyetle bu teknikle yaptım,  çok ta verimli çalıştığını düşünüyorum.

Ayrıca şunu özellikle düşünmek gerekli,
   Gerçekten mcu yu meşgul eden ne var ?
   - ADC çevrimi uzun sürüyorsa bitince kesme oluşturacak şekilde ayarlanabilir.
   - Uart RX TX zaten kesmeli
   - Buton vs kontrolü kesmeli,
   - Sanırım halen "Brute delay" kullanmıyoruz. Systick ve diğer timer lar bu iş için yapılmış.

   - Veri gönderimi alımı vs uzun sürebilir. (TFT vs)
   - Float Matematiksel işlemler uzun sürebilir.

bunların da işe uygun çözümü bulunur sanıyorum.
Başlık: Ynt: STM32 Rtos Kurulumu
Gönderen: Mucit23 - 29 Ocak 2013, 09:33:34
Hocam bu state machine dediğiniz yapı çok kafamı karıştırdı açıkçası.

Şuanda ADC çevrimi çok vaktimi almıyor. Yani Çevrimin kendisi vakit almıyor. Yoksa ard arda 300'e yakın örnek alıp ortalamasını alarak filtre uyguluyorum. Ama her ölçüm arası 1ms beklemem gerekiyor. Bu yüzden tüm ölçümün bitmesini beklemek çok vakit alır. Bunun yerine her bir ölçüm arası gidip başka iş yapmam gerekiyor.

Beni ençok düşündüren aslında Sıcaklık sensörü. Sıcaklık sensörü işlemcinin elini kolunu bağlıyor. Bu konudada ete hoca bir çözüm getirmişti. Diyelim sıcaklık sensörü okunurken Sensöre çevrim emri verip geri dönmek gerekiyor. Çevrim işlemi bittikten sonra yani yaklaşık 700ms sonra gidip sensörü okumak gerekiyor.

Buradada aklımı kurcalayan bir konu bu zaman işlemlerini nasıl tutmak. Burada ikinici bir timermi kullanmak gerekir?

@Allegro

Hocam State Machine dediğiniz yapı hakkın bazı diyagramlar buldum. İşleyişi biraz kafamda canlandırabiliyorum ama tam oturmadı...

Siz uyguladıysanız nasıl yapmam gerektiğini anlatırsanız hemen deneyebilirim.
Başlık: Ynt: STM32 Rtos Kurulumu
Gönderen: f_machine - 29 Ocak 2013, 09:42:15
ADC den 300 örnek alma işini DMA ile yapabilirsin . DMA işlemciyi rahatsız etmeden 300 ADC değerini hafızaya yazar , daha sonra cpu birimine kesme atar . Böylece burada hiç vakit kaybetmemiş olursun.
Başlık: Ynt: STM32 Rtos Kurulumu
Gönderen: muhittin_kaplan - 29 Ocak 2013, 11:27:57
mucit elimdeki iş belli bir yere geldiğinde ilk işim http://www.coocox.com/EXAMPLE/ST_Keil_ARMCC.htm (http://www.coocox.com/EXAMPLE/ST_Keil_ARMCC.htm) inceleyip kullanmak olacak.
Başlık: Ynt: STM32 Rtos Kurulumu
Gönderen: memo333 - 29 Ocak 2013, 11:30:44
http://www.state-machine.com/index.php (http://www.state-machine.com/index.php)

bakalım ne imiş state-machine?
Başlık: Ynt: STM32 Rtos Kurulumu
Gönderen: z - 29 Ocak 2013, 12:03:58
"Sequential logic" devre tasarımını öğrenmeden mikroişlemci öğrenirseniz böyle olur işte.
Başlık: Ynt: STM32 Rtos Kurulumu
Gönderen: Mucit23 - 29 Ocak 2013, 12:06:15
Alıntı yapılan: memo333 - 29 Ocak 2013, 11:30:44
http://www.state-machine.com/index.php (http://www.state-machine.com/index.php)

bakalım ne imiş state-machine?

Sağol Teşekkür ederim. Şimdi State Machine Kavramı biraz daha netleşti. Fakat ben bu yapıyı baştan itibaren sistemime oturturabilirmiyim. Burada sistemi kurmak için farklı bir bilgisayar ortamı var. Birazcık Google un Appİnventor yapısına benzettim.

Ben şimdilik kodumu optimize etmeye çalışacağım. İyi bir organizasyonla bunlara gerek kalmayabilir.

Birde Rtos u sisteme oturturdum. Derliyorum fakat çalıştıramıyorum. İşlemci donuyor.

Main içeisinde yine sonsuz döngü var. Acep ondanmı kaynakanıyor?

Alıntı yapılan: z - 29 Ocak 2013, 12:03:58
"Sequential logic" devre tasarımını öğrenmeden mikroişlemci öğrenirseniz böyle olur işte.

Yapımızda var hocam. Tersten gidiyoruz.. :D
Başlık: Ynt: STM32 Rtos Kurulumu
Gönderen: haydarpasamikro - 14 Şubat 2013, 21:38:56
Yöntem:

Mikrodenetleyicinizin Timer ını 1 saniye kesme oluşturacak şekilde ayarlayın.
Kesme içerisinde 1 saniye sonunda TimerFlag aktif edin.

RTC 1 saniye de bir donanım kesmesi göndermeye ayalanabilir.

Ana programda.
Tuş takımını tarayın. Basılan tuş ile ilgili işlem yapın. Ancak tarama sırasında veya bir bekleme fonksiyonun içerisinde gelen kesmelere ait flag leri denetleyin. Kesme varsa ilgili öncelikli işleri fonksiyon olarak yaptırın. RTC den zamanı okumak gibi. ADC okumak gibi. Sonra aciliyeti olmayan diğer işlere devam edin.

Timer kesmesi sizin için 1 saniyelik periyotta mutlaka yapılması gereken işler için geniş bir zaman dilimi sağlar.
Başlık: Ynt: STM32 Rtos Kurulumu
Gönderen: Mucit23 - 21 Şubat 2013, 17:27:24
Arkadaşlar bugün biraz Rtos a bakayım dedim. Derliyorum ama işlemci hiç çalışmıyor.

Rtos konusunda, daha doğrusu keilin kendi rtos kütüphanesinin kullanımı hakkında bilgim yok, Copy paste ile deneme yapıyorum.

Kodlarım bu şekilde,
#include "stm32f107.h"
#include "string.h"
#include "RTL.h"

OS_TID t_phaseA;                        /* assigned task id of task: phase_a */
OS_TID t_phaseB;                        /* assigned task id of task: phase_b */

__task void phaseA (void) {
  for (;;) {
output(portC,0xFFFF);
os_dly_wait (400);
output(portC,0x0000);
os_dly_wait (400);
  }
}

/*----------------------------------------------------------------------------
*        Task 2 'phaseB': Phase B output
*---------------------------------------------------------------------------*/
__task void phaseB (void) {
  for (;;) {
    os_evt_wait_and (0x0001, 0xffff);    /* wait for an event flag 0x0001    */     
output(portE,0xFFFF);
os_dly_wait (400);
output(portE,0x0000);
os_dly_wait (400);
  }
}

__task void init (void) {

  os_mut_init(phaseA);

  t_phaseA = os_teşekkür_create (phaseA, 0); 
  t_phaseB = os_teşekkür_create (phaseB, 0); 
  os_evt_set (0x0001, t_phaseA);       
  os_teşekkür_delete_self ();
}

int main()
{
SystemInit();
setOutMode(portA,0xFFFF);  //A portunun tamami çikis yapildi.
setOutMode(portC,0xFFFF);  //C portunun tamami çikis yapildi.
setInMode(portD,0xFFFF);  //D portunun tamami Giris
setOutMode(portE,0xFFFF);  //D portunun tamami çikis yapildi.       

   //output(portE,0xffff);
os_sys_init (init);
//    while(1){
//     outputBit(portE,0x0000,readPortBit(portD,0x0080));
//     outputBit(portE,0x0002,readPortBit(portD,0x0040));
//    }
}


Proje ağacıda bu şekilde
(http://s17.postimg.cc/uyypbtb9r/Ekran_Al_nt_s.png) (http://postimg.cc/)
photo sharing websites (http://postimg.cc/)
Acaba nereleri eksik yapıyorum?
Başlık: Ynt: STM32 Rtos Kurulumu
Gönderen: Mucit23 - 22 Şubat 2013, 13:36:34
Değerli Hocamlarım, Yorum yapacak olan yokmu?
Başlık: Ynt: STM32 Rtos Kurulumu
Gönderen: yamak - 22 Şubat 2013, 14:05:16
Hocam init task'ın da PhaseA ye event gönderiyosun ama PhaseA taskı'ını başına event bekleme koyamamışsın. 0x0001 nolu event'i PhaseB de bekliyosun.
Başlık: Ynt: STM32 Rtos Kurulumu
Gönderen: Mucit23 - 22 Şubat 2013, 15:04:15

Bir önceki yazdığım mesajda kod verirken kodun orjinali böyle olacaktı

__task void init (void) {

  os_mut_init(phaseA);

  t_phaseA = os_tsk_create (phaseA, 0); 
  t_phaseB = os_tsk_create (phaseB, 0); 
  os_evt_set (0x0001, t_phaseA);       
  os_tsk_delete_self ();
}


os_tsk_create tanımları otomatikmen Teşekkür olarak dönüştürülmüş  :o

Yamak hocam,

Rtos konusunda Daha doğrusu keilin kendi rtos kütüphanesi kullanımı hakkında çok problemlerim var. Deneme yanılma gidiyorum şuanda. Sadece bir çalışmasını göreyim daha sonra oturup teker teker kütüphane işleyişini öğreneceğim.

Şimdilik aklıma takılanlar şunlar.

1-) Basit iki adet Task oluşturup bu tasklara belirlenen aralıkta nasıl event gönderirim?
2-) Herhangi bir taska event geldiğinde o task içerisinde neler yapmam gerekir

Bu sorularımı cevaplayıp deneme programımı çalıştırabilirsem çok iyi olacak benim için.
Başlık: Ynt: STM32 Rtos Kurulumu
Gönderen: yamak - 22 Şubat 2013, 15:49:09
Hocam mesela SysTick_Timer'ı kullanabilirsin.Timer belli aralıklarla PhaseA ya event gönderir.PhaseA'da işi bitince PhaseB ye gönderir.Sonra timer yine PhaseA  ya gönderir böyle sürüp gider.
Başlık: Ynt: STM32 Rtos Kurulumu
Gönderen: Mucit23 - 22 Şubat 2013, 16:01:43
Tescillemiş oldum

t.s.k(nokta olmaksızın) yazınca forum editörü "tsk" olarak yansıtıyor.

Her neyse

Yamak hocam keil ile birlikte gelen stm32 RTX örneklerini inceliyorum. Onlarda Sys_Tick Timer gibi donanımlar kullanılmıyor Anlamadım bu işi.

Başlık: Ynt: STM32 Rtos Kurulumu
Gönderen: mufitsozen - 22 Şubat 2013, 16:36:53
Alıntı yapılan: Mucit23 - 22 Şubat 2013, 16:01:43
Tescillemiş oldum

t.s.k(nokta olmaksızın) yazınca forum editörü "teşekkür" olarak yansıtıyor.

Her neyse

Yamak hocam keil ile birlikte gelen stm32 RTX örneklerini inceliyorum. Onlarda Sys_Tick Timer gibi donanımlar kullanılmıyor Anlamadım bu işi.

Alıntı Yap
Time Management Routines:

os_dly_wait      Pauses the calling task for a specified interval.
os_itv_set      Enables the calling task for periodic wake up.
os_itv_wait      Pauses the calling task until the periodic wake up interval expires.
os_time_get      Obtains the current OS time in clock ticks.


User Timer Management Routines

os_tmr_create      Starts a countdown timer to call the os_tmr_call function.
os_tmr_kill      Aborts a user defined timer.
os_tmr_call      User customizable function that gets called when the user defined timer expires.
Başlık: Ynt: STM32 Rtos Kurulumu
Gönderen: yamak - 22 Şubat 2013, 16:47:41
Alıntı yapılan: Mucit23 - 22 Şubat 2013, 16:01:43
Tescillemiş oldum

t.s.k(nokta olmaksızın) yazınca forum editörü "teşekkür" olarak yansıtıyor.

Her neyse

Yamak hocam keil ile birlikte gelen stm32 RTX örneklerini inceliyorum. Onlarda Sys_Tick Timer gibi donanımlar kullanılmıyor Anlamadım bu işi.
Hocam ben sysTick'i örnek verdim başka şekilde de kullanılabilir. Mesela her taska birbirine event gönderterek de yapılabilir.
Başlık: Ynt: STM32 Rtos Kurulumu
Gönderen: mufitsozen - 22 Şubat 2013, 16:51:51
sysTick bir RTOS ortaminda direk olarak kullanmak ancak cok olaganustu sartlarda yapilir. onun yerine Timerlar kullanilir.

Başlık: Ynt: STM32 Rtos Kurulumu
Gönderen: Mucit23 - 22 Şubat 2013, 16:56:50
Öyle birşey yapmaya çalıştım aslında, ama eksik yaptığım birşeyler var.

init fonksiyonunda phaseA 'ya event gönderiyorum. Oradanda phaseB'ye

Gerçekte olan biten hiç birşey yok malesef

#include "stm32f107.h"
#include "string.h"
#include "RTL.h"

OS_TID t_phaseA;                        /* assigned task id of task: phase_a */
OS_TID t_phaseB;                        /* assigned task id of task: phase_b */

__task void phaseA (void) {
  for (;;) {   
os_evt_wait_and (0x0001, 0xffff);   /* wait for an event flag 0x0001     */
    output(portE,0xFFFF);
    os_evt_set (0x0002,t_phaseB);      /* send event to task 'ledoff'       */
    os_dly_wait (1000);                  /* delay 50 clock ticks              */
  }
}
/*----------------------------------------------------------------------------
*        Task 2 'phaseB': Phase B output
*---------------------------------------------------------------------------*/
__task void phaseB (void) {
  for (;;) {
    output(portE,0x0000);
    os_dly_wait (1000);                    /* delay 8 clock ticks               */
    os_evt_set (0x0001,t_phaseA);
  }
}

__task void init (void) {

  t_phaseA = os_tsk_create (phaseA, 0); 
  t_phaseB = os_tsk_create (phaseB, 0);
  os_evt_set (0x0001,t_phaseA);
  os_tsk_delete_self ();
}

int main()
{
SystemInit();
setOutMode(portA,0xFFFF);  //A portunun tamami çikis yapildi.
setOutMode(portC,0xFFFF);  //C portunun tamami çikis yapildi.
setInMode(portD,0xFFFF);   //D portunun tamami Giris
setOutMode(portE,0xFFFF);  //D portunun tamami çikis yapildi.       
os_sys_init (init);

}


Son olarak böyle denedim

Müfit hocam, Şimdilik timer yerine iki taskın birbirine event göndermesini yapabilsem çok iyi olacak. Timeri kurmak kolay ama ilk önce şu event yapısını felan iyi öğrenmem gerekiyor.

Yukarıdaki kodlarda nerede hata yapıyorum onu anlayamadım
Başlık: Ynt: STM32 Rtos Kurulumu
Gönderen: yamak - 22 Şubat 2013, 17:02:05
Hocam PhaseA ve PhaseB yi aşağıdaki gibi değiştirir misin?
__task void phaseA (void) {
  for (;;) {   
        os_evt_wait_and (0x0001, 0xffff);   /* wait for an event flag 0x0001     */
    output(portE,0xFFFF);
    os_dly_wait (1000);                  /* delay 50 clock ticks              */
     os_evt_set (0x0002,t_phaseB);      /* send event to task 'ledoff'       */
  }
}
__task void phaseB (void) {
  for (;;) {
    os_evt_wait_and (0x0002, 0xffff);
    output(portE,0x0000);
    os_dly_wait (1000);                    /* delay 8 clock ticks               */
    os_evt_set (0x0001,t_phaseA);
  }
}
Başlık: Ynt: STM32 Rtos Kurulumu
Gönderen: Mucit23 - 22 Şubat 2013, 17:12:48
hocam değiştirdim ama sonuç aynı,

init fonksyonunda bir problem olabilirmi?
Başlık: Ynt: STM32 Rtos Kurulumu
Gönderen: yamak - 22 Şubat 2013, 17:15:43
os_evt_wait_and ifadelerini os_evt_wait_or olarak değiştirmeyi dener misin?
Başlık: Ynt: STM32 Rtos Kurulumu
Gönderen: Mucit23 - 22 Şubat 2013, 17:23:29
Hocam değiştirdim ama sorun düzelmedi.

Birkaç deneme yaptım, init fonksiyonunun en başında porte ye 0xffff verdim ama sanırım kod işlenmediki porte FFFF olmadı.

Demekki işlemci init fonksiyonuna hiç gelemiyor. Bu durumda ne yapmak gerekir
Başlık: Ynt: STM32 Rtos Kurulumu
Gönderen: Erol YILMAZ - 22 Şubat 2013, 20:37:00
Rtos tarzı şeylerin beni rahatsız eden tek bir uygulaması var...

Ledli yazı vs gibi uygulamalar...


Çünkü ledler %1 lik bir farkı bile hemen göze sokuyor.
Nispeten alt seviye mcu lar ile sağlam görünüşlü ledli işler için alt seviyeli timerlar kullanılmak zorunda gibime geliyor.

Aynı işi çok daha hızlı bir mcu ile yaparsak bahsettiğim %1 belki de binde 1 e düşecek orası ayrı konu.
Başlık: Ynt: STM32 Rtos Kurulumu
Gönderen: z - 22 Şubat 2013, 20:44:53
İşin içine rtos girdimi benim kafamda oluşan yapı;

CPUnun yardımcıları olacak bu yardımcıların bufferları olacak.

Köleler harıl harıl çalışırlarken efendi bunlara ara ara görevler verecek.
Başlık: Ynt: STM32 Rtos Kurulumu
Gönderen: Mucit23 - 22 Şubat 2013, 23:00:44
Normalde Timer kullanmadan bu iş olmuyor sanırım. Şu ilk aşamayı bir geçebilsem işi götürecem.

Bülent hocam, Sizin burda köle dediğiniz bizim tasklarımız oluyor sanırım. Efendi dediğimiz kişide timer olacak. Sırası geldiğinde kölelere emir verecek. KAfamda canlanıyor. Birde yazdıklarım gerçekte canlansa süper olacak.
Başlık: Ynt: STM32 Rtos Kurulumu
Gönderen: Mucit23 - 25 Şubat 2013, 09:38:39
Değerli abilerim, iki gündür incelemediğim program denemediğim yol kalmadı. Çalışmıyor.  :(Daha başka Ne yapabilirim??
Başlık: Ynt: STM32 Rtos Kurulumu
Gönderen: teknikelektronikci - 25 Şubat 2013, 10:07:17
Alıntı yapılan: Mucit23 - 25 Şubat 2013, 09:38:39
Değerli abilerim, iki gündür incelemediğim program denemediğim yol kalmadı. Çalışmıyor.  :(Daha başka Ne yapabilirim??

hocam bence hic rtos vs ugrasma kendi kodunu optimize etmeye calis veya fpga ya gec :D
Başlık: Ynt: STM32 Rtos Kurulumu
Gönderen: Mucit23 - 25 Şubat 2013, 10:12:05
Hocam o iş bitti bile, Zaten orada rtos veya benzeri bir yapı kullanmadım. Klein Hocamızın spagetti kod deyiminden yola çıkarak yazdığım programda birçok iyileştirme düzenleme hizalama gibi şeyler yaptım. Programcılık adına birkaç ufak detay öğrenmiş oldum.

Ben şuanda Rtos u öğrenmek istiyorum sadece.