Czy Linux jest w stanie pracować jako RTOS, RTOS hard?

0

Cześć, zastanawiam się czy linux jest w stanie pracować jako RTOS, RTOS hard.Chciałbym realizować na linuxie jedną rzecz która będzie się wykonywała co 100ms. Minimalne zwłoki czasowe są dopuszczalne, na poziomie kilku ms, maksymalnie kilkudziesięcu ms.


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>

void *myfunc1 (void *myvar);
void *myfunc2 (void *myvar);

int main(void)
{
	pthread_t thread1, thread2;

	char *msg1 = "First";
	char *msg2 = "Second";
	int ret1 = 0;
	int ret2 = 0;

	ret1 = pthread_create(&thread1, NULL, myfunc1, (void*) msg1);
	ret2 = pthread_create(&thread2, NULL, myfunc2, (void*) msg2);

	pthread_join(thread1, NULL);
	pthread_join(thread2, NULL);

	printf("First thread ret: %d", ret1);
	printf("Second thread ret: %d", ret2);

	return 0;
}

void *myfunc1 (void *myvar)
{
	while(1)
	{
                //update_db();
		printf("Thread1\n");
		usleep(500000);
	}
}

void *myfunc2 (void *myvar)
{
	while(1)
	{
                //update_output();
		printf("Thread2\n");
		usleep(100000);
	}
}

Czy da się uruchomić ten program, aby miał wysoki priorytet? Tak samo zależy mi aby wątek pthread2 którego zadaniem jest wysterowanie pinów wykonywał się co 100ms., Wątek pthread1 którry realizuje zadanie zadanie odczytu i zapisu do bazy danych jest mniej istotny, opóźnienia mogą być. Czasem zapis do DB trwa długo np. 800ms, i pthread1 blokuje pthread2 który ma "ważniejsze zadanie". Chciałbym uzyskać efekt podobny do FreeRTOS tzn. mieć task o najwyższym priorytecie.

1

To hard RTOS czy "minimalne zwłoki czasowe są dopuszczalne"?

Ogólnie Linux nie będzie działał jako hard RTOS co najwyżej jako soft (zakładam, że nawet napisanie własnego schedulera nie wiele da). Aczkolwiek jest projekt, który próbuje to uzyskać, ale wygląda na to, że to więcej niż tylko zmiana schedulera.

0

No dobra moja pomyłka, nie hard ale soft. Ważne aby zrealizować zadanie wysterowania pinów z możliwie jak najmniejszą zwłoką czasową. Można dodać priorytety do pthread'ów?

0

@Zimny kot a chociażby sprawdziłeś co masz napisane w man pthread_create? Bo sekcji SEE ALSO ja znalazłem coś takiego man pthread_setschedprio

0

man sched_setscheduler

0

Linux jako RTOS to pewnie taki Golf ze spojlerami.
Ale jest kilka takich projektów.
https://en.wikipedia.org/wiki/RTLinux
https://www.zephyrproject.org/

Możesz jeszcze poszukać pod hasłem Embedded - tu masz opis czym to się różni:
https://www.safaribooksonline.com/library/view/building-embedded-linux/059600222X/ch01s02.html

0

Kiedyś usłyszałem, że jądro Linux jest soft-realtime, tzn. zdecydowana większość deadline jest dotrzymywana. Czy to prawda - nie wiem - spróbuj sam.

Jeśli potrzebujesz zrobić z desktopowego Linuxa - RTOS to masz kilka opcji: możesz spróbować, czy wystarczyłoby Ci gdybyś skompilował jądro z łatami PREEMPT_RT (wydaje mi się że jest to kwestia wyboru opcji podczas kompilacji jajka). Druga opcja, która zapewni Ci hard realtime z dotrzymywaniem terminów w okolicach pojedynczych ms jest Xenomai (https://xenomai.org/). Od razu uprzedzam, że to drugie rozwiązanie jest mocno hardcorowe i może być przerostem formy nad treścią dla tego co chcesz zrobić.

1 użytkowników online, w tym zalogowanych: 0, gości: 1