STM32F4 RTOS

Başlatan Farukc, 18 Temmuz 2013, 16:50:15

Farukc

STM32F4 kullanıyorum. Fakat bir türlü bu rtos işini çözemedim. İnternetten demo uygulamalar indirdim fakat anlamadım. Baby rtosu inceledim fakat yine beceremedim. :( Bana bu konuda bir yardımcı olurmusunuz?

Erol YILMAZ


Yuunus

Anlamakta mı zorlanıyorsunuz yoksa kodunu yazmak ta mı? çünki anlamaya çalışıyorsanız hep pic hemde arm üzerinde çok konuşuldu.

serdararikan

Bence rtos un temel mantiginin anlasilmasinda bir problem var.ozellikle ingilizce problemi olan birisinin bu mantigi orneklere bakarak anlamasi zor gorunuyor

ayhan_eee

http://www.keil.com/pack/doc/arm/cmsis/cmsis_rtx/doc/_using.html sitesini incele.Ben bitirme tezimde CMSIS RTX rtos kullanmıştım.Ancak önerim şu ki debug kısmıyla fazla kafa yorma benim 1 haftamı yedi debug da yanlış işler yapan kod gerçekte çalışabiliyor.

Farukc

İngilizcem yetersiz doğru örneklerle anlamıyorum. İsteğim kolay anlayabileceğim bir rtos özellikle stm32f4 için?
???

ayhan_eee

Acikcasi ingilizceniz yetersiz ise daha onceden calisan birinin aciklamasindan baska caren kalmiyor. Kaynaklar hep ingilizce. Ama cok da agir degil acikcasi. Bence Zorlamalisiniz kendinizi.

Farukc

#7
Elimden geleni yapıyorum İngilizcem çkta kötü değil fakat Keil örneklerini çözemiyorum. Keilin kendi rtos u ilgimi çekti.

Keilin kendi RTOSu hakkında bilgi veya örnek verebilecek arkadaşlardan yardım istiyorum.

Farukc

#8
#include "STM32F4xx.h"
#include <RTL.h>

void SystemInit()
{
unsigned int i;

    (*((int*)0xE000ED88))|=0x0F00000;  
    for (i=0;i<0x00100000;i++);          // OSC oturtma ve kurtarma rutini
    RCC->CFGR |= 0x00009400;         // AHB ve APB hizlarini max degerlere set edelim
    RCC->CR |= 0x00010000;            // HSE Xtal osc calismaya baslasin        
    while (!(RCC->CR & 0x00020000));// Xtal osc stabil hale gelsin
    RCC->PLLCFGR = 0x07405408;      // PLL katsayilarini M=8, N=336, P=2 ve Q=7 yapalim
//  RCC->PLLCFGR = 0x07402A04;     // PLL katsayilarini M=4, N=168, P=2 ve Q=7 yapalim
    RCC->CR |= 0x01000000;            // PLL calismaya baslasin  (Rehber Sayfa 95)
    while(!(RCC->CR & 0x02000000)); // Pll hazir oluncaya kadar bekle
//  FLASH->ACR = 0x00000705;        // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
    FLASH->ACR = 0x00000605;        // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
    RCC->CFGR |= 0x00000002;        // Sistem Clk u PLL uzerinden besleyelim
    while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Besleninceye kadar bekle
    RCC->AHB1ENR |= 0x0000000F;    // GPIO A,B,C,D clock'u aktif edelim 
    GPIOD->MODER = 0x55000000;     // GPIOD nin 15, 14, 13, 12 pinleri cikis tanimlandi (LEDler icin)
    GPIOD->OSPEEDR= 0xFFFFFFFF;   // GPIOD nin tum cikislari en yuksek hizda kullanacagiz 
} 


__task void task1 (void) { 
for (;;) { 

}
}

__task void task2 (void) {
for (;;) {

}
}

__task void init (void) {
os_tsk_create (task1, 1); 
os_tsk_create (task2, 1); 
os_task_delete_self ();
}


int main()
{
    SystemInit();
		os_sys_init (init);
}


Keilde böyle bir örnek yaptım fakat şöyle bir hata veriyor:

.\MyProject.axf: Error: L6200E: Symbol SystemInit multiply defined (by main.o and system_stm32f4xx.o).
".\MyProject.axf" - 1 Errors, 1 Warning(s).

Yardımlarınızı bekliyorum...

Farukc

Alıntı yapılan: gerbay - 19 Temmuz 2013, 08:11:45
bunun rtos ile ilgisi yok. hem projenize dahil ettiğiniz "system_stm32f4xx.c" dosyasının içerisinde hem de "main.c" dosyanızın içerisinde "SystemInit" metodu var. alet hangisini kullanacağını şaşırıyor.  SystemInit i teke düşürün.

bir de stringleriniz hariç kod bloklarında ingiliz alfabesinde olmayan karakterleri kullanmayın; kodunuzdan örnek: "os_teşekkür_create"

2 task create ediyorsunuzi, ikiside sonsuz döngüde çalışıyor ve herhangi bir scheduling e yol açacak işlem yok döngü içerisinde, bu durumda pre-emptive çalışıyorsanız işlemciyi alan task bir daha bırakmaz.. ya round robin yapın RTX her time tick de diğer task a switchlesin, ya "os_dly_wait" çağrısı yapın, ya da başka bir task scheduling e sebep olacak iş yapın.. mesela birisi event üretsin, diğeri o event i beklesin falan filan..

Türkçe karakter kullanmıyorum os_t-s-k olacaktı ama forum t-s-k harflerini yanyana görünce teşekkür yapıyor. Şimdi deniyeceğim teşekkürler..

Farukc

#include "STM32F4xx.h"
#include <RTL.h>
OS_TID t_tsk1;                       
OS_TID t_tsk2; 


void SystemInit()
{
unsigned int i;

    (*((int*)0xE000ED88))|=0x0F00000;  
    for (i=0;i<0x00100000;i++);          // OSC oturtma ve kurtarma rutini
    RCC->CFGR |= 0x00009400;         // AHB ve APB hizlarini max degerlere set edelim
    RCC->CR |= 0x00010000;            // HSE Xtal osc calismaya baslasin        
    while (!(RCC->CR & 0x00020000));// Xtal osc stabil hale gelsin
    RCC->PLLCFGR = 0x07405408;      // PLL katsayilarini M=8, N=336, P=2 ve Q=7 yapalim
//  RCC->PLLCFGR = 0x07402A04;     // PLL katsayilarini M=4, N=168, P=2 ve Q=7 yapalim
    RCC->CR |= 0x01000000;            // PLL calismaya baslasin  (Rehber Sayfa 95)
    while(!(RCC->CR & 0x02000000)); // Pll hazir oluncaya kadar bekle
//  FLASH->ACR = 0x00000705;        // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
    FLASH->ACR = 0x00000605;        // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
    RCC->CFGR |= 0x00000002;        // Sistem Clk u PLL uzerinden besleyelim
    while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Besleninceye kadar bekle
    RCC->AHB1ENR |= 0x0000000F;    // GPIO A,B,C,D clock'u aktif edelim 
    GPIOD->MODER = 0x55000000;     // GPIOD nin 15, 14, 13, 12 pinleri cikis tanimlandi (LEDler icin)
    GPIOD->OSPEEDR= 0xFFFFFFFF;   // GPIOD nin tum cikislari en yuksek hizda kullanacagiz 
} 

__task void task1 (void) { 
for (;;) { 
	os_dly_wait (100);
	GPIOD->ODR= 0x0000F000;
}
}

__task void task2 (void) {
for (;;) {
	os_dly_wait (100);
	GPIOD->ODR= 0x00000000;
}
}

__task void init (void) {
	t_tsk1 = os_tsk_create (task1, 0); 
  t_tsk2 = os_tsk_create (task2, 0); 
  os_tsk_delete_self ();
}


int main()
{
    SystemInit();
		os_sys_init (init);
	
}


Yaptım arkadaşlar ledleri tasklarla flash eden program.Anlamadığınız yeri sorabilirsiniz.Yanlız dediğim gibi teşekkür kelimesi gördüğünüz yere teşekkürü silip  t-s-k (tireler olmadan yazın) yazın.Forum t-s-k harfleri yanyana iken teşekkür yapıyor ondan.. Herkese teşekkürler..

X-Fi

 :) bende kod içersindeki bu teşekkürlerin anlamını çözememiştim task'mış demek code görüntüleyici içinde bu tarz filtrelemelerin düzeltilmesi gerekiyor sanırım.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

