这个程序实现的是:共享内存中的一组数据,部分被用DMA传输到LS中进行加1操作,最后再将结果用DMA传到共享内存。
spu端程序single_buffer.c:
解释:LS中开2个unsigned int型的数组,长度均为10。这与共享内存中开辟的数组大小不同是值得注意的地方。
main函数中的第2个参数是接收spe_context_run函数中的第4个参数,这个ppu与spu端的接口。mfc_get函数中的第3个参数必须是16的整数倍,是指DMA传输的数据量,若不是16的整数倍,运行时会出现“总线错误”。
mfc_get, mfc_write_tag_mask, mfc_read_tag_status_all这3个函数中间不能插入任何代码,否则会一直运行不停止。
这里面的unsigned int型占32位,正如mfc_get传输16字节的数据,结果就给4个unsigned int数加1,其他6个不变。这点能从函数定义void mfc_get(volatile void *ls, uint64_t ea, uint32_t size, uint32_t tag, uint32_t tid, uint32_t rid)中看出,其中uint32_t指的就是unsigned int占32位。
ppu端程序ppu.c:
解释:
ppe_src_buf[10] = {1,2,3,4,5,6,7,8,9,10};这样给数组赋值时错误的,要写成int ppe_src_buf[10] = {1,2,3,4,5,6,7,8,9,10};
结果如下图: