СПОСОБЫ И СИСТЕМЫ ОБМЕНА ДАННЫМИ
DATA EXCHANGE METHODS AND SYSTEMS

ОБЛАСТЬ ТЕХНИКИ, К КОТОРОЙ ОТНОСИТСЯ ИЗОБРЕТЕНИЕ
Изобретение относится, в общем, к программным средствам генератора/потребителя и, в частности, к способам и системам обмена данными между генератором и потребителем.
Как правило, в механизмах I/O-сканирования задействуются программные реализации, включающие в себя генератор и потребитель, выполненные с возможностью обмена данными в модуле посредством буферов совместной памяти. Кроме того, для обмена данными обычно требуется механизм подтверждения связи на объединительной панели с целью разрешения доступа к данным. В частности, генератору требуется доступ для записи данных в буфер совместной памяти, а потребителю требуется доступ для чтения данных из буфера совместной памяти. Соответственно во время обмена данными по меньшей мере некоторые известные механизмы сканирования требуют, чтобы генератор и/или потребитель ожидали доступа к данным. В частности, для механизма подтверждения связи представления могут требоваться множественные доступы на чтение или запись. К примеру, семафор совместной памяти, такой как алгоритм Петерсона, обычно реализуется с целью обеспечить согласованный доступ к буферу данных совместной памяти. Однако такие семафоры часто требуют неоднократных попыток получения доступа. Кроме того, некоторые известные механизмы сканирования требуют критических интервалов или таймаутов, пока генератор и/или потребитель получают самые свежие данные. Вычисление таких периодов ожидания или таймаутов может быть сложным и подвержено ошибкам.
Соответственно, по меньшей мере некоторые из известных механизмов сканирования посылают команду сканирующему модулю приготовиться к обращению управляющего устройства. Однако этот механизм часто требует, чтобы модуль задерживал свою обычную работу для считывания команды, тем самым, вызывая задержки в обмене данными. Кроме того, по меньшей мере в некоторых из известных механизмов сканирования используются аппаратные механизмы для помощи в управлении доступом. Однако аппаратные механизмы могут быть дорогими и/или требовать много времени на установку и обслуживание.
РАСКРЫТИЕ ИЗОБРЕТЕНИЯ
В одном варианте предоставляется способ обмена данными между первым модулем и вторым модулем. Способ включает в себя создание данных в первом модуле, причем первый модуль выполняется с возможностью позволять второму модулю практически непрерывно иметь доступ к данным. Способ также включает в себя чтение данных во втором модуле, причем второй модуль выполняется с возможностью позволять первому модулю практически непрерывно создавать данные. Наконец, способ включает в себя обмен данными между первым модулем и вторым модулем во время чтения данных.
В другом варианте предоставляется система. Система включает в себя управляющее устройство и модуль ввода-вывода, выполненного с возможностью обмениваться данными с управляющим устройством через интерфейс совместной памяти. Обмен данными осуществляется путем создания данных первым модулем, чтения данных вторым модулем и обмена данными между первым модулем и вторым модулем во время чтения данных. Первый модуль выполняется с возможностью позволять второму модулю практически непрерывно иметь доступ к данным; и второй модуль выполняется с возможностью позволять первому модулю практически непрерывно создавать данные.
В еще одном варианте предоставляется компьютерная программа, установленная в модуле ввода-вывода. Компьютерная программа включает в себя по меньшей мере один кодовый сегмент, выполненный с возможностью командовать модулю ввода-вывода осуществлять обмен данными между первым модулем и вторым модулем. Обмен данными осуществляется путем: создания данных в первом модуле, причем первый модуль выполняется с возможностью позволять второму модулю практически непрерывно иметь доступ к данным; чтения данных во втором модуле, причем второй модуль выполняется с возможностью позволять первому модулю практически непрерывно создавать данные; и обмена данными между первым модулем и вторым модулем во время чтения данных.
КРАТКОЕ ОПИСАНИЕ ЧЕРТЕЖЕЙ
Фиг.1 - примерный вариант осуществления механизма сканирования, который включает в себя управляющее устройство и модуль ввода-вывода.
Фиг.2 и 3 - блок-схемы примерного алгоритма, который может использоваться для обмена данными посредством механизма сканирования, показанного на Фиг.1.
ОСУЩЕСТВЛЕНИЯ ИЗОБРЕТЕНИЯ
Настоящее изобретение предоставляет систему, включающую в себя управляющее устройство и модуль ввода-вывода (I/O-модуль), выполненный с возможностью обмена данными с управляющим устройством через интерфейс совместной памяти. В одном варианте осуществления система включает в себя компьютерную программу, введенную в I/O-модуль и включающую в себя алгоритм обмена данными. Также система может включать в себя процессор для считывания и выполнения компьютерной программы. Технический результат алгоритма состоит в управлении генератором и потребителем с целью обеспечить обмен данными между управляющим устройством и I/O-модулем. Алгоритм дает возможность генератору несинхронно и согласованно записывать новые данные без блокирования и ожидания согласования очередности доступа с потребителем. Потребитель также несинхронно считывает самые свежие данные генератора без блокирования или ожидания генератором доступа к данным. В примерном варианте осуществления система не требует специализированной аппаратуры.
Дополнительно структуры данных для обмена между генератором и потребителем включают в себя только байт состояния генератора, байт состояния потребителя и множество раздельных буферных ячеек данных, таких как четыре раздельных буферных ячейки данных. В отношении генератора алгоритм обеспечивает, чтобы по меньшей мере одна буферная ячейка всегда была доступна для записи последних данных генерирования, чтобы генератор не ожидал доступа к потребителю. В отношении потребителя алгоритм дает возможность потребителю немедленно захватить буфер самых свежих сгенерированных данных с целью чтения данных. В примерном варианте осуществления алгоритм требует только две операции чтения/записи с совместной памятью для получения доступа к надлежащей буферной ячейке данных, тем самым, повышая производительность при сканировании на объединительной панели.
Следует отметить, что хотя настоящее изобретение описывается в отношении механизмов сканирования, среднему специалисту в данной области техники будет ясно, что настоящее изобретение может также прилагаться к любой системе и/или оборудованию, где осуществляется обмен данными между генератором и потребителем. Кроме того, хотя настоящее изобретение описывается в отношении процессоров и компьютерных программ, среднему специалисту в данной области техники будет ясно, что настоящее изобретение также может прилагаться к любой системе и/или программе, выполненным с возможностью осуществления обмена данными между генератором и потребителем. Использованный здесь термин «процессор» не ограничен только теми интегральными схемами, которые в области техники называются процессорами, но в широком смысле относится к компьютерам, процессорам, микропроцессорным управляющим устройствам, микрокомпьютерам, программируемым устройствам логического управления, специализированным интегральным схемам и другим программируемым схемам. Процессор может быть частью компьютера, который может включать в себя устройство, такое как накопитель на гибких дисках или накопитель постоянной памяти на компактном диске (CD-ROM), для считывания данных с компьютерочитаемого носителя, такого как гибкий диск, CD-ROM, магнитооптический диск (MOD) или универсальный цифровой диск (DVD).
На Фиг.1 изображен примерный вариант осуществления механизма 100 сканирования, который включает в себя управляющее устройство 104 и I/O-модуль 108. В примерном варианте осуществления I/O-модуль 108 управляет I/O-данными для нескольких выносных модулей 112. В частности, I/O-модуль 108 реализует интерфейс совместной памяти и включает в себя четырехбуферный набор данных генератора/потребителя для каждого сконфигурированного выносного модуля 112. К примеру, если пользователь конфигурирует сеть так, что она включает в себя пятьдесят выносных модулей 112, I/O-модуль 108 предоставляет пятьдесят наборов данных генератора/потребителя для обмена входными данными и дополнительно пятьдесят наборов данных генератора/потребителя для обмена выходными данными для каждого модуля 112. Каждый набор данных генератора/потребителя включает в себя байт состояния генератора, байт состояния потребителя и четыре буферных ячейки данных.
В примерном варианте осуществления механизм сканирования включает в себя алгоритм, осуществленный в компьютерной программе, который дает возможность одновременно генератору создавать новые данные и потребителю просматривать и/или считывать самые свежие созданные данные генератора без ожидания получения доступа. Соответственно генератор и потребитель могут действовать несинхронно и на любом интервале времени. В одном варианте осуществления цикл генератора быстрее цикла потребителя. В альтернативном варианте осуществления цикл потребителя быстрее цикла генератора. В дополнительном варианте осуществления циклы генератора и потребителя чередуются. В каждом варианте осуществления ни генератор, ни потребитель не требуют каких-либо критических интервалов или таймаутов. В частности, не требуется, чтобы значения считывания/записи управляющих параметров совместной памяти для состояния генератора и состояния потребителя были маленькими. Соответственно доступ генератора и потребителя к этим значениям может быть одновременным и совмещенным. Алгоритм сводит к минимуму обращения к совместной памяти с целью оптимизации выполнения. Кроме того, для алгоритма требуется запись только одного байта и считывание только одного байта совместной памяти для получения доступа к буферу.
Как правило, четырехбуферное сканирование требует четыре раздельных буферных ячейки совместной памяти для каждой комбинации «генератор/потребитель». Таким образом, входное сканирование требует четыре буферных ячейки, а выходное сканирование требует еще четыре буферных ячейки. Позиции смещений буферов могут определяться в течение запуска/конфигурации модуля так, чтобы во время самой сканирующей операции была возможность обращения к буферам исключительно по индексным значениям буферов: 0, 1, 2 или 3. К примеру, модуль с двенадцатью байтами входных данных сканирования может располагать свой четырехбуферный набор в совместной памяти на смещении 0×10000. В этом примере, поскольку каждый входной буфер имеет размер данных 0×0C, четырехбуферные наборы располагаются на смещениях 0×10000, 0×1000C, 0×10018 и 0×10024. Эти смещения затем определяются во время конфигурации, и назначаются индексные значения четырехбуферного сканирования 0, 1, 2 и 3.
Для управления основной операцией четырехбуферного сканирования требуются, как минимум, пять управляющих подполей в совместной памяти. В частности, четыре управляющих подполя записываются только генератором, включая значение последнего цикла, блок выбора ячейки, подполе bin0 и подполе bin1. Оставшееся управляющее подполе является значением цикла, которое записывается только потребителем. Дополнительные поля могут определяться для улучшения I/O-сканирующей операции.
Как правило, генератор и потребитель чередуются между bin0 и bin1. Соответственно, во время операции, потребитель использует значение захваченного буфера в одной буферной ячейке, в то время как генератор обновляет другую буферную ячейку новыми сгенерированными буферами. Во время каждого цикла генерации генератор находит доступный буфер I/O-сканирования, записывает в него данные генерации и представляет индексное значение этого буфера в совместной памяти. В одном варианте осуществления генератор записывает индексное значение нового сгенерированного буфера в поле буферной ячейки, которое в данный момент не захвачено потребителем. Кроме того, генератор считывает и сохраняет значение цикла потребителя в течение каждого цикла генерации. Когда генератор видит, что значение цикла потребителя изменилось после предыдущего цикла генерации, генератор должен переключиться на другую буферную ячейку во время своего следующего цикла генерации. Соответственно, если значение цикла потребителя изменяется, в то время как генератор генерирует в bin0, то следующая генерация будет производиться в bin1. Если bin1 было активно, то генератор переключается на bin0. Генератор записывает блок выбора ячейки для указания, какую буферную ячейку он в данный момент использует (bin0 или bin1). Алгоритм дает возможность генератору непрерывно переключать свою буферную ячейку и состояние блока выбора ячейки с каждым обнаруженным циклом потребления. Потребитель обнаруживает состояние генератора и выбирает самый свежий буфер генерации из захваченной буферной ячейки.
Четырехбуферный алгоритм подтверждения связи требует только двух доступов к совместной памяти для получения следующего буфера генерации/потребления. Третий доступ к совместной памяти также требуется для считывания или записи реальных данных. Соответственно генератор должен записать новые данные в свободные буферные позиции, записать в поле состояния генератора новый буферный индекс и считать поле состояния потребителя с целью определения действий для следующего цикла генерирования. Потребитель записывает новое поле состояния потребителя, чтобы начать цикл потребления, считывает состояние генератора, чтобы определить буфер потребления и считывает данные из буфера потребления.
Если требуются только пять управляющих подполей, поля состояний генератора и потребителя могут быть уменьшены до одного байта на каждое поле состояния. Увеличенный размер с применением двойного слова предоставляет место для бит готовности буферной ячейки, чтобы дать буферу допустимое указание для конкретных захваченных буферов. Если подробная информация о буфере не является необходимой, эти биты готовности могут замещаться механизмом, устанавливающим значение bin0, равным значению bin1, чтобы указать, что генератор не готов. Использование размера состояния с применением двойного слова также предоставляет резервные биты для будущих улучшений.
Фиг.2 и 3 - блок-схемы алгоритма, использованного для четырехбуферного сканирования между генератором и потребителем. В примерном варианте осуществления алгоритм включает в себя алгоритм 208 генератора (показанный на Фиг.2) и алгоритм 212 потребителя (показанный на Фиг.3). Во время выполнения алгоритма 208 генератора переменные текущего буфера, предыдущего буфера и захваченного буфера являются частными переменными генератора и не являются полями совместной памяти. В эти переменные записывают одно из четырех индексных значений буферов сканирования 0, 1, 2 или 3. В частные данные генератора также записывают текущее состояние занятости каждого буфера сканирования. Перед первым циклом генерации все четыре буфера сканирования являются доступными (незанятыми).
Соответственно в примерном варианте осуществления генератор находит доступный (незанятый) буфер сканирования и сохраняет 216 индексное значение буфера в переменную текущего буфера. Генератор затем записывает 220 новые данные генерации в позицию смещения текущего буфера в совместной памяти. Новое состояние генератора создается 224 путем помещения значений текущего буфера и захваченного буфера в надлежащие буферные ячейки для блока выбора текущей ячейки. Надлежащее поле значения последнего цикла потребителя также устанавливается. Алгоритм 208 генератора также включает в себя запись 225 состояния генератора в совместную память и считывание 226 состояния потребителя из совместной памяти.
В примерном варианте осуществления алгоритм 208 генератора определяет 228, изменилось ли значение цикла потребителя после последнего цикла генерации. Если значение цикла потребителя изменилось 232 (что указывает на захват текущей буферной ячейки), блок выбора ячейки генератора переходит 236 к следующему циклу генерации. Соответственно все буферы генерации помечаются 240 как 'доступные', кроме индексов текущего буфера и предыдущего буфера. При этом значение захваченного буфера устанавливается 244 равным значению текущего буфера для сохранения значения нового захваченного потребителем буфера. Если начало цикла потребителя не было обнаружено 248 после последнего цикла генерации (т.е. значение предыдущего буфера равно значению захваченного буфера), индекс предыдущего буфера помечается 252 как 'доступный' и может использоваться при следующем цикле генерации. Кроме того, индекс текущего буфера помечается 256 как 'недоступный' (занятый) и не может использоваться при следующем цикле генерации. Дополнительно, значение предыдущего буфера устанавливается 260 равным значению текущего буфера для следующего цикла генерации.
Во время выполнения алгоритма 212 потребителя переменные текущего цикла, предыдущего цикла и захваченного цикла являются частными переменными потребителя и не являются полями совместной памяти. В эти переменные записывают одно из пяти значений цикла 1, 2, 3, 4 или 5. В частные данные потребителя также записывают текущее состояние занятости каждого значения цикла. Перед первым циклом потребления все пять значений цикла являются доступными (незанятыми).
Соответственно в примерном варианте осуществления, потребитель находит 264 'доступное' (незанятое) значение цикла потребителя и сохраняет это значение в переменную текущего цикла. Потребитель также записывает 268 новое состояние потребителя в совместную память со значением нового цикла потребителя и считывает 272 состояние генератора из совместной памяти. Затем алгоритм 212 потребителя определяет 276, равно ли значение нового цикла потребителя значению последнего цикла потребителя в состоянии генератора. Если значение нового цикла потребителя не равно 280 значению последнего цикла потребителя, потребитель извлекает 284 индекс буфера из буферной ячейки, которая указывается блоком выбора текущей ячейки генератора. Если значение нового цикла потребителя равно 288 значению последнего цикла потребителя, генератор уже увидел новый цикл потребителя и соответственным образом изменил свой блок выбора ячейки. Следовательно, потребитель извлекает 292 индекс буфера из буферной ячейки, которая не указывается блоком выбора текущей ячейки генератора.
Далее потребитель считывает 296 данные генератора с надлежащего смещения буфера в совместной памяти, указанного индексом буфера. Алгоритм 212 потребителя определяет (300), произошел ли цикл генератора после последнего цикла потребителя (что указывается изменением в состоянии генератора). Если цикл генератора произошел 304, потребитель помечает 308 значения текущего цикла, предыдущего цикла и последнего цикла потребителя как 'недоступные'. Кроме того, потребитель помечает 312 остальные значения цикла как 'доступные' (незанятые). При этом значение захваченного цикла устанавливается равным значению текущего цикла для сохранения значения нового захваченного цикла. Если значение предыдущего состояния генератора равно текущему состоянию генератора (цикл генератора не произошел 320), потребитель помечает 324 значение предыдущего цикла как 'доступное', если предыдущий цикл не равен захваченному циклу. Кроме того, значение текущего цикла помечается 328 как 'недоступное' (занятое) и не может использоваться при следующем цикле потребления. При этом значение предыдущего цикла устанавливается 332 равным значению текущего цикла для следующего цикла потребления.
Соответственно алгоритм 208 генератора и алгоритм 212 потребителя сводят к минимуму обращения на чтение/запись на объединительной панели, требуемые для выполнения сканирования подтверждения связи. В частности, как генератор, так и потребитель требуют только одну запись и одно считывание для четырехбуферного подтверждения связи на объединительной панели и дополнительное считывание или запись для реальных данных I/O-сканирования. Дополнительно алгоритм не требует каких-либо таймаутов и/или критических интервалов в программной реализации.
В примерном варианте осуществления генератор обуславливает управление доступностью или состоянием занятости четырех буферов сканирования в течение циклов генерации. Это управление относится к доступности неиспользуемых в данный момент буферов сканирования для генерации в зависимости от буферов, сделавшихся доступными для потребления. Для выполнения этого управления генератор должен знать, какой буфер потребитель в дынный момент захватил, а какой буфер использовался в последнем цикле генерации. Затем генератор должен выбрать один из оставшихся буферов для текущего цикла генерации. Этот выбор является несколько сложным из-за условия состязания, которое происходит между генератором и потребителем. Условие состязания происходит, когда генератор записывает значение нового буфера в ожидаемую текущую буферную ячейку генерации. При выполнении этой записи генерации потребитель может одновременно захватывать ту же буферную ячейку, в которую генератор записывает, и также считывать значение буфера в этой захваченной буферной ячейке. Генератор не знает, значение какого буфера потребитель в действительности видел в буферной ячейке. Генератор знает только то, что это был либо новый буфер генерации, только что записанный, либо предыдущий буфер генерации. Ввиду этого условия состязания четырехбуферный алгоритм требует, чтобы генератор предполагал, что оба буфера являются занятыми (и текущий, и предыдущий буферы генерации помечаются как занятые, но два оставшихся буфера безусловно являются доступными для использования).
К примеру, если генератор предварительно сгенерировал новые данные в буфере 1 и в данный момент генерирует данные в буфере 2, после обновления текущей буферной ячейки значением 2 генератор проверяет значение цикла потребителя и видит, что потребитель перед этим захватил ту же буферную ячейку. Теперь генератор должен предположить, что и буфер 1, и буфер 2 заняты и потенциально задействованы в потреблении. При последующем цикле генерации генератор свободно может использовать либо буфер 0, либо буфер 3 для новых данных генератора.
В примерном варианте осуществления поле значения цикла потребителя в состоянии потребителя предназначается для указания выполнения цикла потребления. На новый цикл потребления указывает изменение значения цикла потребителя в начале каждого цикла потребления. Генератор видит изменение значения при следующем цикле генерации и знает, что произошел или происходит цикл потребления. Потребитель должен решить несколько проблем с изменением значения цикла потребителя. Во-первых, потребителю нужно изменить значение цикла с каждым циклом потребления, но ему нельзя повторять значение, которое генератор мог видеть во время своего предыдущего цикла генерации. Таким образом, потребитель должен следить за тем, какое значение цикла потребителя было представлено во время последнего цикла.
Во-вторых, потребитель не должен использовать значение цикла, которое в данный момент представлено в поле значения последнего цикла потребителя в состоянии генератора. Этого значения цикла необходимо избегать, чтобы потребитель мог безошибочно сравнить значения цикла генератора и потребителя при последующих циклах потребителя. Если это значение использовалось, а генератор не выполнял цикла для изменения значения последнего цикла потребителя, перед тем как потребитель повторно использовал то же значение, то потребитель выбрал бы неверную буферную ячейку при помощи подалгоритма выбора ячейки потребителя.
Наконец, необходимо решить проблему условия состязания, когда потребитель записывает значение нового цикла потребителя и считывает состояние генератора в то же время, когда генератор также записывает новое состояние генератора. В этом случае потребитель не знает точно, значение какого цикла потребителя увидел генератор. Соответственно потребитель должен предположить, что и значение текущего цикла, и значение предыдущего цикла являются занятыми и недоступными для следующего цикла потребителя. В сущности, это такое же условие состязания, проблему с которым должен был решать генератор, как описано выше.
В отношении значения цикла потребителя только четыре значения являются необходимыми для представления уникального значения при каждом цикле. Однако ввиду требования, чтобы значение последнего цикла потребителя в генераторе избегалось, подалгоритм выбора значения цикла потребителя требует пять значений цикла (диапазон значений 1-5). Следует отметить, что значения цикла потребителя 1, 2, 3, 4 и 5 не относятся к буферным ячейкам и всего лишь указывают генератору, что произошел новый цикл потребителя.
В примерном варианте осуществления генератору требуется копировать значение самого недавнего цикла потребителя, который он видит, в значение последнего цикла потребителя в поле состояния генератора во время каждого цикла генерации. Потребитель использует это значение с целью определения, из какой буферной ячейки ему следует считывать. Быстрый генератор может изменять свой блок выбора ячейки, перед тем как потребитель считывает состояние генератора. Соответственно, чтобы верно выбрать буферную ячейку во время выполнения цикла потребителя, потребитель сравнивает значение последнего цикла потребителя в состоянии генератора со значением текущего цикла потребителя. Если эти значения не равны, потребитель использует буферную ячейку, указанную значением блока выбора ячейки в состоянии генератора. Однако если значения цикла равны, то потребитель знает, что генератор завершил очередной цикл прежде, чем потребитель считывает значение состояния генератора. Таким образом, блок выбора ячейки генератора перешел из ожидаемой позиции, и потребитель должен использовать захваченный буфер в другой буферной ячейке.
Соответственно система предоставляет генератор, который периодически обновляет свои генерируемые данные и указывает самый новый сгенерированный буфер потребителю. Кроме того, потребитель периодически захватывает буфер генерации, чтобы иметь возможность согласованно считать все данные. Генератор использует одну из двух буферных ячеек в совместной памяти для указания индексного значения самого нового буфера генерации (буфер 0-3). За один раз генератор только записывает значения нового буфера генерации в одну ячейку и указывает, какая ячейка в данный момент активна, используя поле блока выбора ячейки генератора. Когда потребитель хочет произвести обратиться к самому свежему сгенерированному буферу, потребитель записывает значение нового цикла потребителя для указания начала нового цикла потребления. Таким действием потребитель командует генератору прекратить запись новых буферов генерации в текущую ячейку и переключиться на другую ячейку при его следующем цикле генерации. Таким образом, происходит успешный захват выбранной ячейки из дальнейших обновлений цикла генерирования и потребителю дается возможность считывать выбранную ячейку и использовать значение ее буфера для потребления.
Соответственно алгоритм предоставляет механизм I/O-сканирования, которые быстрее предыдущих программных реализаций. В этом техническое усовершенствование над предыдущими алгоритмами, но это также приведет к продукту с более быстрыми и более последовательными периодами сканирования.
Кроме того, в примерном варианте осуществления основной четырехбуферный алгоритм включает в себя несколько улучшений для использования с механизмом 100 сканирования. Эти улучшения обеспечивают поддержку множественных выносных модулей и повышают производительность. В частности, если модулю требуется несколько наборов I/O-буферов, то несколько наборов могут реализоваться в совместной памяти. Каждый набор буферов включает в себя основные поля, требуемые для единичного обмена между генератором и потребителем, а именно: состояние потребителя, состояние генератора и четыре буферные ячейки. Этот основной набор затем повторяется множество раз в совместной памяти, что необходимо для обмена данными. Поля управления состоянием генератора/потребителя могут организовываться в четыре массива в совместной памяти, а именно массив входного состояния потребителя, массив входного состояния генератора, массив выходного состояния потребителя и массив выходного состояния генератора.
В примерном варианте осуществления термин «индексное значение сканирования» относится к индексу массива, где конкретный набор полей управления состоянием располагается для набора I/O-буферов. К примеру, индексное значение сканирования, равное 5, означает, что соответствующие флаги состояния генератора/потребителя располагаются по индексу массива 5 в каждом из четырех управляющих массивов следующим образом:
Входное Состояние Потребителя = Входное Смещение Потребителя[5]
Входное Состояние Генератора = Входное Смещение Генератора[5]
Выходное Состояние Потребителя = Выходное Смещение Потребителя[5]
Выходное Состояние Генератора = Выходное Смещение Генератора[5]
В примерном варианте осуществления система выполняет функции по управлению несколькими удаленными I/O-модулями и раздельному сканированию из главного управляющего устройства. Соответственно набор полей управления состояниями генератора и потребителя является необходимым для каждого удаленного модуля. В частности, во время конфигурации модуль должен создать набор из четырех управляющих I/O-массивов в совместной памяти для входных данных потребителя, входных данных генератора, выходных данных потребителя и выходных данных генератора. Каждый массив содержит список полей состояния либо генератора, либо потребителя для всех модулей.
Во время конфигурации модуль также должен определить смещения буферов входных и выходных данных каждого удаленного I/O-модуля. Одно значение смещения буфера указывает на четырехбуферный массив, используемый во время четырехбуферного сканирования. Значение размера данных укажет размер каждого буфера сканирования, а также обозначит смещения для каждого буфера сканирования в массиве. К примеру, если размер входных данных модуля равен двенадцати байтам, то смещение входных буферов должно указывать на четыре буфера по двенадцать байтов каждый, располагающихся на смещениях 0, 12, 24 и 36 внутри буферного массива. Эти буферы соответствуют индексам буфера сканирования 0, 1, 2 и 3 в алгоритме четырехбуферного сканирования. Сканирующий алгоритм и поля состояния могут затем использоваться с целью определения, какой буфер сканирования использовать.
Если подчиненный модуль поддерживает несколько наборов I/O-буферов, которые динамически распределяются на основе конфигурации (например, данные I/O-сканирования выносного модуля), то система обуславливает верное распределение и представление индексных значений сканирования для четырех массивов управления состоянием. Поскольку наборы I/O-данных могут меняться с каждой конфигурацией, поля управления состоянием и соответствующие индексные значения сканирования могут отвергаться или добавляться с каждым изменением конфигурации. Система обуславливает верное выполнение назначений индексных значений сканирования для полей управления состоянием. Соответственно система пытается сохранять назначенные индексные значения сканирования, объединенные в низком диапазоне индексных значений. Таким образом, когда конфигурация добавляет новые области I/O-данных, система повторно использует ранее освобожденные индексные позиции сканирования, прежде чем распределять новые позиции в конце массива состояния. При этом может требоваться, чтобы модуль хранил внутренний или локальный массив распределения индексов сканирования с целью определения, какие индексные позиции сканирования распределены, а какие - свободны.
В примерном варианте осуществления в состоянии потребителя существует бит готовности потребителя для указания, готов ли потребитель. Генератор может указывать на свое состояние готовности посредством бит готовности буферной ячейки в каждой буферной ячейке (bin0 или bin1). Генератор назначит биту готовности буферной ячейки в буферной ячейке для каждого цикла генерации допустимые данные. Если генератор входит в состояние, когда он не готов, то генератор должен либо выполнить другой цикл генерации без установки бита готовности буферной ячейки, либо просто очистить бит готовности буферной ячейки в буферной ячейке предыдущего цикла генерации. Потребитель определяет, являются ли данные генерации, которые он потребляет, допустимыми на основе бита готовности буферной ячейки в буферной ячейке, которую он захватил для потребления.
Главное управляющее устройство укажет, что оно готово, во входном состоянии потребителя во время первого входного сканирования и укажет на выходную готовность посредством выходного состояния генератора в течение первого выходного сканирования. Когда выходные данные повреждены, главное управляющее устройство должно очистить бит готовности буферной ячейки в самой последней сгенерированной буферной ячейке выходного состояния генератора, чтобы надлежащим образом указать неверные выходные данные. В одном варианте осуществления, в котором задействуется система RX3i, главное управляющее устройство также отвергнет RUN-линию объединительной панели.
Аналогичным образом подчиненный модуль указывает, что выходные данные являются допустимыми во время своего первого цикла генерации посредством своего входного состояния генератора. Подчиненный модуль может также указывать, что он готов потреблять выходные данные, посредством бита готовности потребителя в выходном состоянии потребителя.
В примерном варианте осуществления подчиненный модуль инициализирует отдельные поля во время процедуры запуска подчиненного модуля. Остальные поля в блоке установки I/O-сканирования отбираются главным модулем непосредственно после конфигурирования модуля. Это дает модулю гибкость в изменении размеров и позиций данных I/O-сканирования во время конфигурации. Если главный модуль имеет постоянный размер данных, который не меняется при конфигурации, весь блок установки I/O-сканирования инициализируется однократно во время процедуры запуска.
Примерный вариант осуществления также включает в себя создание состояния генератора, указывающего на цикл генерации первого модуля, и запись состояния генератора для указания буферной ячейки, из которой второй модуль может считывать данные. Примерный вариант осуществления дополнительно включает в себя создание состояния потребителя, указывающего на цикл потребления второго модуля, и запись состояния потребителя для указания буферной ячейки, в которую первый модуль может записывать данные.
В одном варианте осуществления способ включает в себя создание данных во время первого цикла генерации первого модуля и считывание состояния потребителя, указывающего на цикл потребления второго модуля, с целью определения позиции для записи данных генерации для второго цикла генерации. В этом варианте осуществления способ также включает в себя создание данных в первую буферную ячейку из множества буферных ячеек во время первого цикла генерации и создание данных во вторую буферную ячейку из множества буферных ячеек во время второго цикла генерации.
В дополнительном варианте осуществления способ включает в себя считывание данных во время первого цикла потребителя второго модуля и считывание состояния генератора, указывающего на цикл генерации, с целью определения, доступны ли новые данные генерации для второго цикла потребителя. В этом варианте осуществления способ также включает в себя считывание данных из первой буферной ячейки из множества буферных ячеек во время первого цикла потребления и считывание данных из второй буферной ячейки из множества буферных ячеек во время второго цикла потребления.
Как используется здесь, элемент или шаг, указанные в единственном числе, следует понимать, как не исключающее возможность множественности упомянутых элементов или шагов, если об этом исключении не заявляется явным образом. Кроме того, ссылки на один вариант осуществления настоящего изобретения не следует интерпретировать как исключающие возможность существования дополнительных вариантов осуществления, которые также обладают заявленными особенностями.
Предоставляются примерные варианты осуществления систем и способов обмена данными между генератором и потребителем. Проиллюстрированные системы и способы не ограничиваются описанными здесь конкретными вариантами осуществления, и компоненты системы могут задействоваться независимо и раздельно от других описанных здесь компонентов. Кроме того, шаги, описанные в способе, могут задействоваться независимо и раздельно от других описанных здесь шагов.
Несмотря на то, что изобретение было описано в соответствии с несколькими конкретными вариантами осуществления, специалистам в области техники будет понятно, что изобретение может применяться в модифицированном виде без выхода за пределы сущности и объема формулы.