Программирование DSP VDK: служба STDIO Thu, March 30 2017  

Поделиться

нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

VDK: служба STDIO Печать
Добавил(а) microsin   

В этой статье приведен перевод раздела "STDIO Service" из документации "VisualDSP++ 5.0 Device Drivers and System Services Manual for Blackfin® Processors" [1]. Описывается использование Службы STDIO из библиотеки Системных Служб.

Рассматриваются следующие вопросы:

• Быстрый старт с STDIO
• API Службы STDIO
• Структуры, определения и перечисления, относящиеся к API STDIO

Служба STDIO помогает перенаправить потоки стандартного ввода/вывода STDIO (STDIN, STDOUT и STDERR) в различные периферийные устройства. Каждый поток STDIO может быть перенаправлен на различные выходные устройства. Например, по умолчанию работающий через JTAG-интерфейс поток STDIN можно перенаправить на устройство UART. API разработано так, что в будущем можно будет поддерживать большее количество устройств (пока поддерживается только UART).

Служба STDIO разработана в расчете на работу в многопоточном окружении. В таком случае используются нижележащие службы RTOS, чтобы защитить критические регионы кода.

[Быстрый старт с STDIO]

В этой секции приведено общее описание работы службы STDIO. Подробности API можно найти в разделе "API Службы STDIO". Все функции API и связанные определения, структуры и перечисления можно найти в подключаемом файле заголовка adi_stdio.h.

Инициализация. Перед использованием службы STDIO приложению нужно инициализировать службу вызовом функции adi_stdio_Init.

Функция adi_stdio_Init инициализирует все внутренние структуры данных службы STDIO. Чтобы защитить структуры данных от переинициализации, когда они используются, эта функция может быть вызвана только один раз. Обратите внимание, что если приложение вызвало функцию adi_stdio_Terminate, то для того, чтобы снова можно было использовать службу STDIO, нужно повторно вызвать adi_stdio_Init.

Каждое устройство STDIO требует некоторого количества памяти, чтобы содержать в ней внутренние структуры данных. Требуемая память выделяется динамически службой STDIO из системной кучи (system heap) с использованием функций выделения памяти из кучи. Приложение должно также передать хендлы для других требуемых служб (Менеджер Устройств [2], Менеджер DMA [3] и Менеджер DCB [4]) через функцию инициализации. Функция инициализации возвратит хендл на устройство STDIO по умолчанию (JTAG). Хендл STDIO по умолчанию можно использовать для перенаправления потоков STDIO обратно на устройство по умолчанию. Кусок кода ниже показывает типичную процедуру инициализации.

#include < services/stdio/adi_stdio.h > /* подключаемый файл службы STDIO */
 
uint32_t main(void)
{
   ADI_STDIO_RESULT eResult;  //переменная для кода возврата
   // Здесь должна быть инициализация других требуемых служб, чтобы
   // получить adi_dev_ManagerHandle, adi_dma_ManagerHandle.
   ...
   // Инициализация службы STDIO:
   eResult = adi_stdio_Init(
         adi_dev_ManagerHandle,  // хендл Менеджера Устройств
         adi_dma_ManagerHandle,  // хендл Менеджера DMA
         adi_dcb_ManagerHandle,  // хендл Менеджера DCB
         // Указатель на хендл устройства JTAG STDIO:
         &hSTDIOJTAG);
   // Проверка, была ли служба STDIO успешно инициализирована:
   if(eResult != ADI_STDIO_RESULT_SUCCESS)
   {
      // Что-то пошло не так, здесь должен быть код по обработке
      // ошибки:
      ...
   }
   ...
   ...
}

Регистрация требуемых типов устройств STDIO. После того, как служба STDIO была инициализирована, приложению нужно определить типы устройств STDIO, которые предстоит использовать, и зарегистрировать их для службы STDIO. Следующий код показывает процедуру регистрации для устройства UART.