Kaanx

Neden RTOS ? sağladıkları nedir ?

camby

Alıntı yapılan: Kaanx - 19 Temmuz 2013, 14:21:49
Neden RTOS ? sağladıkları nedir ?
işletim sistemi. N tane işin uyumlu bir şekilde bir arada çalışmasını sağlamak. Windows ortamında ctrl+alt+del e basınca listelenen işlemlerin bir arada uyumlu bir şekilde çalışmasını sağlayan işletim sistemdir. Önceliklerine göre sürekli ve sırayla bu işlemlerle ilgilenir.

Dezavantajları da var , düzgün kurgulanmamışsa mp3 çalarken yada tft'ye data yollarken task yöneticisi , sen bekle biraz da şurada daha önemli bir işim var diyebilir. Eski PC'lerde PC kastığında mp3 yavaşlıyordu diğer tasklar etkileniyordu vsvs.

Fakat işlerimde ben de RTOS kullanmadım henüz. DMA ve FSMC şu an için benim adıma sağa sola koşturuyor.

Farukc

#14
Alıntı yapılan: Kaanx - 19 Temmuz 2013, 14:21:49
Neden RTOS ? sağladıkları nedir ?

En önemlisi multi tasking özelliği çok hayat kurtarıcı bir olay yoksa bir kısır döngü içinde programı kontrol etmek zor oluyor. Örneğin ekrana bişey yazdıracaksınız mesala gelen voltaj önce voltaj okunur sonra yazdırılır. Ama rtos birazdaha farklı daha gelişmiş uygulamalarda mesela bir devrede ethernet, rs232, lcd vga gibi bir çok giriş çıkış var fakat sizin ethernettten gelen bilgiyi gelir gelmez okumanız lazım. Ama o sıradada Lcdye rs232 değerleri yazdırılacak işte bu noktada rtos süper bişey oluyor  ;D

mesaj birleştirme:: 19 Temmuz 2013, 15:07:20

Arkadaşlar bide bu kodları çalıştırabilmek için c:/keil/arm/board/st/stm32f4 discovery dizininde rtx bilinky adlı klasör var oradaki RTX_Conf_CM.c adlı dosyayı proje klasörünüze koplyalayıp projeye ekleyin yoksa çalışmaz.