Що таке кільцевої буфер?

Створення буфера в C/C ++

Із-за обмеженості ресурсів вбудованих систем структури даних з циклічним буфером можна знайти в більшості проектів фіксованого розміру, які працюють так, як якщо б пам’ять за своєю природою була безперервної та циклічної. Дані не потрібно переставляти, оскільки пам’ять генерується і використовується, а коригуються покажчики голови/хвоста. Під час створення циклічної буферної бібліотеки потрібно, щоб користувачі працювали з бібліотечними API, а не змінювали структуру напряму. Тому використовують інкапсуляцію кільцевого буферу на “Сі”. Таким чином розробник збереже бібліотечну реалізацію, змінюючи її по мірі необхідності, не вимагаючи, щоб кінцеві користувачі також оновлювали її.

Користувачі не можуть працювати з «circular_but_t» покажчиком, створюється тип дескриптора, який можна використовувати замість нього. Це позбавить від необхідності наводити курсор у реалізації функції «.typedefcbuf_handle_t». Розробникам потрібно зібрати API для бібліотеки. Вони взаємодіють з бібліотекою кільцевого буфера «C», використовуючи непрозорий тип дескриптора, який створюється під час ініціалізації. Зазвичай вибирають «uint8_t» в якості базового типу даних. Але можна використовувати будь-який конкретний тип, виявляючи обережність, щоб правильно обробляти базовий буфер і кількість байтів. Користувачі взаємодіють з контейнером, виконуючи обов’язкові процедури:

  • Ініціалізувати контейнер і його розмір.
  • Скинути кругової контейнер.
  • Додавати дані в кільцевий буфер на “Сі”.
  • Отримувати наступне значення з контейнера.
  • Зажадати інформацію про поточному кількості елементів і максимальної ємності.
  • І «повний», і «порожній» випадки виглядають однаково: “head” і “tail”, покажчики рівні. Існує два підходи, различающие повний і порожній:

  • Повне стан tail + 1 == head.
  • Пусте стан head == tail.