dsp.AsyncBuffer
Объектная ошибка, когда вы вызываете read
Перед write
?В dsp.AsyncBuffer
Система object™, необходимо инициализировать буфер перед первым вызовом read
метод. Чтобы инициализировать буфер, вызовите любого write
или setup
метод.
Рассмотрите bufferWrapper
функция, которая пишет и считывает данные из асинхронного буфера. Когда вход cmd
установлен в true
, объект записывает данные к буферу. Когда cmd
false
, объект считывает данные из буфера.
function [y,isData] = bufferWrapper(u,cmd) persistent asyncBuff if isempty(asyncBuff) asyncBuff = dsp.AsyncBuffer; end if cmd % write write(asyncBuff,u); y = zeros(128,1); isData = false; else % read isData = true; y = read(asyncBuff,128,64); end
Вызовите буфер с cmd
установите на false
.
bufferWrapper(1,false);
Функциональные ошибки со следующим сообщением:
Buffer not initialized. You must call write before read.
Когда вы генерируете код от этой функции, объект выдает ошибку что буферный 'Cache'
isundefined.
codegen bufferWrapper -args {1,false}
??? Property 'Cache' is undefined on some execution paths but is used inside the called function.
Обратите внимание на то, что codegen
функция не поддерживается в MATLAB Online.
Оба этих сообщения об ошибке указывают, что буфер не инициализируется в первом вызове read
метод в одном из путей к выполнению.
Чтобы разрешить эти ошибки, вызовите write
или setup
перед первым вызовом read
. Если вы вызываете setup
, вызовите его только однажды вначале, во время буферной конструкции.
В этой функции, setup
называется перед read
.
function [y,isData] = bufferWrapper_setup(u,cmd) persistent asyncBuff if isempty(asyncBuff) asyncBuff = dsp.AsyncBuffer; setup(asyncBuff,u); end if cmd % write write(asyncBuff,u); y = zeros(128,1); isData = false; else % read isData = true; y = read(asyncBuff,128,64); end
Можно теперь считать буфер без любых ошибок.
bufferWrapper_setup(1,false);
Генерация кода от этой функции теперь успешно генерирует файл MEX, потому что кэш задан на всех путях к выполнению.
codegen bufferWrapper_setup -args {1,false}