Why Does the dsp.AsyncBuffer Object Error
When You Call read Before write?
In the dsp.AsyncBuffer System object™, you
must initialize the buffer before the first call to the read method.
To initialize the buffer, call either the write or setup method.
Consider the bufferWrapper function, which
writes and reads data from an asynchronous buffer. When the input cmd is
set to true, the object writes data to the buffer.
When cmd is false, the object
reads data from the buffer.
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
Call the buffer with cmd set to false.
bufferWrapper(1,false);
The function errors with the following message:
Buffer not initialized. You must call write before read.
When you generate code from this function, the object throws
an error that the buffer 'Cache' is undefined.
codegen bufferWrapper -args {1,false}
??? Property 'Cache' is undefined on some execution paths but is used inside the called function.
Both these error messages indicate that the buffer is not initialized
at the first call to the read method in one of the
execution paths.
To resolve these errors, call write or setup before
the first call to read. If you are calling setup,
call it only once at the beginning, during the buffer construction.
In this function, setup is called before 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
You can now read the buffer without any errors.
bufferWrapper_setup(1,false);
Generating code from this function now successfully generates the MEX file, because the cache is defined on all execution paths.
codegen bufferWrapper_setup -args {1,false}