// Регистрация типа устройства UART:
adi_stdio_RegisterUART();

Открытие требуемого устройства STDIO. Как только требуемое устройство было зарегистрировано для службы STDIO, оно может быть открыто. Устройство STDIO должно быть открыто перед тем, как в него можно будет перенаправить любые потоки STDIO. Служба STDIO берет на себя заботу по конфигурированию устройства STDIO значениями по умолчанию (см. секцию "Команды (ADI_STDIO_COMMAND)" для значений по умолчанию для каждого параметра конфигурации), чтобы сделать устройство работоспособным. Приложение использует интерфейс управления (API-функция adi_stdio_ControlDevice), чтобы поменять конфигурационные значения по умолчанию. Следующий код показывает процедуру открытия устройства UART.

// Открытие типа устройства UART:
eResult = adi_stdio_OpenDevice(ADI_STDIO_DEVICE_TYPE_UART,  // UART Device Type
                               0,                           // физический номер устройства
                               &hSTDIOUART                  // указатель на хендл
                              );
// Проверка, было ли успешно открыто устройство STDIO:
if(eResult != ADI_STDIO_RESULT_SUCCESS)
{
   // Ошибка открытия типа устройства STDIO, здесь нужно предпринять
   // соответствующие действия:
   ...
}

Конфигурирование устройства STDIO. После того, как устройство открыто, его можно сконфигурировать, чтобы поменять конфигурационные значения по умолчанию (см. секцию "Команды (ADI_STDIO_COMMAND)", где приведены значения по умолчанию для каждого конфигурационного параметра). Этот шаг можно пропустить, если значения по умолчанию конфигурации подходят для нужд приложения. Следующий код показывает пример, как запретить эхо символов на устройстве STDOUT.

// Запрет символьного эха для устройства UART:
eResult = adi_stdio_ControlDevice(hSTDIOUART,    // UART Device Type
                                  ADI_STDIO_COMMAND_ENABLE_CHAR_ECHO, /* Command ID */
                                  (void *) false // false, чтобы запретить
                                 );
// Проверка, была ли успешно выполнена команда:
if(eResult != ADI_STDIO_RESULT_SUCCESS)
{
   // Что-то пошло не так, команда управления STDIO не выполнена.
   // Здесь должны быть предприняты для этого соответствующие действия:
   ...
}

Перенаправление потока STDIO. После того, как устройство было открыто, любой из стандартных потоков STDIO (STDIN, STDOUT, STDERR) могут быть перенаправлен в это открытое устройство. Потоки STDIO перечислены в ADI_STDIO_STREAM_STDIN, ADI_STDIO_STREAM_STDOUT, ADI_STDIO_STREAM_STDERR для STDIN, STDOUT, STDERR соответственно, и ADI_STDIO_STREAM_ALL_CONSOLE_IO представляет все три потока STDIO. См. секци. "Типы потоков (ADI_STDIO_STREAM_TYPE)" для более подробного объяснения типов потоков. По умолчанию все потоки STDIO направлены в устройство по умолчанию STDIO (JTAG) библиотекой кода реального времени выполнения (run-time library). Приложение может выбрать отдельный поток STDIO, и перенаправить этот поток в устройство STDIO, которое было открыто, и остальные потоки останутся направленными в устройство STDIO по умолчанию. Следующий кусок кода показывает перенаправление всех потоков на устройство UART, которое уже открыто.

// Перенаправление всех потоков STDIO на UART:
eResult = adi_stdio_RedirectStream (hSTDIOUART, // UART Device Handle
                                    ADI_STDIO_STREAM_ALL_CONSOLE_IO // тип потока
                                   );
// Проверка, были ли потоки успешно перенаправлены:
if(eResult != ADI_STDIO_RESULT_SUCCESS)
{
   // Не получилось перенаправить потоки STDIO, здесь должны быть
   // предприняты соответствующие действия:
   ...
}

