2010-01-18 3 views
2

Я разрабатываю проект, и я должен сделать оболочку для некоторых аппаратных функций.A Обертка для аппаратных функций

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

Итак, мое решение - начать поток, сделать очередь и сделать мои собственные функции чтения и записи. Поэтому каждый раз, когда вызываются мои функции, данные будут храниться в очереди, а затем в потоке цикла будут фактически прочитаны или записаны в память. Мои функции будут использовать мьютекс для синхронизации доступа к очереди. Моя обложка будет на dll. Основной модуль вызовет мою функцию инициализации dll один раз, чтобы запустить поток, а затем он будет вызывать мои функции чтения/записи много раз из разных потоков.

Мои вопросы: безопасно ли это сделать? исходные функции не являются реентерабельными. Я не знаю, будет ли это проблемой. Есть лучший способ сделать это?

Любая помощь будет оценена по достоинству.


Жаль, что я забыл кое-что:

-The язык, который будет использоваться на C++

-Основной программа будет называть мою DLL-обертку, но и будет вызывать другие модули (DLL), которые собираются вызовите dll-оболочку.

+0

Пожалуйста, уточните в заголовке или на темах, на каком языке вы используете, и это поможет людям с ответами найти ваш вопрос. – STW

+0

Язык C++ – kepler

+0

-Основная программа вызовет мою обертку dll, а также вызовет другие модули (dll), которые будут вызывать обертку dll. – kepler

ответ

0

Добавление медиатора в этом контексте является довольно типичным решением, поэтому вы не находитесь в сорняках здесь. Я бы сказал, что вам нужно будет реализовать это , потому что оригинальные функции не являются реентерабельными. Предполагая, что у вас есть доступ к оборудованию. (т. е. вы являетесь водителем.) Если другие люди могут получить доступ к одному и тому же аппаратным средствам, вам придется придумать контракт с более высоким уровнем. Затем ваш поток предоставляет упорядоченный доступ к драйверу. Вы обнаружите, что посредник также позволит вам дросселировать.

Жесткая часть, кажется, зная, когда можно совершать следующий вызов устройства. Есть ли у него какой-то флаг, чтобы вы знали, что он готов к чтению и записи? Некоторые другие вопросы: как вы планируете передавать информацию своим клиентам? Поскольку вы предоставляете асинхронный интерфейс, вам нужно иметь какую-то регистрацию обратного вызова ошибок и т. Д. Взгляните на обычный интерфейс драйвера async для идей.

Но, в целом, звучит хорошая стратегия для начала. Как упоминалось еще один плакат, более конкретные характеристики были бы приятными.

+0

Спасибо за ваш ответ Andrew ... У меня нет флагов, я просто буду ждать 100 мс для следующего звонка. И до сих пор не знаю, как сообщить моим клиентам, что функции записи были успешно выполнены. – kepler

+0

Вот несколько вариантов. 1) Когда они называют запись, они дают вам обратный вызов. Вы звоните им, когда закончите писать, и они могут опубликовать еще один. 2) Когда они звонят писать, вы даете им квитанцию ​​с «isDone()» или что-то, что они могут позвонить, чтобы узнать, были ли вы сделаны. Я бы предпочел первый метод самостоятельно. Но будьте осторожны, когда вы их называете. Если вы назовете их в своем потоке, они могут заблокировать ваш поток.Возможно, вам понадобится еще один поток для этих обратных вызовов. Также звучит так, будто вы можете поощрять двойную буферизацию. –

Смежные вопросы