Почему 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' не определен.

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}

Смотрите также

Системные объекты

Связанные примеры

Больше о