Я работаю над проектом, в котором модуль A имеет буфер памяти с содержимым DMA и вызывает функцию модуля B для выполнения операции DMA. Для упрощения это выглядит так:
Модуль A:
void get_info()
{
void *outBuffer = kmalloc(10);
void *inBuffer = kmalloc(10);
perform_dma(outBuffer); // function from module B
read_output(&inBuffer); // function from module B
}
Модуль B:
void perform_dma(void *outBuffer)
{
void *dma_buffer = dma_alloc_coherent() // <-- allocate a new DMA buffer
memcpy(dma_buffer, outBuffer, 10);
do_dma(); // <-- after this is done, dma_buffer has the content module A needs.
}
void read_output(void **inBuffer)
{
memcpy(*inBuffer, dma_buffer, 10);
}
Я понимаю, что это может быть неэффективно, но я не могу изменить модуль B и могу использовать только предоставленные API. Мне разрешено изменить B 'perform_dma(void *outBuffer)
прототип на perform_dma(void **outBuffer)
в лучшем случае. Это работает большую часть времени, но в ситуации (из-за всех прерываний / событий очереди, вовлеченных во весь проект) я не смогу явно вызвать read_output()
и предоставить inBuffer
для чтения содержимого обратно, но могу получить доступ только к outBuffer
адрес после отправки на B .
Есть ли способ сопоставить outBuffer
модуль формы A с dma_buffer
, расположенным в модуле B , чтобы иметь возможность считывать выходные данные с того же outBuffer
?