Если необходимо, потоки могут быть перенаправлены обратно на устройство по умолчанию. Хендл на устройство по умолчанию был предоставлен для приложения, когда была инициализирована служба STDIO.

Запрет потока STDIO. Если необходимо, приложение может запретить отдельный поток. Когда отдельный поток запрещен, его поток данных перенаправляется в устройство NULL. Это делается внутри службы STDIO. Такая возможность полезна, когда приложению нужно запретить вывод всех отладочных сообщений в окне консоли. В таком случае, приложение может запретить поток STDOUT (ADI_STDIO_STREAM_STDOUT) и все еще продолжать выводить сообщения об ошибках, сохраняя поток STDERR разрешенным. Следующий код показывает, как запретить работу потока STDOUT.

// Запрет только потока STDOUT:
eResult = adi_stdio_DisableStream (
                     ADI_STDIO_STREAM_STDOUT // тип потока, который будет запрещен
                                  );
// Проверка, были ли успешно запрещен поток:
if(eResult != ADI_STDIO_RESULT_SUCCESS)
{
   // Что-то пошло не так, не получилось запретить поток STDOUT, здесь
   // должны быть предприняты по этому поводу какие-то действия:
   ...
}

Завершение. Служба STDIO может быть завершена вызовом функции adi_stdio_Terminate. После того, как служба STDIO была завершена, её API перестанет работать. Чтобы использовать API службы STDIO, она должна быть заново инициализирована.

// Завершение службы STDIO:
eResult = adi_stdio_Terminate();
// Проверка, была ли служба STDIO успешно завершена:
if (eResult != ADI_STDIO_RESULT_SUCCESS)
{
   // Не получилось завершить службу STDIO, здесь должны быть
   // предприняты соответствующие действия:
   ...
}

[API Службы STDIO]

В этом разделе описан интерфейс программирования (API) службы STDIO. Чтобы защититься от конфликтов с другими библиотеками Analog Devices или библиотеками других источников, служба STDIO использует недвусмысленное соглашение об именовании: значения перечислений и операторы typedef используют для имен префикс ADI_STDIO_. Функции и глобальные переменные получают аналогичный префикс в нижнем регистре adi_stdio_.

Каждая API-функция службы STDIO возвращает код ошибки типа ADI_STDIO_RESULT. Наподобие других Системных Служб, возвращаемое значение 0 (ADI_STDIO_RESULT_SUCCESS) показывает, что не было ошибки при вызове функции. Любое ненулевое значение сигнализирует об ошибке определенного типа. Коды ошибки для службы STDIO уникальны от кодов ошибок других системных служб, и они определены в подключаемом файле adi_stdio.h. Это позволяет пользователю определить причину ошибки, просматривая описание кодов ошибок в этом файле.

Эта функция используется для инициализации службы STDIO. Служба STDIO должна быть инициализирована перед вызовом любой другой API-функции этой службы. Каждое устройство STDIO требует некоторый объем памяти, чтобы сохранять в нем свои внутренние структуры данных. Требуемая память выделяется динамически службой STDIO. Приложение должно передать хендл на пул памяти, который используется для динамических выделений памяти. Если в качестве хендла на пул памяти было передано значение NULL, то память будет выделена из системной кучи (system heap) с использованием функций выделения памяти в куче.

Служба STDIO может быть повторно инициализирована только после того, как была перед этим завершена (для завершения используется функция adi_stdio_Terminate). Имейте в виду, что никакая из API-функций службы STDIO не может быть вызвана, пока служба STDIO не будет инициализирована.

ADI_STDIO_RESULT adi_stdio_Init (ADI_DEV_MANAGER_HANDLE const hDeviceMgr,
                                 ADI_DMA_MANAGER_HANDLE const hDMAMgr,
                                 ADI_DCB_HANDLE const hDcbMgr,
                                 ADI_STDIO_DEVICE_HANDLE *phDefaultDevice);

Аргументы:

