Bu kadar Kolay Olamaz.

Başlatan muhittin_kaplan, 18 Kasım 2012, 20:53:36

muhittin_kaplan

Neden Bilmiyorum ama içimden bir ses "bukadar kolay olamaz" diyor.
CooCox ile çalışıyorum. CoOS adında bir RTOS var.
/**
  ***************************************************************************** 
  * @title   main.c
  * @author  slachist@gmail.com
  * @date    31 Oct 2012
  * @brief   
  *******************************************************************************
  */
////// The above comment is automatically generated by CoIDE ///////////////////

#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include <CoOs.h>

#define STACK_SIZE_DEFAULT 512

OS_STK task1_stk[STACK_SIZE_DEFAULT];
OS_STK task2_stk[STACK_SIZE_DEFAULT];

void initializeBoard(){

	GPIO_InitTypeDef GPIO_InitStructure_Led;
	GPIO_InitTypeDef GPIO_InitStructure_Button;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//for LEds
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//for buttons

	GPIO_InitStructure_Led.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
	GPIO_InitStructure_Led.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure_Led.GPIO_Speed = GPIO_Speed_50MHz;

	GPIO_InitStructure_Button.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure_Button.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_InitStructure_Button.GPIO_Speed = GPIO_Speed_50MHz;

	GPIO_Init(GPIOC,&GPIO_InitStructure_Led);
	GPIO_Init(GPIOA,&GPIO_InitStructure_Button);

}

void task1 (void* pdata){
	while(1){
		GPIO_WriteBit(GPIOC,GPIO_Pin_8,Bit_SET);
		CoTickDelay (10);
		GPIO_WriteBit(GPIOC,GPIO_Pin_8,Bit_RESET);
		CoTickDelay (10);
	}
}

void task2 (void* pdata){
	int i;
	while(1){
		i = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0);
		GPIO_WriteBit(GPIOC,GPIO_Pin_9,i);
	}
}

int main(void)
{
	initializeBoard();
	CoInitOS();

	CoCreateTask(task1,0,0,&task1_stk[STACK_SIZE_DEFAULT-1],STACK_SIZE_DEFAULT);
	CoCreateTask(task2,0,1,&task2_stk[STACK_SIZE_DEFAULT-1],STACK_SIZE_DEFAULT);
	CoStartOS();
    while(1);
}


bumudur yani? iki adet task tanımlıyor ve bunları main blogunun içerisinde oluşturup çalıştırıyor mu ?

yamak

Evet hocam pek zor değil ben de bir RTX-RTOS öğreneyim dedim.Sizin tepkiyi vermiştim.

muhittin_kaplan

#2
Hocam Anladığımı Anlatayım.

void task1 (void* pdata){
	while(1){
		GPIO_WriteBit(GPIOC,GPIO_Pin_8,Bit_SET);
		CoTickDelay (10);
		GPIO_WriteBit(GPIOC,GPIO_Pin_8,Bit_RESET);
		CoTickDelay (10);
	}
}


biz bu blogu konvansiyonel olarak yazsaydık. bu blokton while dan dolayı hiç çıkamayacaktı.
RTOS dan dolayı  kendisine belirten task zamanında çalışıp durumları kaydedip diğer task a geçiyor. Diğer task ta işini bitirdiğinde burada kaldığı yerden devam ediyor. (bir nevi her task interrupt rutini gibi çalışıyor.)
MU ?

mesaj birleştirme:: 18 Kasım 2012, 21:13:09

@yamak
Hocam Gözümüzde mi büyütmüşüz bu olayı. (Yoksa Hazır olmasından mı :) bukadar kolay geldi bize. RTOS yazılmış ben taskları ayarlıyorum.)

yamak

Alıntı YapHocam Gözümüzde mi büyütmüşüz bu olayı. (Yoksa Hazır olmasından mı  bukadar kolay geldi bize. RTOS yazılmış ben taskları ayarlıyorum.)
Hocam galiba biraz büyütmüşüz. :)

Alıntı YapHocam Anladığımı Anlatayım.
biz bu blogu konvansiyonel olarak yazsaydık. bu blokton while dan dolayı hiç çıkamayacaktı.
RTOS dan dolayı  kendisine belirten task zamanında çalışıp durumları kaydedip diğer task a geçiyor. Diğer task ta işini bitirdiğinde burada kaldığı yerden devam ediyor. (bir nevi her task interrupt rutini gibi çalışıyor.)
MU ?
Hocam bi de senkronizasyon olayları var onlara da bi bakın isterseniz bakmamışssanız.Onları öğrenince daha zevkli oluyo.Mesela bi task başka bi task event gönderebiliyo.Mesela ilk olarak A task ının çalıştırıyonuz sonra A B ye event gönderiyo sonra B çalışıyo.B de C ye gönderiyo vs. Bi de mutex muhabbeti var.

muhittin_kaplan

peki hocam super loop yapmaktansa neden round robin yapayım?

Klein

Hazır RTOS konusu açılmışken, uzun zamandır sormak istediğim bir soru var.

Örneğin
a,b,c,d,...n  olan tasklarım var.

bir tane de dma taskım var.

