请问dma_barrier如何使用呢?
-
如题,在编译手册里看到有dma_barrier,文档内容如下图,但在使用时,会报出undefined reference to `slave_dma_barrier'。我有include dma.h,想请教各位dma_barrier应该怎么用呢?如果有一段示例代码就更好了,谢谢!
-
可以试试编译手册62页的
athread_dma_barrier()
-
-
-
此回复已被删除!
-
两者不是同样的功能.
而且, DMA保序的意义是: 在前面的DMA完成之前, 不会执行后面的DMA. 可以用athread_dma_barrier()
实现或者是使用mode为DMA_BARRIER
的dma原语.
athread_syn
是从核之间同步, 在所有参与同步的从核进入athread_syn
之前, 不会执行下面的指令.
-
@夜深忽梦少年事 明白了,谢谢!
-
@sam 需要注意的一件事情是,
dma_barrier
只能使后续的DMA操作无法发出, 但是其他指令会继续执行.
如果想要不执行后面的命令可以试试这样搞:#define pe_init() volatile int _reply = 0, _count = 0; #define pe_get(src, dst, size) {athread_get(PE_MODE, src, dst, size, &_reply, 0, 0, 0); _count ++}; #define pe_put(src, dst, size) {athread_put(PE_MODE, src, dst, size, &_reply, 0, 0, 0); _count ++}; #define pe_syn() while (_reply != _count);
然后发出
athread_get/athread_put
请求时自动更新count, 使得编程容易一点.void test(){ pe_init(); //一堆pe_get... pe_syn(); }
-
@夜深忽梦少年事 您提到的问题,我在测试的时候也发现了,现在明白原因了,太谢谢啦~