hDeviceMgr Хендл на Менеджер Устройств.
hDMAMgr Хендл на Менеджер DMA.
hDcbMgr Хендл на Менеджер DCB.
phDefaultDevice Указатель на место в памяти, куда будет записан хендл на устройство STDIO по умолчанию. Не требуется открывать устройство STDIO по умолчанию, это автоматически делает run-time библиотека. При успешной инициализации служба STDIO записывает хендл на устройство по умолчанию в ячейку памяти по заданному указателю.

Возвращаемые значения:

ADI_STDIO_RESULT_SUCCESS Служба STDIO была успешно инициализирована.
ADI_STDIO_RESULT_INVALID_POINTER Недопустимый указатель на ячейку памяти для хендла устройства STDIO по умолчанию.
ADI_STDIO_RESULT_INVALID_HANDLE Один из заданных хендлов служб является недопустимым.
ADI_STDIO_RESULT_SERVICE_ALREADY_INITIALIZED Служба STDIO уже была инициализирована. Повторная инициализация возможна только после завершения службы вызовом API-функции adi_stdio_Terminate.
ADI_STDIO_RESULT_MUTEX_FAILURE Не получилось создать мьютекс для защиты внутренних структур данных.

Эта функция используется для регистрации устройства UART со службой STDIO.

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

void adi_stdio_RegisterUART (void);

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

Перед открытием типа устройства, зарегистрируйте его со службой STDIO. См. секцию "Тип устройства (ADI_STDIO_DEVICE_TYPE)", чтобы найти функции регистрации, которые соответствуют каждому типу устройств. Не требуется регистрировать устройство заново, даже если служба STDIO была завершена и повторно инициализирована.

Тип устройства должен быть одним из значений в перечислении типа устройства (ADI_STDIO_DEVICE_TYPE), и оно не должно быть зарезервированным типом ADI_STDIO_DEVICE_TYPE_RESERVED1 или ADI_STDIO_DEVICE_TYPE_RESERVED2. Эти зарезервированные типы устройств используются внутри службы STDIO.

ADI_STDIO_RESULT adi_stdio_OpenDevice (ADI_STDIO_DEVICE_TYPE eDeviceType,
                                       uint32_t nPhysicalDevNum,
                                       ADI_STDIO_DEVICE_HANDLE *phStdioDevice);

Аргументы:

eDeviceType Тип открываемого устройства. Здесь должно быть одно из значений из перечисления ADI_STDIO_DEVICE_TYPE.
nPhysicalDevNum Номер физического устройства, которое должно быть открыто. Может быть больше одного устройства одного типа для имеющегося процессора. Этот параметр используется для идентификации конкретного физического устройства. Например, может быть несколько устройств UART, тогда значение 0 в этом параметре задает использование UART0, а значение 1 задает использование UART1 для операций STDIO. Обратитесь к описанию процессора и используемой отладочной платы, чтобы получить информацию об устройстве, которое можно подключить к консоли.
phStdioDevice Указатель на хендл открываемого устройства. При успешном открытии служба STDIO запишет туда хендл на открытое устройство STDIO. Имейте в виду, что это не хендл физического устройства драйвера, а хендл устройства STDIO. Действительный хендл физического устройства сохраняется внутри службы STDIO. Если необходимо, то этот хендл физического устройства можно получить с использованием команды ADI_STDIO_COMMAND_GET_DEVICE_HANDLE (0x120002).

Возвращаемые значения:

ADI_STDIO_RESULT_SUCCESS Устройство STDIO было успешно открыто.
ADI_STDIO_RESULT_SERVICE_NOT_INITIALIZED Служба STDIO не была инициализирована.
ADI_STDIO_RESULT_INVALID_POINTER Указатель на хендл устройства STDIO является недопустимым.
ADI_STDIO_RESULT_NO_STDIO_DEVICES Достигнут предел максимально возможного количества открытых устройств STDIO.
ADI_STDIO_RESULT_DEVICE_FAILED Не получилось открыть физическое устройство.
ADI_STDIO_RESULT_INVALID_DEVICE_TYPE Задан недопустимый тип устройства.
ADI_STDIO_RESULT_DEVICE_NOT_REGISTERED Заданный тип устройства не был зарегистрирован для службы STDIO.

