大家好,我这边的工程,之前用到了音频dma,是做了双缓冲,
用的是Write Through模式
void sys_mmu_init(void)
{
unsigned int * ttb;
ttb=mmuTable;
map_l1_section(ttb, 0x00000000, 0x00000000, SZ_2G, 0);
map_l1_section(ttb, 0x80000000, 0x80000000, SZ_2G, 0);
// map_l1_section(ttb, 0x80000000, 0x80000000, SZ_1M * 32, F1C100S_CACHE_WRITE_BACK);
map_l1_section(ttb, 0x80000000, 0x80000000, SZ_1M * 32, F1C100S_CACHE_WRITE_THROUGH);
arm32_ttb_set((uint32_t)(ttb));// 写入页表地址
arm32_tlb_invalidate();
arm32_domain_set(0x1);// 设置域不进行权限检查
arm32_mmu_enable();
arm32_icache_enable();
arm32_dcache_enable();
}
----------------------------------------------------------------------------------
音频NDMA 通道0
连续模式
然后在1ms定时器里面判断半满、全满中断
然后将要播放的音频数据丢进去做缓冲,
写入数据前加上sysFlushCache(D_CACHE);
----------------------------------------------------------------------------------
case D_CACHE:
sys_flush_and_clean_dcache();
__asm
{
/*----- flush D-cache & write buffer -----*/
MOV temp, 0x0
MCR p15, 0, temp, c7, c10, 4 /* drain write buffer */
}
sys_flush_and_clean_dcache
tci_loop
MRC p15, 0, r15, c7, c14, 3 ; test clean and invalidate
BNE tci_loop
BX r14
END
一切正常
----------------------------------------------------------------------------------
后来串口数量多了,数据量大了,想加上串口dma
串口NDMA 通道2
连续模式
也是开启了半满、全满中断
在读dma数据前,调用了sysInvalidCache();
单独使用串口dma,是正常的,一起用的话,音频的播放就有问题了
会有不正常的卡顿,请问怎么处理?
----------------------------------------------------------------------------------
VOID sysInvalidCache(void)
{
int temp;
__asm
{
MOV temp, 0x0
MCR p15, 0, temp, c7, c7, 0 /* invalidate I and D cache */
}
}
----------------------------------------------------------------------------------
最近编辑记录 hpxzw520 (2024-02-23 16:28:55)
离线
参考rtthread代码,只清指定地址cache
离线
参考rtthread代码,只清指定地址cache
谢谢,不过我有点迷糊,能不能给个传送门,我看看
rt-thread没接触过~
离线
参考rtthread代码,只清指定地址cache
哥们,有个链接吗,我找到几个rtthread,
arm32.h文件只是这样的
uint32_t arm32_read_p15_c1(void);
void arm32_write_p15_c1(uint32_t value);
void arm32_mmu_enable(void);
void arm32_mmu_disable(void);
void arm32_dcache_enable(void);
void arm32_dcache_disable(void);
void arm32_icache_enable(void);
void arm32_icache_disable(void);
void arm32_ttb_set(uint32_t base);
void arm32_domain_set(uint32_t domain);
void arm32_tlb_invalidate(void);
uint32_t arm32_read_p15_c0(uint32_t ld);
离线