в потоках Linux реального времени 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

в потоках Linux реального времени



По умолчанию, использование операций с вещественными числами в потоках Linux реального времени запрещается. Вы должны использовать следующих функций реального времени для изменения статуса операций с вещественными числами:

int pthread_setfp_np (pthread_t thread, int flag);

 

Для разрешения операций с вещественными числами в потоках используйте флаг 1, а для запрещения – передайте 0.

Каталог examples/fp содержит различные примеры, которые используют вещественные числа и математическую библиотеку.

 

Соглашения по созданию симметричных многопроцессных задач

С точки зрения планировщика потоков, для каждого активного CPU, Linux реального времени организует отдельный Unix процесс.

В общем, функции управления потоками должны быть использованы только для потоков, которые запущены в локальном CPU. Заметными исключениями являются функции:

int pthread_wakeup_np (pthread_t thread);// Разбудить остановленный поток

int pthread_delete_np (pthread_t thread);// удаляет поток */

 

Связывание компонентов реального времени на Linux

Потоки реального времени разделяют общее адресное пространство с ядром Linux, в принципе могут вызывать функций ядра Linux. Однако, в общем случае это не безопасно, так как потоки реального времени могут запускаться даже тогда, когда прерывания от Linux отключены. Поэтому, только функции которые не могут изменить данных ядра Linux могут быть вызваны из потоков реального времени (например, функция vsprintf).

Чтобы обходить эти ограничения Linux реального времени предоставляют два механизма выполнения с задержкой: программные прерывания и очередь задач.

 

Использование прерываний

В Linux реального времени имеется два типа прерываний: аппаратные и программные. Программные прерывания являются нормальными прерываниями ядра Linux. Они имеют преимущество, что некоторые функции ядра Linux могут быть вызваны безопасно в процедурах обработки прерывания (некоторые из них зависят от версии ядра).

Однако, во многих задачах они не обеспечивают жесткого исполнения в реальном времени, они могут задерживаться чем допустимое время задержки.

Аппаратные прерывания (прерывания реального времени) имеют намного меньше задержку. Однако, как и потоки реального времени, они имеют ограниченный набор функций, которые могут быть вызваны в процедурах обработки прерываний.

Решением этой проблемы является разделение функциональности между аппаратными и программными прерываниями.

 

#include <rtl_core.h>

 

int rtl_request_irq (unsigned int irq,

unsigned int (*handler)(unsigned int,

struct pt_regs *));

int rtl_free_irq (unsigned int irq);

 

Эти две функции используются для инсталляции и снятия процедур обработки аппаратных прерываний для определенных прерываний. Страницы руководства пользователя описывает эту работу в подробностях.

Потоки реального времени вызываемые прерываниями могут быть созданы использованием функций запуска и остановки:

int pthread_wakeup_np (pthread_t thread);

int pthread_suspend_np (void);

Поток управляемый прерыванием вызывает функцию pthread_suspend_np и блоков. Позже, процедура обработки прерывания вызывает функцию pthread_wakeup_np для этого потока. Поток будет запущен до тех пор, пока не выполнится следующий вызов функции pthread_wakeup_np.

 

Программные прерывания

int rtl_get_soft_irq (void (*handler)(int, void *, struct pt_regs *),

const char * devname);

Эта функция размещает виртуальный номер прерывания и задает для него функцию как обработчик прерывания. Позже, это виртуальное прерывание будет запущен с помощью функции:

void rtl_global_pend_irq(int ix);

Эта функция безопасна при использовании в потоках реального времени и в прерываниях реального времени.

Функция

void free_irq(unsigned int irq, void *dev_id);

является функцией ядра Linux, который снимает процедуру обработки прерывания для прерывания "irq". Для программных прерываний параметр dev_id должен быть равен 0.

Программные прерывания использованы в реализации FIFO в Linux реального времени (файл fifos/rtl_fifo.c).

 

Написание планировщика и изменение стандартного планировщика

Эта сложная тема должен записываться позже. Здесь только некоторые точки для отталкивания:

Планировщик реализован в файле: scheduler/rtl_sched.c и в файлах зависимых от архитектуры (папки include/arch-i386 и scheduler/i386).

Решение функциональности планировщика определена в функции rtl_schedule(). Путем изменения этой функции можно изменить политику планирования.



Поделиться:


Последнее изменение этой страницы: 2017-02-07; просмотров: 250; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.218.184.214 (0.005 с.)