Эта функция используется для перенаправления одного или большего количества потоков STDIO в предоставленное устройство STDIO. Чтобы перенаправить все потоки сразу, приложение должно передать в качестве типа потока значение ADI_STDIO_STREAM_ALL_CONSOLE_IO.

Устройство, в которое перенаправляется поток, должно быть предварительно открыто перед вызовом функции adi_stdio_Redirect.

ADI_STDIO_RESULT adi_stdio_RedirectStream (ADI_STDIO_DEVICE_HANDLE hStdioDevice,
                                           ADI_STDIO_STREAM_TYPE eStreamType);

Аргументы:

hStdioDevice Хендл к устройству STDIO, на которое будет перенаправлен указанный поток.
eStreamType Тип потока STDIO, который будет перенаправлен. В качестве значения для типа потока должно быть указано одно из значений перечисления ADI_STDIO_STREAM_TYPE.
phStdioDevice Указатель на хендл открываемого устройства. При успешном открытии служба STDIO запишет туда хендл на открытое устройство STDIO. Имейте в виду, что это не хендл физического устройства драйвера, а хендл устройства STDIO. Действительный хендл физического устройства сохраняется внутри службы STDIO. Если необходимо, то этот хендл физического устройства можно получить с использованием команды ADI_STDIO_COMMAND_GET_DEVICE_HANDLE (0x120002).

Возвращаемые значения:

ADI_STDIO_RESULT_SUCCESS На указанное устройство STDIO был успешно перенаправлен указанный поток.
ADI_STDIO_RESULT_SERVICE_NOT_INITIALIZED Служба STDIO не была инициализирована.
ADI_STDIO_RESULT_INVALID_HANDLE Указанный хендл устройства STDIO является недопустимым.
ADI_STDIO_RESULT_STREAM_NOT_SUPPORTED Указанный тип потока не поддерживается для указанного устройства.
ADI_STDIO_RESULT_REDIRECT_FAILED Не получилось перенаправить указанный поток.
ADI_STDIO_RESULT_DEVICE_FAILED Ошибка инициализации физического устройства STDIO.
ADI_STDIO_RESULT_SEMAPHORE_FAILURE Не получилось создать семафор, что требуется для внутренних целей службы STDIO.
ADI_STDIO_RESULT_DEVTAB_REGISTER_FAILED Не получилось зарегистрировать указанное устройство в таблице устройств run-time библиотеки.

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

ADI_STDIO_RESULT adi_stdio_DisableStream (ADI_STDIO_STREAM_TYPE eStreamType);

Аргумент:

eStreamType Тип потока STDIO, который будет запрещен.

Возвращаемые значения:

ADI_STDIO_RESULT_SUCCESS Указанный поток был успешно запрещен.
ADI_STDIO_RESULT_SERVICE_NOT_INITIALIZED Служба STDIO не была инициализирована.
ADI_STDIO_RESULT_SEMAPHORE_FAILURE Не получилось создать семафор, что требуется для внутренних целей службы STDIO.
ADI_STDIO_RESULT_DEVTAB_REGISTER_FAILED Не получилось зарегистрировать указанное устройство в таблице устройств run-time библиотеки.

Эта функция используется в основном для изменения конфигурационных параметров указанного устройства. Функция также используется для получения некоторых параметров от службы STDIO, например для получения хендла физического устройства.

ADI_STDIO_RESULT adi_stdio_ControlDevice (ADI_STDIO_DEVICE_HANDLE hStdioDevice,
                                          uint32_t nCommandID,
                                          void *const pValue);

Аргументы:

