Распределение буфера

Функция GetASPI32Buffer

Обмен данными между устройством и программой всегда подразумевает передачу определенного количества байтов. Ввиду большого разнообразия существующего оборудования достаточно сложно согласовать размер одно¬го пакета байтов для передачи между программой и устройством так, что¬бы не вызвать переполнения или сбоя памяти. Для безопасного распреде¬ления блоков памяти в случае применения интерфейса ASPI и служит функция GetASPi32Buffer. Эта функция позволяет без проблем распределить блоки памяти размером до 512 Кбайт при использовании интерфейса ASPI. Применение функции распределения памяти virtualAlloc из Win32 не гарантирует полное отсутствие фрагментации для передачи через контроллер шины пакета размером более 64 Кбайт. Функция интерфейса ASPI GetASPi32Buffer лишена проблем с фрагментацией памяти, и рекомендуется использовать ее именно для выделения необходимой памяти. Запись функции выглядит следующим образом:

BOOL GetASPl32Buffer(PASPI32BUFF pab);

Как видим, функция имеет один параметр, представляющий собой указатель на определенную структуру данных с именем ASPI32BUFF, которая выглядит следующим образом:

typedef struct

{

LPBYTE AB_BufPointer;

DWORD AB_BufLen;

DWORD AB_ZeroFill;

DWORD AB_Reserved;

} ASPI32BUFF, *PASPI32BUFF;

Рассмотрим поля этой структуры.

  • AB_BufPointer

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

  • AB_BufLen

    Сюда следует поместить желаемый размер буфера передачи в байтах. Значение буфера должно быть меньше или равно 512 Кбайт. Также желательно не использовать размер буфера меньше чем 64 Кбайта, хотя несоблюдение этой рекомендации не вызовет никаких проблем, кроме увеличения количества тактов процессора.

  • AB_ZeroFill

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

  • AB_Reserved

    Это поле зарезервировано и не используется.

После выполнения функция GetASPi32Buffer вернет TRUE или FALSE. Значение TRUE будет возвращено при успешном выделении требуемого размера буфера. Если функция вернет FALSE, значит, функция не смогла найти и выделить запрошенный размер буфера.

А теперь приведем простой пример кода, демонстрирующий использование функции расширения ASPI GetASPi32Buffer для выделения буфера размером 256 Кбайт.

Листинг 3.1. Пример использования функции GetASPi32Buffer на Visual C++

Теперь приведем этот же пример, реализованный на языке Visual Basic.

Листинг 3.2. Пример использования функции GetASPi32Buffer на Visual Basic.

Вот и все, что нужно знать о функции GetASPi32Buffer. Можно переходить к следующей функции.

 

 

2021-04-01

Google сообщил о запуске проекта Dunant

Проект Dunant, начатый в 2018 году, был запущен в эксплуатацию. Трансатлантический интернет-кабель соединяет США и континентальную Европу. Общая протяженность...

подробнее
2020-04-06

Новшества в обновленной Windows 10

Корпорация Microsoft завершила разработку обновления, в котором добавлено множество функций. Обновление содержит как доработку уже имеющихся систем, так...

подробнее

 

Все новости...

 

Научно-Техническое Объединение

Тел.: +7(4752) 55-95-86

E-mail:e-mail