STM32 Rtos Kurulumu

Başlatan Mucit23, 28 Ocak 2013, 17:57:58

Mucit23


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.

yamak

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.

Mucit23

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.


mufitsozen

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.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

yamak

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.

mufitsozen

sysTick bir RTOS ortaminda direk olarak kullanmak ancak cok olaganustu sartlarda yapilir. onun yerine Timerlar kullanilir.

Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

Mucit23

Ö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

yamak

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);
  }
}

Mucit23

hocam değiştirdim ama sonuç aynı,

init fonksyonunda bir problem olabilirmi?

yamak

os_evt_wait_and ifadelerini os_evt_wait_or olarak değiştirmeyi dener misin?

Mucit23

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

Erol YILMAZ

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.

z

İş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.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Mucit23

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.

Mucit23

Değerli abilerim, iki gündür incelemediğim program denemediğim yol kalmadı. Çalışmıyor.  :(Daha başka Ne yapabilirim??