hStdioDevice Хендл к устройству STDIO.
nCommandID Идентификатор выполняемой команды. Список допустимых команд см. в секции "Команды (ADI_STDIO_COMMAND)".
pValue Аргумент, необходимый для выполнения команды. В зависимости от команды требуются различные типы аргументов. Подробности см. в описании команд, секция "Команды (ADI_STDIO_COMMAND)".

Возвращаемые значения:

ADI_STDIO_RESULT_SUCCESS Указанная команда была успешно завершена.
ADI_STDIO_RESULT_INVALID_HANDLE Недопустимый хендл устройства STDIO.
ADI_STDIO_RESULT_DEVICE_FAILED Ошибка, обнаруженная на физическом устройстве.
ADI_STDIO_RESULT_COMMAND_NOT_SUPPORTED Указанная команда не поддерживается на указанном устройстве.

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

ADI_STDIO_RESULT adi_stdio_CloseDevice (ADI_STDIO_DEVICE_HANDLE const hStdioDevice);

Аргументы:

hStdioDevice Хендл к закрываемому устройству STDIO.

Возвращаемые значения:

ADI_STDIO_RESULT_SUCCESS Указанное устройство STDIO было успешно закрыто.
ADI_STDIO_RESULT_INVALID_HANDLE Недопустимый хендл устройства STDIO.
ADI_STDIO_RESULT_DEVICE_FAILED Не получилось закрыть физическое устройство, соответствующее указанному устройству STDIO. Физическое устройство было открыто службой STDIO, когда приложение вызвало функцию adi_stdio_OpenDevice.
ADI_STDIO_RESULT_COMMAND_NOT_SUPPORTED Указанная команда не поддерживается на указанном устройстве.

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

Эта функция не закрывает ни одно из устройств STDIO, которое было открыто приложением. Если требуется переинициализировать службу STDIO после её завершения, то рекомендуется закрыть все устройства перед завершением службы STDIO.

Перед закрытием служба STDIO перенаправит все потоки STDIO обратно в устройство по умолчанию.

Ни одна из API-функций STDIO не будет работать, когда служба STDIO была завершена. Для работы API нужно заново переинициализировать службу вызовом функции adi_stdio_Init.

ADI_STDIO_RESULT adi_stdio_Terminate (void);

Возвращаемые значения:

ADI_STDIO_RESULT_SUCCESS Служба STDIO была успешно завершена.
ADI_STDIO_RESULT_SERVICE_NOT_INITIALIZED Попытка завершить службу STDIO, которая не была инициализирована.

[Структуры, определения и перечисления, относящиеся к API STDIO]

В этой секции перечислены все определения структур, констант и перечислений, которые используются в API службы STDIO. Всю эту информацию можно найти в файле adi_stdio.h.

Типы потоков (ADI_STDIO_STREAM_TYPE). В таблице 14-1 приведен список перечисления поддерживаемых типов потоков STDIO. Эти значения используются для указания потока, который должен быть перенаправлен в определенное устройство, или для запрета потока.

Таблица 14-1. Типы потоков и их описание.

Имя типа потока Значение Описание
ADI_STDIO_STREAM_STDIN 0 Входной поток консоли (STDIN).
ADI_STDIO_STREAM_STDOUT 1 Выходной поток консоли (STDOUT).
ADI_STDIO_STREAM_STDERR 2 Выходной поток ошибок консоли (STDERR).
ADI_STDIO_STREAM_ALL_CONSOLE_IO 3 Все вышеперечисленные потоки ввода/вывода (STDIN, STDOUT, STDERR).

Типы устройств (ADI_STDIO_DEVICE_TYPE). В таблице 14-2 приведен список перечисления поддерживаемых типов устройств STDIO. Тип устройства используется для открытия устройства с STDIO.

Таблица 14-2. Типы устройств и их описание.

