СИНТАКСИС
#include <hal.h> bool hal_port_read(hal_port_t port, char* dest, unsigned count); bool hal_port_peek(hal_port_t port, char* dest, unsigned count); bool hal_port_peek_commit(hal_port_t port, unsigned count); unsigned hal_port_readable(hal_port_t port); void hal_port_clear(hal_port_t port); bool hal_port_write(hal_port_t port, const char* src, unsigned count); unsigned hal_port_writable(hal_port_t port); unsigned hal_port_buffer_size(hal_port_t port); #ifdef ULAPI void hal_port_wait_readable(hal_port_t** port, unsigned count, sig_atomic_t* stop); void hal_port_wait_writable(hal_port_t** port, unsigned count, sig_atomic_t* stop); #endif
ОПИС
Порт HAL — це контакт HAL, який діє як односторонній байтовий потік даних у режимі реального часу. Вихідний порт будь-якого компонента може бути підключений до вхідного порту будь-якого іншого компонента за допомогою сигналу. Дані, записані на вихідний контакт, стають доступними для вхідного контакту. Сигнал порту HAL може з’єднувати тільки одного записувача та одного зчитувача.
Порт також буферизує дані. Користувачі повинні визначити правильний розмір буфера залежно від передбачуваного застосування.
hal_port_read
Зчитує count байтів з порту в буфер призначення dest. hal_port_read зчитає count байтів, якщо і тільки якщо count байтів доступні для зчитування, в іншому випадку порт залишиться без змін. Повертає true, якщо count байтів було зчитано, і false в іншому випадку. Ця функція повинна викликатися тільки компонентом, який володіє виводом IN PORT.
hal_port_peek
Поводиться так само, як hal_port_read, однак не споживає байти з порту HAL. Повторні виклики hal_port_peek повертають ті самі дані. Повертає true, якщо було прочитано count байтів, і false в іншому випадку. Ця функція повинна викликатися тільки компонентом, який володіє виводом IN PORT.
hal_port_peek_commit
Пересуває позицію читання в буфері порту на count байтів. hal_port_peek, за яким слідує hal_port_peek_commit, буде працювати аналогічно до hal_port_read з тим самим значенням count. Повертає true, якщо count читаних байтів було пропущено і вони більше не доступні, та false, якщо жодних байтів не було пропущено. Ця функція повинна викликатися лише компонентом, який володіє виводом IN PORT.
hal_port_readable
Повертає кількість байтів, доступних для читання з порту. Цю функцію можна безпечно викликати з будь-якого компонента.
hal_port_clear
Очищає вказаний порт від усіх даних. hal_port_clear має викликатися лише компонентом, якому належить вивід IN PORT.
hal_port_write
Записує значення count байтів з src у порт. Повертає значення true, якщо значення count байтів було записано, і false в іншому випадку. Цю функцію слід викликати лише компонентом, якому належить вивід OUT PORT.
hal_port_writable
Повертає кількість байтів, які можна записати в порт. Цю функцію можна безпечно викликати з будь-якого компонента.
hal_port_buffer_size
Повертає максимальну кількість байтів, яку порт може буферизувати. Цю функцію можна безпечно викликати з будь-якого компонента.
hal_port_wait_readable
Очікує, поки порт матиме певну кількість байтів або більше, доступних для читання, або поки не буде встановлено прапорець зупинки.
hal_port_wait_writable
Очікує, поки порт матиме певну кількість байтів або більше, доступних для запису, або поки не буде встановлено прапорець зупинки.
АРГУМЕНТИ
- hal_port_t
-
Дескриптор об’єкта порту. Створено користувачем hal_pin_new.
- dest
-
Масив байтів, у який hal_port_read та hal_port_peek копіюватимуть дані. Він має бути виділений викликаючою функцією та мати довжину щонайменше count байтів.
- рахувати
-
Кількість байтів, які hal_port_read, hal_port_peek та hal_port_write скопіюють до dest або з src.
- src
-
Масив байтів, з якого hal_port_write копіюватиме дані в буфер порту. Розмір масиву має бути не менше 1000 байтів.
- стій
-
Вказівник на значення, яке контролюється під час очікування. Якщо воно не дорівнює нулю, операція очікування повертається раніше. Це дозволяє безпечно завершити виклик очікування у разі сигналу.
ЗРАЗОК КОДУ
У дереві вихідного коду під src/hal/components/raster.comp знаходиться компонент реального часу, призначений для керування лазером. src/tests/raster — це тестова програма, яка також програмує растровий компонент з Python.
МІРКУВАННЯ В РЕАЛЬНОМУ ЧАСІ
hal_port_read, hal_port_peek, hal_port_peek_commit, hal_port_readable, hal_port_clear, hal_port_write, hal_port_writable, hal_port_buffer_size may be called from realtime code.
hal_port_wait_writable, hal_port_wait_readable may be called from ULAPI code.
ДИВІТЬСЯ ТАКОЖ
raster(9)