bir DMA görev listem var. 
a,b,c,d,...   he biri bu listeye  hedef , kaynak adresleri, uzunlık vs.. içeren bilgiyi ekledi. Bu görevlerin ne kadar süreceği belirsiz. Bu listeye veriyi ekleyince  a,b,c.. tasklarının görevi şimdilik bitti.

dma taskı  baktı ki listede 'a' taskının transfer isteği var.  hemen dma donanımı ayrını yaptı gönder kardeşim dedi ve  geriye çekildi.
DMA donanımı işini bitirince kesme geldi , dma taskı tekrar göreve başladı.
DMA taskı bu kesmeyi alınca, hemen listeye baktı sırada b taskının görevi var.  b taskının görevi için DMA donanımını kurduktan sonra ,  az önce biten görevin  kime ait olduğuna baktı. a taskınınmış bu biten görev dedi ve  bir şekilde a taskını tekrar göreve çağırdı. a taskı da KALDIĞI YERDEN devam etti.  Bu iş listedeki tüm görevler bitene kadar devam etti. Listeye yeni göre eklenince tekrar başladı.....

Özet olarak aslında aradığım şey şu: Bir taskın işi belirli bir süreliğine yoksa ve biz bu süreyi bilmiyorsak, kesme kaynağından gelen bir bilgi ile bu taskın aldığı yerden göreve devam etmesini  sağlayabilir miyiz?
Eğer olursa, bunun için araştırılması kgereken konu , anahtar kelime nedir?

 

mufitsozen


  • mutex
  • semaphore
  • message passing(queues)
  • event loop(event handling)

Kullanacaginiz RTOs'un uygun mekanizmalarina bakmaniz lazim. Eger performans/response time/latency gereksinimleriniz cok kati degilse, yani "Hard Real-time" bir system ile ugrasmiyorsaniz, POSIX compliant bir API sizin ihtiyacinizi gorebilir ve portable bir program yazmanizi saglar..


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

Klein

Hiç  hard beklentilerim yok. Görev kaçırmasın yeter. Zamanlama kritik tek görevim  haberleşme, o da 1 milisaniye gecikse bir şey olmaz. Olursa da onu farklı dma kanalları ve kesmelerle hallederim.

Üzerinde çalıştığım projeni  birmesi gereken süre 2 ay kadar.  Sizce bu projeye RTOS ile başlarsam en fazla 1 aylık bir gecikmeyle tamamlayabilir miyim? Yoksa bu projeye hiç başlama , bildiğin gibi yap. Biraz piştikten sonra gir bu işlere mi dersiniz?   

mufitsozen

Benim nacizane gorusum, bilinen bir RTOS ile baslarsaniz, 1 ayda biter, kendiniz bir scheduler vb yaparsaniz, 2 ayda bile bitmeyebilir, yada bilhassa projenin sonuna dogru  sizi ciddi olarak rahatsiz edecek sekilde ugrastirir.

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

mistek

Bende bir soru sormak istiyorum. RTOS la ilgili forumdaki konuları okudum ama halen kafam basmıyor.
Elimde gyro,accelerometer,magnetometer,barometer ve gps var ayrıca dışarıdan 4 farklı pwm geliyor işlemcide okunuyor 4 farklı motor sürülüyor pid işleniyor adc ile voltaj, akım vs okuyorum şimdi ben bunları
while(1){
fonksiyon1();
fonksiyon2();
fonksiyonn();
}
olarak gelişi güzel işletiyorum. Eğerki bir timer(system tick timer olsun) kurup bunları zamanlara ayırıp çalıştırırsam
while(1){
   if(fonk1zamani)    fonksiyon1();
   if(fonk2zamani)    fonksiyon2();
   if(fonknzamani)    fonksiyonn();
}
cooperative çalışma oluyor mu? Oluyorsa bunun while(1){ fonksiyonlar() } pek farkı olmuyor sonuçta alttaki fonksiyon her durumda üsttekinin bitmesini bekleyecek neden ozaman ortaya yeni bi terim attıldı ?

Hadi bunu geçtik preemptive çalışalım dedik timer0 ı 1ms kurduk her 1 ms kesmesi geldiğinde
void Timer0_IRQHandler(){
   zaman++;
   if(fonk1zamani)    fonksiyon1();
   if(fonk2zamani)    fonksiyon2();
   if(fonknzamani)    fonksiyonn();
}
aralarada yine iç içe kesmeler(i2c capture) karışacak ve bazı fonksiyonlar için yeri geldi 1ms yetmedi program epey bi dallandı diyelim stack şişmez mi? bu kritik zamanlamayı nasıl ayarlamak lazım?

yoksa ben herşeyi yanlış mı anlamışım ?


boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

mufitsozen

Alıntı Yapyoksa ben herşeyi yanlış mı anlamışım ?

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

mistek

harika :) ozaman baştan tekrar okuyayım doğru olsaydı işin içinden çıkamayacaktım
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

muhittin_kaplan

Nöbette aklıma geldi,
işlem sırası geliyor, RTOS tarafından belirtilen sürede Task işletiliyor ve sıradaki Task a geçiyor. Peki Tasklardan Birinde "Zamanlama" yani Timer işlemi varsa ve belli bir sürede bir bu Timer dan dolayı Kesmeye girmesi gerekirse ne olur ?

z

Timer interrupt rutinini sen yazmıyormusun?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

muhittin_kaplan