Выделение памяти для буферов

У каждого буфера есть определённый размер (то есть ёмкость памяти). Эта ёмкость выделяется по запросу вашей программы. При первоначальной загрузке устройства буферам не выделено никакой памяти.

Память для буферов выделяется страницами. Страница - это 256 байт памяти. Выделение памяти для буфера проходит в два этапа: сначала нужно запросить определённый объём (число страниц), а затем выполнить само выделение. Для буфера приёма (RX) память запрашивается через ser.rxbuffrq, а для буфера передачи (TX) - через ser.txbuffrq.

Метод выделения (sys.buffalloc) применяется сразу ко всем ранее заданным буферам, одним махом. Поэтому:

dim in, out as byte
out = ser.txbuffrq(10) ' Requesting 10 pages for the TX buffer. Out will then contain how many can actually be allocated.
in = ser.rxbuffrq(7) ' Requesting 7 pages for the RX buffer. Will return number of pages which can actually be allocated.
' ....  Allocation requests for buffers of other objects ....
sys.buffalloc ' Performs actual memory allocation, as per previous requests.

Само выделение памяти занимает до 100ms, поэтому обычно его выполняют один раз, при загрузке, сразу для всех нужных буферов. Если какой-то буфер не нужен, можно не выделять ему памяти. Фактически он будет отключён.

Вы не всегда получите весь запрошенный объём памяти. Память - ресурс не бесконечный: если вы уже запросили (и получили) 95% памяти своей платформы, следующий запрос получит не более 5% памяти, даже если вы запросили 10%.

У каждого буфера есть небольшие накладные расходы. Это значит, что не все 100% выделенной буферу памяти доступны для использования. Определённое число байт в каждом буфере зарезервировано под переменные, необходимые для управления этим буфером. Это 17 байт для 16-битных платформ и 33 байта для 32-битных. Тип платформы указан в документации на платформу.

Таким образом, если запросить (и получить) буфер из 2 страниц (256 * 2 = 512), в нём можно хранить только 512 - 17 или 512 - 33 байт, в зависимости от типа платформы.

Внимание

Изменить размер можно только у буферов тех последовательных портов, которые закрыты (ser.enabled = 0) в момент выполнения метода sys.buffalloc. Если в момент выполнения метода sys.buffalloc порт открыт, ёмкость его буферов останется прежней, даже если вы запросили изменения через ser.rxbuffrq и ser.txbuffrq.

Исходный материал Tibbo обновлён 8 августа 2022Оригинал на docs.tibbo.com · Сообщить об ошибке