Тип устройства Значение Описание
ADI_STDIO_DEVICE_TYPE_RESERVED1 0 Тип устройства зарезервирован для внутреннего использование службой STDIO.
ADI_STDIO_DEVICE_TYPE_RESERVED2 1 Тип устройства зарезервирован для внутреннего использование службой STDIO.
ADI_STDIO_DEVICE_TYPE_UART 2 Устройство UART.
ADI_STDIO_DEVICE_TYPE_MAX 3 Максимальное количество поддерживаемых типов устройств.

Команды (ADI_STDIO_COMMAND). Здесь приведены описания некоторых команд, доступных для установки или получения конфигурационного параметра.

Эта команда используется, чтобы разрешить или запретить режим Unix для символов окончания строк (end-of-line, EOL). В режиме Unix строка заканчивается только на один символ LF (LF означает line feed, перевод строки), и в режиме DOS строка заканчивается на комбинацию символов CR + LF (CR означает carriage return, возврат каретки). По умолчанию установлен режим Unix.

Укажите с командой true, чтобы разрешить режим Unix, и false, чтобы запретить его (установить режим DOS).

Эта команда используется, чтобы разрешить службе печатать в поток stdout символы, поступающие в поток stdin (char echo, символьное эхо). По умолчанию символьное эхо разрешено.

Укажите с командой true, чтобы разрешить символьное эхо, и false, чтобы запретить его.

Эта команда используется, чтобы получить хендл физического устройства. Когда устройство STDIO открыто с использованием API-функции adi_stdio_OpenDevice, соответствующее физическое устройство открывается службой STDIO, и хендл физического устройства сохраняется внутри службы. Приложениям обычно не нужно получать хендл на физическое устройство при использовании службы. Эту команду можно использовать в необычных случаях, где нужно установить некоторые специальные конфигурации физического устройства, которые недоступны через API службы STDIO. Не рекомендуется устанавливать любые конфигурационные значения напрямую из приложения. Это может привести к непредсказуемому поведению.

Вместе с командой передается указатель на ADI_DEV_DEVICE_HANDLE (этот тип определен в файле adi_dev.h), куда служба STDIO запишет хендл физического устройства.

Эта команда используется для запрета проверки данных на четность, либо для установки проверки данных на нечетность или четность при обмене через UART. По умолчанию проверка на четность запрещена службой STDIO.

Вместе с командой передается значение их списка типов четности (ADI_STDIO_PARITY_TYPE). Когда выбрано ADI_STDIO_PARITY_TYPE_ODD или ADI_STDIO_PARITY_TYPE_EVEN, то служба STDIO автоматически разрешает проверку на четность.

Эта команда используется для установки длины слова UART. По умолчанию длина слова установлена на 8 бит. Команда использует параметр:

uint8_t nWordLength;

Значение nWordLength может быть установлено на 5, 6, 7 или 8 бит.

Эта команда используется для установки количества стоповых бит UART. По умолчанию используется 1 стоповый бит. Команда использует параметр:

uint8_t nStopBits;

Значение nStopBits может быть установлено на 1 или 2. Значение 1 устанавливает один стоп-бит. Значение 2 устанавливает два стоп-бита, когда длина слова UART установлено не на значение 5 бит, и устанавливает 1.5 стоп-бита, когда длина слова UART установлена на 5 бит.

Эта команда используется для установки символа автодетекта скорости UART (auto baud character). Когда разрешено автоопределение скорости, то для этого будет использоваться указанный символ. Эта команда задает символ, который драйвер ожидает для автоматического детектирования скорости. Команда использует параметр:

uint8_t cAutoBaud;

В качестве значения для cAutoBaud может быть любой символ ASCII.

Эта команда используется для разрешения автоопределения скорости UART. Команда разрешает драйверу автоматически измерить длительность интервалов бит символа, и по ним определить и настроить скорость UART. Эта команда должна использоваться вместе с командой ADI_STDIO_COMMAND_SET_UART_AUTO_BAUD_CHAR. Приложение сначала должно установить символ для автоопределения скорости, перед тем как разрешить работу автоопределения.

