FreeRtos ile C++ kullanımı

Başlatan yamak, 21 Şubat 2014, 10:16:14

yamak

FreeRtos ile c++ kullanıyorum.Fakat kafamı karıştıran bir durum var:
Bir sınıfın üye fonsiyonunu bir task olarak kullanacağım zaman derleyici hata veriyor.Biraz araştırdım;
fonksiyonun static olması gerekiyormuş ve static olarak belirttiğimde düzgün bir şekilde çalışıyor.
Böyle bir zorunluluk neden var acaba?Ayrıca bu zorunluluk sadece FreeRtos'a özgü bişey mi yoksa diğer rtoslarda da durum böyle mi?
Kabaca yazdığım sını şu şekilde:
LedClass.h
#ifndef LEDCLASS_H
#define LEDCLASS_H
#include "FreeRTOS.h"
#include "task.h"
#include "stm32f4xx.h"
class LedClass
{
	public:
		LedClass();
		static void Run(void* parm);
	        void TaskCreate(const signed char* name,unsigned long priorty,
					   unsigned short stackSize=configMINIMAL_STACK_SIZE);
		
};
#endif


LedClass.cpp
#include <LedClass.h>

LedClass::LedClass()
{
	
}
void LedClass::TaskCreate(const signed char* name,unsigned long priority,
													unsigned short stackDepth)
{
				xTaskCreate(&Run,name,stackSize,NULL,priority,NULL);
											
}

void LedClass::Run(void* parm)
{
		while(1)
		{
				GPIOD->ODR^=1<<14;
				vTaskDelay(200);
		}
}

Eğer Run fonksiyonu static olmazsa keil aşağıdaki gibi bir hata veriyor:
Alıntı YapLedClass2.cpp(10): error:  #504-D: nonstandard form for taking the address of a member function

AsHeS

Konudan tamamen ilgisiz ama hazır FreeRtos kullanan bulmuşken sorayım Port etmek ve kullanmak için ilgili dokümanları bulamıyorum(Practical Guide dokümanı var fakat o nasıl kullanılacağı ile ilgili port etme hala muamma benim için). Siz hangi dokümanları kullanıyorsunuz linki varsa gönderebilir misiniz ?

yamak

#2
Hocam Port etme ihtiyacım olmadı.Direkt sitesinden kaynak kodu indirip kullandım.İndirildiğinde zaten içinde bir çok mimariye uyun port kodları mevcut.İşlemcinize uygun olanı seçip kullanıyorsunuz.Zaten ben de FreeRtos konusunda yeniyim.

mesaj birleştirme:: 21 Şubat 2014, 11:04:47

Biraz araştırdım ama net cevap bulamadım.Acaba static olmayan fonksiyonlara derleyici tarafından gizlice this parametresi aktarıldığından olabilir mi?

strom

Hocam sanırım siz Run fonksyionun adresini RTOS içinde bir başka fonksiyona parametre olarak göndermeye çalışıyorsunuz.Eğer böyleyse dediğiniz gibi class içinde static olmayan fonksiyonlara this parametresi gönderileceği için hata verecektir kod.

yamak

