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?
Keil le beraber gelen RTOS u denediniz mi ?
http://www.keil.com/rl-arm/kernel.asp (http://www.keil.com/rl-arm/kernel.asp)
Anlamakta mı zorlanıyorsunuz yoksa kodunu yazmak ta mı? çünki anlamaya çalışıyorsanız hep pic hemde arm üzerinde çok konuşuldu.
Bence rtos un temel mantiginin anlasilmasinda bir problem var.ozellikle ingilizce problemi olan birisinin bu mantigi orneklere bakarak anlamasi zor gorunuyor
http://www.keil.com/pack/doc/arm/cmsis/cmsis_rtx/doc/_using.html (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.
İngilizcem yetersiz doğru örneklerle anlamıyorum. İsteğim kolay anlayabileceğim bir rtos özellikle stm32f4 için?
???
Acikcasi ingilizceniz yetersiz ise daha onceden calisan birinin aciklamasindan baska caren kalmiyor. Kaynaklar hep ingilizce. Ama cok da agir degil acikcasi. Bence Zorlamalisiniz kendinizi.
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.
#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...
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..
#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..
:) 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.
Neden RTOS ? sağladıkları nedir ?
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.
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.
Alıntı yapılan: camby - 19 Temmuz 2013, 15:02:15
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.
Sureklı donuyor ortalıkta Real Time Operating systemler Ben hawkboardla çalısıyorum bu aralar linux Kernel debug işlemleri üzerindeyim Kernel yerine böyle RTOS kurup işlerimi yapabilir miyim amaç aynı olucak zaten sadece zamandan kazanc için ve tabi ne kadar stabil çalısabilir işlmeci üzerinde yapılandırmalarını denemk lazım bir uygulama üzerinde. Sanırım bu tarz RTOS lar daha düşük yapılı işler için. Hep aklıma takılır neden RTOS kullanırız bize sagladıgı nedir diye sanırım biraz oturmaya başladı. İlk başta biz biraz iteliyoruz bunu sonra alıp gidiyor. Arkada koşan tasklar bize yardımcı mı oluyor o zaman ?
mesaj birleştirme:: 19 Temmuz 2013, 15:49:53
Alıntı yapılan: Farukc - 19 Temmuz 2013, 15:05:10
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.
Yani task lar arkada sureklı calısır konumda ve hazı bekliyorlar dediğiniz gibi rs232 den bir bilgi gelıyor onu lcd ye atıcam mesela o bölgede calısan tasklar anında onu alıp ekrana getırıyor ve bunu ekrana getırırkende demıyor mp3 caldırmayı durdur da ben sunu bi lcd ye yazayım aynı zamanda lcd ye yazı gelıyor hemde mp3 calıyor vs vs vs bir cok işlem olmaya devam ediyor. Yani bu task ları nasıl olusturuyoruz kernel dedikleri bize bunu saglıyor olmalı .
hocam
bu yakın zamanda birçok linux çalıştıran SBC kart çıktı
burdaki linux sürümleri de RTOS mudur ?
yani Real Time OS midir ?
Alıntı yapılan: magnetron - 19 Temmuz 2013, 16:25:08
hocam
bu yakın zamanda birçok linux çalıştıran SBC kart çıktı
burdaki linux sürümleri de RTOS mudur ?
yani Real Time OS midir ?
Demek istediğinizi anlamadım. Kusura bakmayın..
gerbay hocamın verdiği cevabı sormuştum
benim başka bir sorum var
madem linux RTOS değil o zaman neden
bu beaglebone vesaire SBC ler ille de linux ile satılıyor
mis gibi RTOS olan WinCE neden desteklenmiyor ?
RTOS "verimli" demek değildir.
RTOS "cortex'lerin işletim sistemi" değildir.
RTOS "yüksek hızlı" demek değildir.
RTOS "kolay ve kompakt" kullanım demek değildir.
RTOS'un ne işe yaradığını bilmiyorsanız ihtiyacınız yoktur
rtos hakkında pek bir bilgimin olduğu söylenemez. vermiş olduğunuz örnekleri inceleyince rtos hakkında kafamda birşeyler canlanmış durumda. bende kendi çapımda tek çekirdeği olan bazı mikrodenetleyiciler üzerinde multitasking yaptırabiliyorum, kendimce multitasking hakkında bazı standartlar edinmiş durumdayım. bunun üzerine bir kaç soru sormak istiyorum.
1. RTOS ta farklı "__task" lar arasında çekirdek nasıl bir geçiş sağlıyor ? bu rastgele mi oluyor? yani diyelim ki bir task içerisinde kritik bir kod işleniyor ve başka task lar arasında geçiş olmasını istemiyorsak, şeklinde düşünmeme sebep oldu bu soru.
2.
main(){
hazirlik();
timer_aktif();
// __task 1
while(1){
}
// __task 2
while(1){
}
.
.
.
// __task n
while(1){
}
}
interrupt timer(){
for(k=30; 0<k; k--)ProgramHafizasi[task][k]=CallStack[k]; // mevcut task için yığın kaydet
if(task<n)task++; else task=0; // sonraki taska geçiş yap
for(k=30; 0<k; k--)CallStack[k]=ProgramHafizasi[task][k]; // geçiş yapılan task yığınlarını yükle
}
şeklinde bir yapı oluştursak buna rtos demek doğru olur mu?
kritik olan işleme öncelik sağlayabiliyorsunuz.
Sonuc olarak arkada çalışan ve sistemi yoran bir sürü task olucak dimi hocam ? hasan arkadaşımızın verdiği 2. örnek gibi işler durumda mı oluyor ?
Evet arkada denetlenen birsürü task olacak ancak diğer tasklar çekirdeği ne kadar yoruyor bu da önemli harıl harıl çalışan bir işlemciyi yönetmek kolay değil karşına birton sorun çıkabilir bir de işin içine interruptlar girerse işler iyice çığrından çıkıyor. tasklar arasında öncelik olduğu gibi intrpr lar arasındada öncelikler var biri diğerinin işini bozabilir. çalıştığınız kitin manuelini iyice hatmedip sonra yazacapınız kodları ona göre yönetmeniz daha akıllıca. ingilizceniz varsa stm nin "Building Applications with RL-ARM ( linkini bulamadım)" isminde bir dokumanı var onu incelerseniz ve bol bol örnek yaparsanız size daha faydalı olur.
Bu kadar işlem yerine sabahtan beri direttğim kernel yuklemek daha mantıklı degıl mı ?yada u-boot yapmak ?
...tercih meselesi tabiki ama kullanmayı öğrendikten sonra vazgeçmekte zor oluyor özellikle kritik işlemlerin varsa! şunuda unutmamak gerek kernel yükleyerek kodlarını başka yazılımlara emanet ediyorsun ama rtos ile kendi kontrolun altında oluyor. Belki kernelde de task yönetimi vardır, bilmiyorum denemek gerek.
Dediğinizde haklısınız hocam kernelden sonra bir dosya sistemi koşturmak gerekiyor ama koşan tasklar kernelde mi yoksa o sonradan başlayan dosya sisteminde mi koşuyor bilmiuorum ?
Dosya sistemi koşan birşey değildir, yazılımlar, daha doğrusu process'ler veya thread'ler koşar. Yazılımlar ise kernel bölgesinde veya kullanıcı bölgesinde çalışabilir. Normalde uygulama yazılımları kullanıcı bölgesinde çalışır, aynı bilgisayardaki genel yazılımlar gibi. Bunlar process (süreç) olarak adlandırılır. Bunun dışında, process'ler de kendi içlerinde thread (bunun karşılığı Türkçe terimi unuttum) adı verilen ufak parçalardan oluşuyor olabilir. Linux kernel'inin bakış açısına göre bu ikisinin çalışması arasında pek fark yok ama özellikle hafıza paylaşımı konusunda bazı farklar bulunuyor.
Linux kernel'inin real time versiyonları da var. Ama korkarım bu konudaki bilgim sadece var olduklarını bilmekle sınırlı. Bu kernel'ler derlenirken, kernel konfigürasyonu sırasında task switching ile ilgili bölümde real time çalışma istendiğinin belirtilmesi gerekiyor. Uygulama programlamasının nasıl olacağı ile ilgili hiçbir fikrim yok.
Kernel üzerinde yaptıgım compile işlemlerinden sonra kısaca sunu anladım hocam boş bir cihazı u-boot luyoruz daha sonra kernel ı bir filesystemla attach ediyoruz ve bundan sonra işlemlerimiz koşmaya başlıyor. bu sırada dediğiniz gibi bu olay bize tam bir RTOS sağlamıyor. DSP işlemcilerle koşulması daha iyi sonuçlar cıkardıgını duydum. Örneğin Ti in SYS/BIOS yapıları yada starterware yazılımı basit bir RTOS sanırım tabi burada DSP işlemcininde özelliği işe hız katıyor sanırım anladıgım kadarıyla. Kernel derlenirken lınux üzerinde cross compıler kullanarak olusturuyoruz vmlinuxla start dosyalarını olusturms oluyoruz. Derleme işlemi make menuconfig ten yapılıyor burada kernelin kullanacagı özellikleri ve cihazlarla olan baglantıları var kısaca hersey orada tanımlanıyor örnegın usb bırımını eth bırımını buradan acıyoruz. Sımdı bu durumda actıgım bu birimlerin koşması için mi tasklar arkada devam ediyor.mesela suan bilgisayara baglı hiç bir usb yok ve o birimden herhangi bir cıktı almıyorum ama bagladıgımda usb için olana driver tetiklenip o bölüme ait task mı bunu bize getiriyor ? Ve bu kosulan threadler veya gelen interruptlar neye göre belirleniyor. ? işlemcilere göre mi yoksa bunlar zaten hali hazırda olan işlemci buna göre mi yapılandırıyor kendi ni ?