Эта команда используется для конфигурирования UART на заданную скорость передачи и приема (baud rate). По умолчанию скорость установлена на 57600 бод. Команда использует параметр:

uint16_t nBaudRate;

Значение nBaudRate указывает требуемую скорость в бодах.

Типы четности (ADI_STDIO_PARITY_TYPE). В таблице 14-3 приведен список перечисления для возможных типов проверки данных на четность.

Таблица 14-3. Типы четности и их описание.

Тип контроля четности Значение Описание
ADI_STDIO_PARITY_TYPE_NONE 0x0 Проверка данных по четности отключена.
ADI_STDIO_PARITY_TYPE_ODD 0x1 Включена проверка данных на нечетность.
ADI_STDIO_PARITY_TYPE_EVEN 0x2 Включена проверка данных на четность.

Коды возврата (ADI_STDIO_RESULT). В таблице 14-4 приведен список перечисления возможных кодов возврата из API-функций службы STDIO.

Таблица 14-4. Коды возврата и их описание.

Код результата Значение Описание
ADI_STDIO_RESULT_SUCCESS 0x000000 Код обычного успешного завершения.
ADI_STDIO_RESULT_FAILED 0x000001 Код обычного неудачного завершения.
ADI_STDIO_RESULT_SERVICE_NOT_INITIALIZED 0x120000 Служба STDIO не была инициализирована.
ADI_STDIO_RESULT_SERVICE_ALREADY_INITIALIZED 0x120001 Служба STDIO уже была инициализирована.
ADI_STDIO_RESULT_INSUFFICIENT_MEMORY 0x120002 Недостаточное количество памяти, предоставленное для запрошенного количества экземпляров (устройств?).
ADI_STDIO_RESULT_INVALID_HANDLE 0x120003 Недопустимый указанный хендл.
ADI_STDIO_RESULT_INVALID_DEVICE_TYPE 0x120004 Недопустимый указанный тип устройства.
ADI_STDIO_RESULT_DEVICE_NOT_REGISTERED 0x120005 Указанный тип устройства не зарегистрирован.
ADI_STDIO_RESULT_REDIRECT_FAILED 0x120006 Ошибка перенаправления указанного потока на указанное устройство.
ADI_STDIO_RESULT_SEMAPHORE_FAILURE 0x120007 Ошибка создания семафора.
ADI_STDIO_RESULT_MUTEX_FAILURE 0x120008 Ошибка создания мьютекса.
ADI_STDIO_RESULT_DEVTAB_REGISTER_FAILED 0x120009 Ошибка регистрации устройства STDIO для библиотеки ввода/вывода.
ADI_STDIO_RESULT_COMMAND_NOT_SUPPORTED 0x12000A Указанная команда не поддерживается не указанном устройстве.
ADI_STDIO_RESULT_DEVICE_FAILED 0x12000B Ошибка драйвера физического устройства.
ADI_STDIO_RESULT_INVALID_POINTER 0x12000C Указатель недопустим или равен NULL.
ADI_STDIO_RESULT_INVALID_FUNCTION_POINTER 0x12000D Указатель на функцию равен NULL.
ADI_STDIO_RESULT_NO_STDIO_DEVICES 0x12000E Достигнут предел максимального количества устройств STDIO, которое может быть открыто в системе.
ADI_STDIO_RESULT_STREAM_NOT_SUPPORTED 0x12000F Указанный поток не поддерживается на указанном устройстве.

[Ссылки]

1. VisualDSP++ 5.0 Device Drivers and System Services Manual for Blackfin® Processors site:analog.com.
2. VDK: драйверы устройств и системные службы процессоров Blackfin.
3. VDK: менеджер DMA.
4. VDK: менеджер отложенных функций обратного вызова.

 

Добавить комментарий


Защитный код
Обновить

Top of Page