Asıl sebebi o değil aslında.Sebep şu:
İlk başta verdiğim kodları örnek alırsak:
FreeRtos'un task oluşturma fonksiyonu şöyle:
... xTaskCreate(void(* Fptr)(void*),....)
(...'lar oralarda başka parameterlerin olduğun gösteriyor fakat bizim için önemli olan ilk parametre).
Bu durumda ben sınıf'ın üye fonksiyonlarında birini xTaskCreate fonksiyonuna parametre olarak aktarmak isteseydim xTaskCreate fonksiyonunun ilk parametresi
void(LedClass::*Fptr)(void*) şeklinde olması gerekirdi.Yani C++'da static olmayan üye fonksiyonlarının adresleri ancak void (ClassIsmi::*Fptr)(void) gibi bir pointer da saklanabilir.Fakat static olanlar void(*Fptr)(void) şeklinde bir pointer'da saklanabilir.
Bu sebepten dolayı derleyici bu şekilde bir hata veriyor.

Erhan YILMAZ

Freertosunda free olmayan kısmı bu olsa gerek bütün dokümanları paralı. Reference manueli bile 30$

http://shop.freertos.org/FreeRTOS_tutorial_books_and_reference_manuals_s/1825.htm

yamak

Alıntı yapılan: Erhan YILMAZ - 21 Şubat 2014, 17:20:58
Freertosunda free olmayan kısmı bu olsa gerek bütün dokümanları paralı. Reference manueli bile 30$

http://shop.freertos.org/FreeRTOS_tutorial_books_and_reference_manuals_s/1825.htm
Evet kötü bi durum ama.Adamlar biraz da olsa burdan destek alıyo galiba.Ama internette pdf'leri mevcut:)

Erhan YILMAZ

Alıntı yapılan: yamak - 21 Şubat 2014, 20:48:46
Evet kötü bi durum ama.Adamlar biraz da olsa burdan destek alıyo galiba.Ama internette pdf'leri mevcut:)

Nerde var hocam bulamadım link var mı?


Erhan YILMAZ

Sağolun hocam çok makbule geçti. Diğeri tam gibi de nxpnin sitesindekinde eksik var.

yamak

#10
Hocam elinize sağlık.Denedim gayet güzel çalışıyor.Bir tek LedClass sınıfının kurucu metodunda base sınıfın kuruc metodunu çağırmayı gözden kaçırmışsınız galiba.Onu ekleyince sorunsuz çalışıyor.Fakat anlamadım bir nokta var.LedClass sınıfından türettiğim nesne local olursa çalışmıyor,global olması lazım bunun sebebi nedir acaba?

Bir de yukardaki sorduğum problemin tek nedeni static olmayan üye fonksiyonlar gizlice this parametresi geçirilemesi midir?
Aşağıdaki yaptığım açıklama yanlış mıdır?
Alıntı Yap
İlk başta verdiğim kodları örnek alırsak:
FreeRtos'un task oluşturma fonksiyonu şöyle:
... xTaskCreate(void(* Fptr)(void*),....)
(...'lar oralarda başka parameterlerin olduğun gösteriyor fakat bizim için önemli olan ilk parametre).
Bu durumda ben sınıf'ın üye fonksiyonlarında birini xTaskCreate fonksiyonuna parametre olarak aktarmak isteseydim xTaskCreate fonksiyonunun ilk parametresi
void(LedClass::*Fptr)(void*) şeklinde olması gerekirdi.Yani C++'da static olmayan üye fonksiyonlarının adresleri ancak void (ClassIsmi::*Fptr)(void) gibi bir pointer da saklanabilir.Fakat static olanlar void(*Fptr)(void) şeklinde bir pointer'da saklanabilir.
Bu sebepten dolayı derleyici bu şekilde bir hata veriyor.
Bir de hocam türetilmiş sınıftaki run fonksiyonun virtual olarak tanımlamanızın nedeni LedClass'tan da başka bir ClassTüretilme ihtimalinden dolayı mı yoksa başka bir seebi var mı?

yamak

Hocam haklısınız ayrıca base sınıfın constructorını çağırmamıza gerek yokmuş ben başka bir hatayı ondan kaynaklanıyo zannettim.Örnek kod aşağıda:

LedClass tsk1;
		LedClass2 tsk2;
int main(void)
{
		SysTick_Config(SystemCoreClock/1000);
		RCC->AHB1ENR |= 0x0000001F;
		GPIOD->MODER=0x55000000;     
                GPIOD->OSPEEDR= 0xFFFFFFFF; 
		tsk1.start((const signed char*)"tLed1",10,512);
		tsk2.start((const signed char*)"tLed2",9,512);
		vTaskStartScheduler();
}

Bu haliyle çalışıyor fakat tsk1 ve tsk2 yi local tanımlayınca çalışmıyor.Bu arada keil kullanıyorum